Python: list Sume video models that accept a video input
A 20-line Python script reads GET /v1/videos/models and prints every model whose supported_input_references include video_url, with its duration range.

To find which Sume video models accept a video input, call GET /v1/videos/models and keep the rows whose supported_input_references include video_url. The script below does it with httpx and prints each id with its duration range and resolutions. It matters because the catalog changes: the docs say limits are per model and that you should read the catalog rather than assume one envelope (Video generation docs, read 2026-10-03).
One caveat shapes how you read the output. A model that lists video_url can use it in different roles. On Seedance 2.x, Wan 3.0 and MiniMax H3 the video is a reference that guides a new generation. On gemini-omni-flash-1.1, higgsfield-genjutsu and h3-max-recast it is the source that gets edited, restyled or recast. The catalog flag tells you a video is accepted; the model's docs tell you what it does with it.
The script
The code wraps the async call in asyncio.run, reads the key from the environment and refuses to run without it. It tolerates null fields because the catalog uses null where a model has no fixed list.
import asyncio
import os
import httpx
async def main() -> None:
key = os.environ.get("SUME_API_KEY")
if not key:
raise SystemExit("set SUME_API_KEY")
async with httpx.AsyncClient(timeout=30) as client:
r = await client.get(
"https://api.sume.com/v1/videos/models",
headers={"Authorization": f"Bearer {key}"},
)
r.raise_for_status()
for m in r.json()["data"]:
refs = m.get("supported_input_references") or []
if "video_url" not in refs:
continue
durations = m.get("supported_durations") or []
span = f"{min(durations)}-{max(durations)}s" if durations else "n/a"
print(m["id"], span, m.get("supported_resolutions"))
asyncio.run(main())What to expect in the output
The docs describe the roles that matter for a person swap, so you can check the script's output against them. They are summarized below from the Video Router and Video generation pages; your live catalog is the authority.
| Model id | Role of the video | Documented duration |
|---|---|---|
seedance-2.5 | Reference that conditions a new clip | 4 to 30 s |
wan-3.0 | Reference | 2 to 30 s |
minimax-h3, minimax-h3-max | Reference (audio and video honored) | 5 to 15 s |
gemini-omni-flash-1.1 | Edit source (video_to_video) | 3 to 10 s; output follows source |
higgsfield-genjutsu | Motion Transfer source, listed only when its provider is configured | 4 to 30 s |
h3-max-recast | Recast source | 5 to 30 s, no shot over 15 s |
Why the catalog beats a hard-coded list
Video model support moves fast, and the pages that describe it are written at a point in time. The Video Router page lists a catalog of twelve ids today, from higgsfield-genjutsu through h3-max-recast, and states that ids not listed in GET /v1/video-router/models are rejected on generate. A hard-coded list in your app is therefore a bug waiting for the next release, whereas the catalog call is one cheap read. The same call also returns pricing_skus, so the script can be extended to print the price basis next to each id.
There are two catalogs and it is worth knowing which you are reading. GET /v1/videos/models is the OpenRouter-shaped list with supported_input_references, supported_resolutions and supported_durations. GET /v1/video-router/models is the legacy Sume envelope with capabilities and billing fields. They share model ids, so a script can use either; the first is easier for the filter above, and the second is where each row's billable_formula lives.
Reading the result responsibly
Because higgsfield-genjutsu is listed only when its provider is configured, a workspace may not see it at all, and a script that expects it should treat absence as normal rather than an error. Likewise seedance-2 and seedance-2-mini are no longer picked by any default or routing preset but stay routable when named, so they can appear in your output even though sume/auto will not choose them.
If your goal is a person swap, filter again on the ids you know are source-editing models and ignore the reference-only ones. A simple approach is an allow-list of h3-max-recast, higgsfield-genjutsu and gemini-omni-flash-1.1, then check each is present in the catalog before you build a UI that offers it.
Making it a daily check
A new video model can appear between releases of your own code. Run the script from a scheduled job, diff its output against yesterday's, and alert when an id appears or a duration range changes. That is cheaper than discovering a change through a 400 on a customer request. For the one-call catalog habit see check the Sume catalog when a new video model launches.
- Store the previous output and compare ids and ranges.
- Treat a missing
higgsfield-genjutsuas configuration, not failure. - Never infer capability from the model name; read the fields.
Sources
Related posts
More in Developers
- Python match on a Sume run status: terminal is not success
A Format run can be terminal as completed, failed, canceled or skipped. A structural match that never treats done as success, with a null-output case.
- Log x-sume-request-id and Idempotency-Key on every call (Python)
A requests response hook that writes one JSON log line per Sume call: x-sume-request-id, idempotency key, error code and rate-limit headers. Tested.
- Does a queue_full 429 charge me? Sume's reservation rules
A Sume 429 queue_full means the workspace has no accepted-job capacity left. The failed admission releases its reservation; retry with the same Idempotency-Key.
- IN_QUEUE or queued? Two status fields on a Sume job, do not mix
GET /v1/jobs/{id}/status returns sume_status and a queue-shaped status that map one to one. Which to poll, and how /v1/videos values differ.
Written by Sume