List Sume TTS Router models before you hardcode a Sonic id
GET /v1/tts-router/models returns the catalog of pass-through TTS models. Read it at startup instead of pinning an id that may change.

Ask the API which TTS Router models exist instead of copying an id from a blog post. GET /v1/tts-router/models returns the catalog of explicit pass-through TTS models, and GET /v1/tts-router/models/{model_id} returns one entry, or 404 when the id is not in the catalog. At the time of reading, the request schema for generation lists sonic-3.6, sonic-3.5, sonic-3, sonic-latest and sonic-preview.
The router is separate from Sume TTS 1.0. You pick the model in the request body, and the catalog is how you check what that body may contain.
What is in the catalog?
The Sume OpenAPI spec describes the list as a catalog of explicit pass-through TTS models with model-in-body invoke, and says v1 is Sonic only. Pricing is the TTS 1.0 list price with a 1.10 multiplier on the character book.
| model value | Note |
|---|---|
| sonic-3.6 | Newest pinned Sonic in the schema |
| sonic-3.5 | Previous pinned version |
| sonic-3 | Earlier pinned version |
| sonic-latest | Alias, so the audio can change when the alias moves |
| sonic-preview | Preview alias, not for fixed deliverables |
Why not hardcode the id?
Pinned ids give repeatable output, which matters when a client approves a voiceover. Aliases move. If you store the model id with each job you can reproduce or explain an old file. If you read the catalog at startup you can fail early when an id disappears, rather than at 2 a.m. in a batch.
- Pin a numbered id for anything a customer signs off on.
- Use an alias only for drafts and experiments.
- Save the model id in your own records next to the Sume job id.
How do you read it in code?
This prints whatever the catalog returns, without assuming the field names inside each entry:
import json, os, requests
H = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"]}
B = "https://api.sume.com"
r = requests.get(B + "/v1/tts-router/models", headers=H, timeout=30)
r.raise_for_status()
print(json.dumps(r.json(), indent=2)[:2000])
model = os.environ.get("SONIC_MODEL", "sonic-3.6")
one = requests.get(B + f"/v1/tts-router/models/{model}", headers=H, timeout=30)
print(model, one.status_code)
Which model sounds better for you?
The catalog cannot answer that. Run both ids on your own script, as in a blind test of two Sonic versions. For language coverage numbers, read which Sonic 3.6 number to quote.
Sources
Related posts
More in Developers
- Voice replication API audit checklist before you switch
Gemini 3.8 Flash TTS is GA with voice replication and 150+ voices. Before switching providers, audit these items against Sume's live catalog.
- Reuse TTS word timestamps as caption words, skip a second STT
You already know what the voice said and when. Feed the TTS word timings to the caption job as `words` so brand names are never misheard by speech-to-text.
- A "use step" function that submits a Sume job once
Put the Sume submit call inside one "use step" function and derive the Idempotency-Key from a stable run key, so a retried step returns the original job.
- Veo is US-region only: what EU teams call on Sume
A Sept 2026 listing says Veo runs only in us-central1, with no EU region documented. Sume has one video endpoint and its docs state no region.
Written by Sume