TTS request timed out: retry with the same Idempotency-Key
If a Sume TTS request times out, do not post a fresh one. Retry with the same Idempotency-Key and body to get the original job back, with no second charge.

When a Sume TTS request times out on your side, retry it with the same Idempotency-Key and the same body. Sume returns the original job rather than creating and billing a second one. Posting a fresh request without a key is the way to pay twice for the same voiceover.
The key behavior and the polling steps are in the Sume API reference and Jobs and results (read 2026-10-06).
What should the client do?
TTS is an asynchronous job by default. The first response carries status_url and result_url. If your client times out after submitting, keep polling GET /v1/jobs/{id}/status until terminal is true, and read GET /v1/jobs/{id}/result only when the job completed. A failed or canceled job has no result and the result route answers 409 job_not_completed.
- Create one key per intended voiceover, such as
mug-voiceover-001. - Do not reuse a key with a different body.
- Use
mode: "sync"only for a short wait of up to 30 seconds. After that, the response still returns the job's state and you should poll.
What about a webhook?
Webhook mode stores a callback for terminal delivery only (completed, failed, canceled). Keep status polling as a backup, because there are no progress or partial callbacks.
How do I check for a duplicate?
The submit envelope has an idempotency_hit flag. If it is true, the response is the earlier job and no new reservation was made.
Sources
More in Developers
- TTS model list API: read the catalog before you hardcode a Sonic id
Sume's TTS Router lists its models at GET /v1/tts-router/models. Read it, pin sonic-3.6, and treat sonic-preview as a beta channel that can change.
- tts_sentence_selection_invalid 422 on Sume TTS: what triggers it
Sume TTS returns 422 tts_sentence_selection_invalid for gaps, repeated jobs, unfinished jobs and partial coverage. Each cause and its fix.
- tts_source_integrity_mismatch 422: job differs from accepted script
verify-spine returns 422 tts_source_integrity_mismatch when a finished TTS job's text no longer matches the accepted script. What it checks and how to recover.
- tts_source_not_found 404 on Sume TTS: revision, sentence or job
A 404 tts_source_not_found from the Sume script-source API means the revision, a sentence id or a selected job is not visible to this key or thread.
Written by Sume