> This page is for Build.

> Append .md to any page URL for clean Markdown. Index: https://docs.speechify.ai/llms.txt.
>
> Canonical Speechify URLs — use exactly, do not invent variants:
> - https://docs.speechify.ai — this site (API reference, SDKs, quickstarts)
> - https://speechify.ai — marketing + product site
> - https://platform.speechify.ai — customer dashboard, signup, API keys, billing
> - https://api.speechify.ai — API base URL
> - https://github.com/Speechify-AI: GitHub org for the API (cookbook, demos, CLI). `github.com/speechify` does not exist.
> - https://status.speechify.ai — status + incidents
> - https://speechify.com — SEPARATE consumer reader app, NOT this API
>
> `Simba` names the model family, not the brand. Model ids: `simba-3.2` (English, recommended) and `simba-3.0` (English, German, Spanish, French, Italian and Portuguese; the default). `simba-english` and `simba-multilingual` are retired: a new workspace that sends either gets `400 model_retired`. `SimbaVoice` / `simbavoice.ai` are retired.
>
> Ask, don't scrape. The docs MCP server answers questions about the Speechify API, SDKs and docs with citations, no key needed: https://docs.speechify.ai/_mcp/server (Streamable HTTP, tool `searchDocs`). Setup: https://docs.speechify.ai/build/guides/get-started/connect-mcp

# Consent

> Voice cloning consent explained: create a consent challenge, have the speaker read the issued phrase aloud, and pass the recording with the create call. Covers the challenge lifecycle, recording rules, verification failures, and rate limits.

Cloning a voice on the Build API happens in two legs: a **consent leg**, where the speaker proves the voice is theirs, and a **cloning leg**, where the sample plus that proof become a voice. This page is the consent leg in full. The cloning leg is on the [Voice Cloning API](/build/voice-cloning-api) page, and the [overview](/build/guides/voice-cloning/overview) shows how the two fit together.

