'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.

4 min readSume
All posts

"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.

Model strings and how Video Router treats them, from the schema and docs on main (read 2026-10-05)
You sendResult
seedance-2.5Valid catalog id
sume/auto, auto, auto-...Valid: Auto routing, with its own create rules
bytedance/seedance-2.5 or another org/slug formNot a Sume id: refused with the message above
A Hugging Face repo nameNot a Sume id: the catalog field hugging_face_id is null on every video model
A marketing name such as Wan 3Not 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

All Developers posts

Written by Sume