Voice Cloning API
Voice cloning creates a synthetic version of a specific voice from a short sample, then synthesizes any text in that voice. It is part of the Build API: you create a voice, get an ID, and use it on the same speech endpoints as any catalog voice.
Cloning happens in two legs. The consent leg proves the speaker agreed: a challenge phrase, read aloud, recorded. The cloning leg, this page, turns the sample plus that proof into a voice. The Consent page covers the first leg in full - the challenge lifecycle, the recording rules, and every verification refusal - and the sequence diagram shows how the two calls fit together.
consent_challenge_id and consent_recording are required fields, and the recording is retained as the consent record for the voice.The previous cloning flow is deprecated and will be switched off; the date will be announced in the changelog ahead of time. If your integration sends a consent form field (a JSON string with fullName and email) to POST /v1/voices, migrate to the consent-challenge flow on this page and re-pin Speechify-Version: 2026-09-13. Existing cloned voices are unaffected and keep working. Blocked or need more time? Contact support and we will work out an extension for your workspace.
Prepare a sample
Record 10-30 seconds of clean speech, under a minute and under 5MB, with no background noise. Sample quality is the biggest factor in the result.
Complete the consent leg
Create a consent challenge when your speaker is ready to record, show them the returned phrase exactly as it comes back, and record them reading it aloud:
Keep the challenge id and the recording. The challenge is single use and expires at expires_at, and challenge creation is rate limited more tightly than the rest of the voice surface - the Consent page has the lifecycle, the recording rules, and the rate-limit behaviour in full.
Create the voice
Send the sample, the recording, and the challenge id to POST /v1/voices as multipart form data:
The response is the created voice; its id is what you pass as voice_id when synthesizing. Send an Idempotency-Key header on the create so a retry of a create that completed but whose response was lost replays the stored result instead of consuming a fresh challenge.
Required fields
When verification fails
A create refused on consent grounds returns a consent_* error code, and three of them share 422, so branch on the code rather than the status. Every code, what it means, and the fix is in When verification fails on the Consent page. One rule to build around: a refused create still spends the challenge, so every retry starts with a new challenge and a new phrase.
Versioning
This flow ships on Speechify-Version: 2026-09-13; it is callable now by pinning that version, and it becomes the default for new workspaces on that date. Workspaces pinned to earlier versions get the previous shape, where POST /v1/voices instead takes a consent form field (a JSON string with fullName and email) and no challenge. That flow is deprecated as of 13 August 2026 and will be switched off on a date announced in the changelog, deliberately sooner than the standard 12-month sunset because the unverified flow is a safety liability rather than just an old shape. A pinned default never moves on its own, so migrating means re-pinning 2026-09-13.
Model support
Cloned voices run self-serve on simba-3.0, simba-english and simba-multilingual. Use simba-multilingual to speak a cloned voice across 30+ languages from one voice ID.
simba-3.2 also serves cloned voices, currently as a limited release enabled per workspace — contact Speechify to have it enabled. Each voice’s models array in GET /v1/voices reflects what your workspace can actually synthesize, so branch on that rather than assuming. simba-3.2 is English only: a cloned voice with a non-English locale returns 400 there.