'Video Router generate requires a catalog model id': the fix
The model must be an id from the catalog or an Auto alias. Provider names, vendor slugs and marketing names fail. List valid ids from /v1/videos/models first.

"Video Router generate requires a catalog model id." means the model value is not in the Video Router catalog and is not one of the Auto aliases (auto-, sume/auto, auto). Sume ids are bare slugs such as seedance-2.5, wan-3.0 or gemini-omni-flash-1.1. A vendor's marketing name, an org/slug pair or a Hugging Face repo name will fail.
What counts as a catalog id
The accepted ids are the entries of the Video Router catalog. On main they include the Seedance 2.x models, kling-3, wan-3.0, grok-imagine-video-1.5, minimax-h3, minimax-h3-max, gemini-omni-flash-1.1, h3-max-recast and higgsfield-genjutsu. The last one is listed only where its provider is configured, so an id can exist in code and still be missing from your catalog response. The Sume docs also point out that the published contract never has a provider-org prefix, which is the first difference from OpenRouter-style ids.
| You send | Result |
|---|---|
| seedance-2.5 | Valid catalog id |
| sume/auto, auto, auto-... | Valid: Auto routing, with its own create rules |
| bytedance/seedance-2.5 or another org/slug form | Not a Sume id: refused with the message above |
| A Hugging Face repo name | Not a Sume id: the catalog field hugging_face_id is null on every video model |
| A marketing name such as Wan 3 | Not a Sume id: use wan-3.0 |
Read the ids instead of typing them
The safest route is to fetch the list and check your string against it before you submit. The snippet uses the documented models endpoint, whose data array has an id on every entry. It prints close matches when your string is not valid, and it never prints the key.
import difflib
import os
import requests
wanted = "wan-3"
hdr = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"]}
r = requests.get("https://api.sume.com/v1/videos/models", headers=hdr, timeout=30)
r.raise_for_status()
ids = [m["id"] for m in r.json()["data"]]
if wanted in ids:
print("valid:", wanted)
else:
print("not a catalog id; closest:", difflib.get_close_matches(wanted, ids, n=3))
Auto is a separate path
If you do not want to pin a model, send sume/auto. On Video Router the Auto aliases skip the catalog check and use the Auto create shape instead, which is where frame_images and input_references are allowed. The Sume docs say Auto resolves from the normalized request and does not disclose which family served it, so do not try to infer the model from the output.
Limits and a caution
A catalog id is only the first gate. Each model then applies its own rules for duration, resolution, frames and references, and those are different for each model. Keep the id list fresh instead of hard-coding it: models are added and a provider-gated id may appear or disappear. For a single model's fields, read its entry from the catalog before you build the request.
A practical habit is to load the list once at start-up, store it with a timestamp and refuse any model string that is not in it, with an error message that names the nearest valid ids. That moves the failure from a user-facing 400 into your own validation, where you can show a helpful correction. It also stops a typo from silently rerouting a job if you later add a default fallback model.
Sources
Related posts
More in Developers
- wait_timeout_seconds 30 is not a 30-second video
The 30 in wait_timeout_seconds is how long your HTTP request may block, not how long a clip may run. A 30-second video job still needs a poll or webhook.
- waitForJob timeout in the Sume TypeScript SDK: keep the job id
waitForJob waits 20 minutes by default and throws SumeJobTimeoutError without cancelling the render. Catch it, store jobId, and resume later. Sume SDK 0.2.0.
- Wan 3.0 for 30 seconds in Node: submit, poll, save the MP4
A runnable Node 18+ script for Sume's /v1/videos: submit wan-3.0 at 30 seconds, poll with a deadline, stream the MP4 to disk. Price: $1.88 at 480p.
- Wan 3.0 on Alibaba: 300 requests a minute across all regions, planned
Alibaba caps Wan 3.0 at 300 requests per minute across all six regions, so a region switch does not add headroom. How to plan a batch of 30 s jobs.
Written by Sume