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.

5 min readSume
All posts

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.

TTS Router model ids accepted by the generate schema, Sume spec read 2026-10-04
model valueNote
sonic-3.6Newest pinned Sonic in the schema
sonic-3.5Previous pinned version
sonic-3Earlier pinned version
sonic-latestAlias, so the audio can change when the alias moves
sonic-previewPreview 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

All Developers posts

Written by Sume