Polly takes 3,000 billed characters; Sume TTS takes 20,000
Polly SynthesizeSpeech accepts 3,000 billed characters and cuts audio at 10 minutes. Sume TTS 1.0 accepts 20,000 characters and 1,200 seconds of audio per job.

Amazon Polly's quotas page says a SynthesizeSpeech request takes up to 3,000 billed characters (6,000 total) and that the output stream "is limited to 10 minutes. After this is reached, any remaining speech is cut off." Sume TTS 1.0 takes 1 to 20,000 characters and fails a job over 1,200 seconds of audio with tts_duration_exceeded, with no credit captured, instead of cutting it off.
Polly's numbers are from its quotas page, read 2026-10-01; Sume's from the OpenAPI schema behind the API reference.
What is the difference between billed and total characters?
Polly says SSML tags are not counted as billed characters, which is why 3,000 billed can be 6,000 total with markup. Sume's TTS has a plain transcript, so there is no markup to discount: spaces and punctuation count toward usage, up to 20,000.
How do the limits compare?
Real-time request on Polly against the standard job on Sume.
| Item | Polly SynthesizeSpeech | Sume TTS 1.0 |
|---|---|---|
| Text | 3,000 billed characters (6,000 total) | 20,000 characters |
| Audio length | 10 minutes, then cut off | 1,200 seconds, else tts_duration_exceeded |
| Over the audio limit | Remaining speech is dropped | Job fails, no credit captured |
Which failure mode is safer?
Failing is safer than truncating. A cut-off file looks like a success until someone listens to the end. If you stay on Polly, check the returned audio length against what your text should produce; on Sume, check for the error code instead.
What does a Sume request near the limit look like?
Use async mode and keep a polling or webhook path, since a long job outlasts the 30-second sync wait.
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: chapter-03" \
-d '{
"transcript": "Chapter three begins here.",
"avatar_handle": "@narrator",
"mode": "async"
}'Sources
Related posts
More in Developers
- Postgres 17.11 pgcrypto change: verify a Sume webhook with hmac()
The Postgres minor release changed legacy pgcrypto ciphers. Its listed changes never mention hmac(), so a Sume sume-v1 signature check in SQL still works.
- Punch-in zoom on video by API: crop or zoompan, no keyframes
Sume has no auto zoom switch. Use a crop op for a fixed punch-in or the allowlisted zoompan filter in a video-filter graph; there are no keyframes.
- remove.bg API rate limit: 500 per minute, weighted by megapixels
remove.bg allows 500 images per minute at about 1 MP, less for larger inputs. Sume limits requests per minute per key and sends retry-after on 429.
- remove.bg bg_color replacement: Sume RMBG gives a transparent PNG
remove.bg's API has bg_color and bg_image_url. Sume RMBG 1.0 takes only an image_url and returns a PNG with alpha, so the new background is a second step.
Written by Sume