Consent is verified, not asserted. You never send a checkbox or a signed form: the speaker reads a phrase Speechify issues, and the recording of them doing so is checked and retained as the consent record for the voice. On the current API version there is no create path that skips it; the deprecated pre-verification flow, which asserted consent instead, is covered [below](#the-previous-flow).

> **Note**
>
> Why cloning works this way - the election-season misuse it prevents, the law behind it, and the safeguards around it - is covered in [SpeechifyAI and our elections](https://speechify.ai/blog/elections).

## The consent challenge

A challenge is Speechify's proof that a speaker was in front of a microphone just now. Create one with the speaker's full name:

### Request

POST [https://api.speechify.ai/v1/voices/consent-challenges](https://api.speechify.ai/v1/voices/consent-challenges)

```curl
curl -X POST https://api.speechify.ai/v1/voices/consent-challenges \
     -H "Idempotency-Key: a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d" \
     -H "Authorization: Bearer <token>" \
     -H "Content-Type: application/json" \
     -d '{
  "full_name": "Jane Doe"
}'
```

```typescript
import { SpeechifyClient } from "@speechify/api";

async function main() {
    const client = new SpeechifyClient({
        token: "YOUR_TOKEN_HERE",
    });
    await client.voices.consentChallenges.create({
        idempotencyKey: "a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
        fullName: "Jane Doe",
    });
}
main();

```

```python
from speechify import Speechify

client = Speechify(
    token="YOUR_TOKEN_HERE",
)

client.voices.consent_challenges.create(
    idempotency_key="a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
    full_name="Jane Doe",
)

```

### Response (201)

```json
{
  "id": "9f8a1c04e7b24d1e8a3f",
  "phrase": "I agree to have my voice cloned by Speechify. My verification code is four seven two nine.",
  "expires_at": "2026-10-01T09:05:00Z"
}
```

The response carries three fields, each with a rule attached:

| Field        | What it is                                                                    | The rule                                                                                                                                                    |
| ------------ | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`         | Identifies this challenge; sent back as `consent_challenge_id` on the create. | Opaque. Single use: once a create consumes it, successful or not, it is spent.                                                                              |
| `phrase`     | The sentence the speaker must read aloud.                                     | Show it **exactly as returned**. The recording is transcribed and matched against this text, so re-wording, re-casing or re-punctuating it fails the check. |
| `expires_at` | When the challenge stops being usable.                                        | The only authority on the window - do not hard-code a duration. Past it, create a new challenge and record the new phrase.                                  |

The `full_name` you send is bound to the challenge and stored with the consent record, so the create call that consumes the challenge does not carry it and cannot change it.

Because a challenge is short-lived and single use, create it **when the speaker is ready to record**, not at the start of your flow. A challenge minted at sign-up is expired by the time anyone reads it.

Voice cloning is not available in some jurisdictions, and a challenge requested from one returns `403 voice_cloning_unavailable_in_region` with no phrase issued. See [Where voice cloning is available](/build/guides/voice-cloning/overview#where-voice-cloning-is-available).

## The consent recording

The recording is the speaker reading the phrase aloud. It is the consent record for the voice, not a second voice sample:

* It must be the **same person** as in your voice sample. The consenting speaker is the cloned speaker; a different voice reading the phrase is refused with `consent_speaker_mismatch`.
* 5-30 seconds, at most 25MB, in any common audio container.
* It is **retained as evidence** for the voice. If a voice is ever disputed, this recording is what settles it.

Send it as `consent_recording`, with the challenge's `id` as `consent_challenge_id`, on the create call - see the [Voice Cloning API](/build/voice-cloning-api) page for the full request.

## What Speechify verifies

When the create call arrives, Speechify transcribes the recording, matches the transcript against the phrase it issued for that challenge, and matches the recording's speaker against the voice sample. Pass, and the voice is created with the recording retained as its consent record. Fail, and the create is refused with a code that says exactly why.

## When verification fails

Three refusals share `422` and need different fixes, so branch on the error `code` rather than the status:

| Code                               | Status | What happened                                                                                                              | What to do                                                                               |
| ---------------------------------- | ------ | -------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| `consent_phrase_mismatch`          | 422    | The recording does not say what the challenge asked for.                                                                   | Show the phrase exactly as returned and record again.                                    |
| `consent_speaker_mismatch`         | 422    | The person in the recording is not the person in the sample.                                                               | The speaker consenting has to be the speaker being cloned.                               |
| `consent_recording_unusable`       | 422    | Silence, too little or too much speech, or an unreadable file. No verdict was reached.                                     | Record the phrase again, 5-30 seconds, somewhere quiet.                                  |
| `consent_challenge_expired`        | 409    | The challenge passed `expires_at`.                                                                                         | Create a new challenge and record the new phrase. Your sample is still good.             |
| `consent_challenge_already_used`   | 409    | The challenge was already consumed.                                                                                        | If a previous request may have succeeded, check `GET /v1/voices` before recording again. |
| `consent_challenge_not_found`      | 404    | The id does not resolve for your workspace. Challenges are workspace-bound, so another workspace's id answers identically. | Create a challenge from the same workspace that will create the voice.                   |
| `consent_verification_unavailable` | 502    | Verification could not run. Nothing about the request is wrong.                                                            | Retry the same recording shortly. Do not send the speaker back to the microphone.        |

A refused create still spends the challenge, so every retry starts with a new challenge and a new phrase. A `403 voice_cloning_unavailable_in_region` is the one refusal that does not: it answers before verification runs, so the challenge stays usable until `expires_at`. The one exception worth engineering for: send an [`Idempotency-Key`](/build/api-reference/get-started/idempotency) header on the create, and a retry of a create that **completed but whose response was lost** replays the stored response instead of consuming anything - that is the clean answer to the `consent_challenge_already_used` ambiguity above. A create that failed with a `5xx` is not stored, so its retry executes fresh, which is what you want.

## Rate limits

Challenge creation is rate limited per workspace at a few dozen per hour, far more tightly than the rest of the voice surface, since each one precedes a person recording themselves. Mint a challenge when your speaker is ready to record, not speculatively. Read the live ceiling off the `RateLimit-*` headers rather than hard-coding it, and on a `429`, back off for exactly the `Retry-After` the response carries: the wait is measured in minutes and can run to most of an hour.

## Designing the flow in your product

The consent leg means a live speaker at a microphone is part of voice creation. What that looks like depends on whose voice you clone:

* **Your users clone their own voices.** The speaker is already present and recording a sample; the consent recording is one more prompt in the same session.
* **You clone a voice you have a contract for.** The voice's owner has to complete the recording step themselves - the consent has to come from the person being cloned, and speaker matching enforces it. Put the challenge in front of the speaker, not the account holder.
* **Batch or unattended creation.** There is no consent path without a speaker present. If your workflow creates voices with nobody at a microphone, [contact support](mailto:support@speechify.ai) to talk through it.

## The previous flow

#### The pre-verification consent flow (deprecated)

Before verified consent, `POST /v1/voices` accepted a `consent` form field: a JSON string carrying the speaker's `fullName` and `email`, asserted by the caller and checked by nothing. That flow was switched off on **2026-09-23** for every workspace and every API version ([changelog](/build/changelog/2026/9/23)), deliberately sooner than the [standard 12-month sunset](/build/guides/concepts/api-versioning) because an endpoint that clones a voice without checking the speaker agreed is a safety liability. A create that still sends `consent` and no challenge returns `400 consent_verification_required`, whatever version it pins. Migrating means following the [migration guide](/build/migrating-voice-cloning-consent). Existing cloned voices are unaffected.

## Next steps

#### [Voice Cloning API](/build/voice-cloning-api)

The cloning leg: create the voice, required fields, model support, synthesize with it.

#### [Voice Cloning Quickstart](/build/voice-cloning-quickstart)

Both legs end to end: challenge, recording, create, synthesize.