Music API 400 model_not_found: fix an unknown model id
An unknown model on POST /v1/music-router/generate fails with 400 model_not_found and a catalog_url. Use an id from GET /v1/music-router/models or omit model.

A 400 model_not_found from POST /v1/music-router/generate means the model value is not a routable catalog id. The response includes a catalog_url; fix it by sending one of the listed ids or by omitting model, which routes to sume/music-auto.
Which ids are valid?
From the Music Router docs, read 2026-09-30:
| Value | Result |
|---|---|
| Omitted | Routes as sume/music-auto |
sume/music-auto | Sume picks the engine (Lyria 3.5 today) |
lyria-3.5 | Passes through to that engine |
lyria-3-pro | Passes through to that engine |
| Anything else, such as a misspelled id | 400 model_not_found plus catalog_url |
What should I check first?
Compare your string with the catalog character by character, including the dot in lyria-3.5. Then call GET /v1/music-router/models and use an id it returns; do not send a Google preview id you saw elsewhere, since only catalog ids are accepted.
Is this the same as other 400s on music?
No. A non-empty negative_prompt is a separate 400 with public_reason=negative_prompt_unsupported, and duration or duration_seconds are rejected as unrecognized fields. A model_not_found is only about the id.
What does a corrected request look like?
Send an id from the catalog, or drop the field. This one passes through to lyria-3.5.
curl -X POST https://api.sume.com/v1/music-router/generate \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: music-router-002" \
-d '{"model": "lyria-3.5", "prompt": "Calm piano, 60 BPM, A minor. Instrumental, no vocals."}'How do I submit the job and fetch the track?
A music request takes mode async, sync, subscribe or webhook. With sync or subscribe, wait_timeout_seconds is 0 to 30; with webhook, webhook_url must be a public HTTPS callback. Send an Idempotency-Key on the submit, then poll GET /v1/jobs/{job_id}/status and read GET /v1/jobs/{job_id}/result. The audio is the entry in result.artifacts[] where type is audio, hosted on media.sume.com; raw provider URLs are not public outputs. A corrected request uses the same fields; only model changes.
The prompt is 1 to 5000 characters. Put exclusions in the positive prompt ("Instrumental, no vocals"), because a non-empty negative_prompt is refused. Full field list: Music Router docs.
Sources
Related posts
More in Developers
- n8n Wait node under 65 seconds: how to poll a Sume job
n8n keeps waits under 65 seconds in memory and saves longer ones to the database. Poll a Sume job with next_poll_after_seconds, or switch to a webhook resume.
- 429 backoff with jitter in Python: OpenAI's advice, Sume's headers
OpenAI recommends exponential backoff with random jitter on 429. A Python status poller that honors Sume's retry-after first and falls back to backoff.
- OpenAI Agents SDK MCPServerManager with a Sume server
Run Sume next to another MCP server in the OpenAI Agents Python SDK: connect Sume over streamable HTTP, check it with mcp_health, and read tools_list.
- OpenRouter video provider.options on Sume: rejected, not dropped
OpenRouter lists provider passthrough configuration. Sume v1 runs one backend per model, so a non-empty provider.options returns 400 unsupported_parameter.
Written by Sume