TTS sentence_ids: max 1,000 per request vs the 20,000-character cap
Sume TTS transcript_source takes 1 to 1,000 sentence ids, but the 20,000-character limit usually binds first: only sentences under 20 characters hit 1,000.

When you send a Sume TTS job by transcript_source, you select between 1 and 1,000 sentence ids. The character limit is still 20,000, so for normal prose the characters run out first: 1,000 sentences would only fit if they averaged 20 characters. The id limit matters mostly for lists of very short lines.
The two limits side by side
transcript_source takes a script_revision_id and sentence_ids. Each id is a bounded ASCII string up to 128 characters, drawn from letters, digits, underscore and hyphen. Ids must be unique and in source order. You send either transcript_source or a literal transcript, never both and never neither.
| Limit | Value | Binds first when |
|---|---|---|
| Sentence ids per request | 1 to 1,000 | Sentences average under 20 characters |
| Characters per request | Up to 20,000 | Normal prose |
| Id length | Up to 128 characters, A-Z a-z 0-9 _ - | Never in practice |
| Text fields | Exactly one of transcript or transcript_source | Both, or none, is an error |
A worked case
A script of 400 sentences averaging 60 characters is 24,000 characters, so it exceeds 20,000 even though it is far below 1,000 ids. Split it into two selections of 200 sentences, about 12,000 characters each. A script of 1,200 menu items averaging 15 characters is 18,000 characters, under the character cap but over the id cap, so it also needs two requests. Pick the split by whichever limit you hit.
{
"transcript_source": {
"script_revision_id": "revision_from_source_manifest",
"sentence_ids": ["s001", "s002", "s003"]
},
"avatar_handle": "speaker",
"language": "en"
}Handling the errors
Over-limit selections fail validation and never reserve credit or queue work, so a too-large request is a cheap mistake. Count before you send: sum the character counts from the manifest for your selected sentences, check they are at or under 20,000, and check the id count is at or under 1,000. If either is over, cut the selection at a sentence boundary and submit the rest as a second request.
Where to get the ids
Read them from GET /v1/tts-1.0/source in the authenticated thread. The manifest gives opaque sentence ids, indexes, character counts and a source hash, so you do not copy script text into the request. Duplicate, unknown or reordered ids are errors and never reserve credit.
Sources
Related posts
More in Developers
- Sume TTS voice.id 400: why 'alloy' fails and a UUID works
Sume TTS voice.id must be a UUID or a voi_ library id, not a voice name. Names borrowed from other vendors return a 400 before any work starts.
- Sume TTS: webhook_url, sync wait or polling? The four modes
Sume TTS jobs take mode async, sync, subscribe or webhook. A webhook needs a public HTTPS webhook_url, and sync waits at most 30 seconds.
- Sume TypeScript SDK createImage: a retired model id fails tsc
Sume's @sume-com/sdk lists accepted image model ids as a string union, so gpt-image-1 fails to compile. Use tsc as the migration checklist.
- TypeScript types for a Sume job status: narrow on sume_status
Type the Sume job envelope as a discriminated union on sume_status, so a switch covers queued to canceled and the compiler flags a missed case. Runs on Node 22.
Written by Sume