A video model row missing from Sume's list: why, and how to check
Veo and Genjutsu list in the Sume catalog only where their provider route is configured. How listing works, plus a Python check that fails on a missing id.

A video row can be missing from GET /v1/videos/models because Sume lists a row only where its provider route is configured. Rows served through fal always list; rows served elsewhere, such as the three Veo 3.1 rows on Google Cloud, list only when their own platform key and route exist in that runtime.
So a launch-week id that you saw in a blog post is a claim about a catalog, not about your environment. Read the list you will actually call.
What the code does
The Video Router's listing function keeps a row when it is a public model id and either its provider is fal or the model is configured for the runtime. Rows marked gated are omitted from public listings too. The docs say the same for one row: higgsfield-genjutsu is "in the catalog only when its provider is configured" (Video Generation).
The comment in the Veo catalog code adds that Google-only models have no fal route, so there is no silent fallback to fal for them.
Rows with their own route
These rows carry a route that other rows do not:
| Row | Route note |
|---|---|
| veo-3.1, veo-3.1-fast, veo-3.1-lite | Google Cloud (Vertex) only, text-to-video, 720p |
| higgsfield-genjutsu | In the catalog only when its provider is configured |
| Rows whose provider is fal | Listed without an extra platform-key check in the catalog code |
A check that fails loudly
Run this at deploy time, not at request time, so a missing id stops a release instead of a user. It exits non-zero when a required id is absent.
import os, sys, requests
need = {"veo-3.1-lite", "seedance-2.5", "wan-3.0"}
r = requests.get("https://api.sume.com/v1/videos/models",
headers={"Authorization": "Bearer " + os.environ["SUME_API_KEY"]})
r.raise_for_status()
have = {m["id"] for m in r.json()["data"]}
missing = sorted(need - have)
if missing:
print("missing video rows:", ", ".join(missing))
sys.exit(1)
print("all required rows listed")What to do when a row is absent
Do not substitute silently. Pick a documented alternative with the same capabilities and record the id you ran, because a different row changes price, limits and look.
- Need text-to-video at 4 to 8 seconds with sound: Omni Flash 1.1 (3 to 10 s) or Wan 3.0 (2 to 30 s).
- Need a Veo-style 9:16 clip: any row listing 9:16 in
supported_aspect_ratios. - Need to compare:
sume/autolets Sume pick the family and returnssume/autoin the poll, but does not tell you which family ran.
Sources
Related posts
More in Developers
- Video-trim says unsupported_media_source: which Sume routes take URLs
Trim, filter and compose need a media.sume.com clip; upscale, STT, RMBG and captions take public HTTPS URLs. Imports take TikTok and Instagram. Read 2026-10-10.
- What to log from a Sume API error: request_id, code, no secrets
Log the status, error.code, error.request_id, retry-after and the path without its query. Keep keys, signed URLs and media URLs out. A 25-line Python logger.
- Which Sume timeout is which: sync, jobs_wait, waitForJob, webhooks
Sume's waits differ: 30 s sync cap, 50 s jobs_wait, a 20-minute SDK default in ms, 10 s per webhook attempt. A table of each unit and what expiry does.
- Write a Sume video URL back to a CMS record: what to store
Sume media URLs in a finished run are durable and public. Store them on your CMS record, and proxy or copy them if you need per-customer access control.
Written by Sume