TTS Router 400 unknown model: which Sonic ids does Sume accept?
POST /v1/tts-router/generate needs a catalog model id; an unknown one returns 400 with catalog_url. Seed ids: sonic-3.6, 3.5, 3, latest, preview. Curl inside.

POST /v1/tts-router/generate requires a model from its catalog. An id it does not know returns 400 with a catalog_url pointing at /v1/tts-router/models. The seed catalog is Cartesia Sonic only: sonic-3.6, sonic-3.5, sonic-3, sonic-latest and sonic-preview. Read the list instead of guessing.
What each id means
sonic-latest is an alias that resolves to sonic-3.6. sonic-preview is a beta channel whose output and availability can change without notice, and it rejects professional voice clones with voice_model_mismatch. TTS Router v1 does not include other vendors' families. Later vendors would arrive as new catalog rows on the same surface.
Request shape
Send model, exactly one of transcript or transcript_source, and one voice selector. The voice selector is the same as in TTS 1.0: top-level avatar_id or avatar_handle, or voice.id. Transcript text follows TTS 1.0 limits of 1 to 20000 characters. The router does not have its own voice namespace.
The response is an async job, so you poll the shared GET /v1/jobs/:id/status and /result routes as for other products.
curl https://api.sume.com/v1/tts-router/models \
-H "Authorization: Bearer $SUME_API_KEY"
curl -X POST https://api.sume.com/v1/tts-router/generate \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: tts-demo-001" \
-d '{"model":"sonic-3.6","transcript":"Hello from Sume.","avatar_handle":"YOUR_HANDLE"}'TTS 1.0 versus the router
Do not send model to POST /v1/tts-1.0/generate. That route always uses sume/tts-1.0 and returns 400 if you pass model or model_id. The engine picker lives only on the router. job.model on the router echoes the id you requested, and job.provider stays sume.
Billing
Billing uses the same admit, reserve and capture path as TTS 1.0. Each catalog row is character-metered at Cartesia list price times 1.25, rounded up to cents. Read the numbers from GET /v1/tts-router/models rather than copying them, because the catalog publishes the margin that the reserve really charges.
Related posts
More in Developers
- Korean TTS segment text has no spaces, unless a digit is in it
Sume's TTS segment text joins tokens with spaces only if one has a Latin letter or digit; else with nothing. Use segments for timing, your script for text.
- TTS sentence slices: mp3 gives timings only, wav gives audio_urls
Sume TTS segmentation returns sentence timings for any container, but slice audio_urls only with wav or raw. Request shape, the 70 ms rule and when to pick wav.
- Pipes and @{} markers in a Sume TTS transcript: stripped, never spoken
Sume strips || cue breaks, @{...} markers and the display side of <display|spoken> before the voice reads; an empty result returns 400 transcript_no_speech.
- TTS with only an API key: list avatars and pick one with voice ready
You do not need a voice id for Sume TTS. List your avatars, pick one whose voice status is ready, and send its handle as avatar_handle. Python example.
Written by Sume