Polly async needs an S3 bucket; Sume gives a status URL and webhook
Polly's StartSpeechSynthesisTask writes audio to your S3 bucket and can notify an SNS topic. Sume TTS returns a status URL, or a signed webhook on completion.

Amazon Polly's asynchronous synthesis queues your text, then "uploads the resulting speech or speech marks stream directly to your (required) Amazon Simple Storage Service (Amazon S3) bucket" and can tell you through an optional SNS topic. It handles up to 100,000 billable characters. Sume TTS 1.0 needs no bucket: the job returns a status_url and result_url, and a webhook_url gets a signed terminal event.
Polly's behavior is from its long audio files page, read 2026-10-01; Sume's from the OpenAPI schema behind the API reference.
What do you set up on each side?
Polly needs cloud storage and permissions; Sume needs a URL.
| Item | Polly StartSpeechSynthesisTask | Sume TTS 1.0 |
|---|---|---|
| Output location | Your S3 bucket, required | Sume job result |
| Completion signal | Optional SNS topic message | Poll status_url, or signed webhook |
| Text limit | 100,000 billable characters | 20,000 characters |
| Setup | S3 bucket, IAM policy, optional SNS | API key, optional HTTPS callback URL |
What can the Sume webhook do and not do?
Delivery is terminal-only: job.completed, job.failed and job.canceled. There are no progress or partial callbacks, so keep status_url polling as a backup. The callback URL must be public HTTPS; localhost, private-network and non-HTTPS URLs are rejected.
Do I lose anything by dropping the bucket?
The page notes you can keep the Polly output encrypted in S3 with AES-256 under your own bucket policy. A Sume result is hosted by Sume instead. If your rules require the file to land in storage you own, copy it from the result URL after the job completes.
How do I submit with a webhook?
Sending a webhook URL without a mode selects webhook mode.
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: article-9921" \
-d '{
"transcript": "Read this article aloud.",
"avatar_handle": "@narrator",
"webhook_url": "https://example.com/hooks/tts"
}'Sources
Related posts
More in Developers
- Polly speech marks need a separate request; Sume returns timings
Polly returns speech marks instead of audio when you ask for them: sentence, word and viseme metadata. Sume TTS returns words[] timings on the same job result.
- 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.
Written by Sume