Sume TTS Router voices: the sonic and eleven families
GET /v1/tts-router/voices lists voices for one family, sonic or eleven. A model speaks only with voices from its own family, so pick the model first.

The voice list depends on the model's family. In the repo, GET /v1/tts-router/voices returns the voices that one family can speak with, and the wire names are sonic and eleven, not provider names. Every Cartesia row (sonic-3.6 and its siblings) is the sonic family; every ElevenLabs row (eleven-v4 and its siblings) is the eleven family. Choose the model, read its voice_family from GET /v1/tts-router/models, then list voices for that family.
Source: apps/api/src/tts-router/voices.ts and packages/api-contract/src/tts-router-models.ts on origin/main b28f3b0, read 2026-10-13.
| Item | sonic | eleven |
|---|---|---|
| Models | sonic-3.6, sonic-3.5, sonic-3, sonic-latest, sonic-preview, sonic-2, sonic-turbo | eleven-v4, eleven-v4-turbo, eleven-v3, eleven-multilingual-v2, eleven-turbo-v2.5 |
| Listed voices | Public voice library only; your clones are reached through the Voices library (voi_*) | Live ElevenLabs list when configured; otherwise the premade catalog |
| List cache | 10 minutes | 10 minutes |
| If unavailable | An error that names the family | An error that names the family |
Why can I not see my cloned voice in that list?
The code comment is explicit: the Sonic list is the public library (is_public) only, because the provider key also owns every customer's clones, and those are never listed. A workspace reaches its own clones through the Voices library, with ids that start voi_. Use voice.id with that id, or an avatar selector, on a Sonic row.
How do I call it?
Pass the family as a query parameter.
curl "https://api.sume.com/v1/tts-router/voices?family=sonic" \
-H "Authorization: Bearer $SUME_API_KEY"Sources
Related posts
More in Developers
- Sume webhook Send test vs Redeliver: only one replays a real job
Send test posts a dummy webhook.test payload to a URL you type. Redeliver re-sends the real terminal event for one job with a fresh signature. Do not swap them.
- Sume rejects localhost webhook URLs: test locally with a poll fallback
Sume only accepts public HTTPS webhook URLs and rejects localhost and private networks. For local work, poll the job and keep webhooks for a deployed endpoint.
- Tokio JoinSet and Semaphore: eight Sume clips, abort on a 402
Run Sume video jobs from Rust with reqwest, a Tokio Semaphore, and a JoinSet that collects clips as they finish and calls abort_all on a 402.
- TTS language en-US vs en-GB on Sume: regional tags compare by language
For the voice-language check, Sume compares regional tags by primary language, so en-GB on an en-US voice does not trigger the 409, and fil matches tl.
Written by Sume