Sume TTS 409 tts_voice_language_mismatch: confirm and retry safely
A Sume TTS 409 means the voice's language differs from your request. Nothing was charged. Ask the user, then retry with confirm_language_mismatch true.

A 409 tts_voice_language_mismatch from Sume TTS means the voice you picked is recorded with a different primary language than the language in your request. It happens before a job is created, so nothing is charged. To go ahead, ask the user, then resend the same request with confirm_language_mismatch: true.
Do not change the voice, transcript or language when you retry, and keep the same Idempotency-Key.
What the error carries
The Sume TTS docs say the 409 body includes the facts you need to show a warning.
| Item | Behavior |
|---|---|
| Status and code | HTTP 409 tts_voice_language_mismatch |
| Body fields | voice_id, voice_language, request_language, plus guidance text |
| When | Before the API creates a job or makes a charge |
| Confirm field | confirm_language_mismatch: true in the REST body |
| Matching | Regional tags compare by primary language; fil and tl match |
| Unknown voice metadata | A raw voice id can still be submitted without a warning |
The retry flow
Treat the 409 as a question for a person, not an error to swallow.
- Show the user the voice language and the request language from the body.
- If they correct the language or the voice, send a new request with a new Idempotency-Key.
- If they confirm the mismatch on purpose, such as an English voice reading a Korean brand name, resend the identical request with
confirm_language_mismatch: true. - Never set the confirm flag on the first request. The contract says to omit it initially.
Where the same check shows up
The repo docs say the MCP tts_create tool surfaces this as a non-error warning result with confirmation_required true, instead of an HTTP status, so an agent can ask the user and then continue. The REST route and the tool apply the same rule, so you can build one confirmation screen for both.
Avoiding it
Set language for every non-English transcript. The reference says an omitted language defaults to English at the provider. Choose a voice whose language matches the text, and check that the voice id is one Sume knows: an id of any other shape is a different error, a 400 invalid_voice_id.
In an agent or automation, keep the language next to the voice when you store a voice choice, so a later job does not pair them wrong. The jobs and results guide covers how retries and job ids behave.
Sources
Related posts
More in Developers
- $2.00 balance: one 10-second Omni 1080p job, then a 402
With $2.00 in the wallet, one 10-second Omni 1080p job reserves $1.875. A second identical submit gets 402, not 429: balance and queue are separate.
- TypeScript union for Sume bulk queue items, checked with Deno
Model queue items by status so run_id and error are typed per case: null while queued, null for a child that never started, and an exhaustive switch.
- TypeScript SDK: createVideoGeneration, then poll for 'cancelled'
The @sume-com/sdk video functions return {data, error, response} and never throw. An 18-line loop passes an Idempotency-Key and handles the British spelling.
- unittest the spreadsheet-row to Sume bulk item builder, no network
A pure function that turns a spreadsheet row into a Sume bulk item, with four unittest cases for trimming, price format, a spend cap in range and blank SKUs.
Written by Sume