TTS voice.id: a UUID or a voi_ library id? What Sume accepts
Sume TTS voice.id takes a voice UUID or a voi_ library id. Any other shape fails with 400 invalid_voice_id before a job is queued or credits are reserved.

Sume TTS voice.id accepts two shapes: a TTS voice UUID (8-4-4-4-12 hex characters) or a Voices library id, which is voi_ followed by 32 hex characters. Any other string is rejected at once with 400 and public_reason=invalid_voice_id, before a job is queued or credits are reserved. A library id is resolved to its stored TTS voice before the job runs.
What does the check cover?
The OpenAPI description for voice.id says the value must be a TTS voice UUID or a library id, "not a voice name from another TTS ecosystem", and that values of any other shape are rejected synchronously. It also says to copy the id verbatim, or to send avatar_id or avatar_handle and let Sume resolve the voice.
The check is on shape. It tells you that a string looks like an id, not that the id exists in your workspace, so a well-formed id you copied from somewhere else can still fail later.
| Value you send | Shape | Outcome |
|---|---|---|
db6b0ed5-d5d3-463d-ae85-518a07d3c2b4 | UUID, 8-4-4-4-12 hex | Accepted by the shape check |
voi_ plus 32 hex characters | Voices library id | Accepted, resolved to the stored TTS voice |
Skylar or Rachel | A voice name | 400 invalid_voice_id, nothing queued or reserved |
voi_123 | Wrong length | 400 invalid_voice_id |
Is a UUID from another vendor's page a Sume voice?
Do not assume so. Cartesia's Sonic 3.6 page (read 2026-10-02) lists featured voices by name with a UUID each, such as Skylar and Daniel. That UUID has the right shape for Sume's check, but the page does not say those voices are available in a Sume workspace, and the Sume reference does not either. Take ids from your own workspace, not from a vendor listing.
The reliable route is the avatar one: when an avatar's voice.status is ready, send its handle and skip the id.
What if I send both an avatar and a voice id?
They must agree. When voice.id comes with an avatar reference, it has to equal the avatar's resolved TTS voice id, or the request fails with 400. voice.mode has one value, id, and it is the default, so you can leave it out.
curl -X POST https://api.sume.com/v1/tts-1.0/generate \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: voice-id-001" \
-d '{
"transcript": "Checking the voice id.",
"voice": { "id": "'"$SUME_VOICE_ID"'" },
"language": "en"
}'Sources
Related posts
More in Developers
- TTS word timestamps to Timeline slide starts in Python
Call the Sume TTS Router with word timestamps, find the word that opens each slide, and build the Timeline video array of start times in a short Python script.
- TypeScript 7: an exhaustive switch over Sume job statuses
Turn a Sume job record into done, failed, canceled or running with a never check, so a new status breaks the build. Compiled with tsc 7.0.2 in strict mode.
- Bulk run says completed but UGC variants failed: read counts
A Sume bulk queue is completed once every item is terminal, not once every item succeeds. Read counts.failed and each item's status before shipping.
- One bad item in a 100-variant bulk run: 400 and nothing runs
A Sume bulk run checks every item before it creates the queue. One bad row returns 400 invalid_request with details.index, and none of the 100 videos start.
Written by Sume