OpenRouter output_modalities=video vs Sume /v1/videos/models
OpenRouter lists video models three ways. Sume has a /v1/videos/models endpoint with the same shape plus a catalog. Fields to read before you submit.

OpenRouter documents three ways to find its video models: a dedicated GET https://openrouter.ai/api/v1/videos/models endpoint, the standard Models API with output_modalities=video, and a filter on its web models page. Sume follows the first one: GET https://api.sume.com/v1/videos/models returns a data array with the same capability fields, and GET https://api.sume.com/v1/catalog is the wider public model catalog. If your code already lists OpenRouter video models, the change is the base path and key.
Both facts were read on 2026-10-01 from OpenRouter's video generation guide and Sume's Video Generation docs.
What is the same and what is different?
Sume's docs state that everything on the /v1/videos route matches the OpenRouter Video Generation API except a short list of deltas. For discovery, the deltas are the base path, the key, and the id format.
| Area | OpenRouter | Sume |
|---|---|---|
| Dedicated list | /api/v1/videos/models | /v1/videos/models (no /api segment) |
| Filter on general list | output_modalities=video on the Models API | Not documented for video; use the dedicated list or /v1/catalog |
| Model id | org/slug, for example google/veo-3.1 | Bare catalog ids, for example seedance-2 |
| Auth | OpenRouter key | Authorization: Bearer $SUME_API_KEY |
| Generate-time auto | None | model: "sume/auto" |
Which fields should you read before submitting?
Each Sume model entry lists supported_resolutions, supported_aspect_ratios, supported_sizes, supported_durations, supported_frame_images, supported_input_references, generate_audio, seed, and pricing_skus. Limits are not uniform, and the docs call out several: seedance-2.5 takes 4 to 30 seconds, wan-3.0 takes 2 to 30, gemini-omni-flash-1.1 takes 3 to 10, and every other catalog model tops out at 15 seconds. Reading the list is cheaper than guessing and getting a 400.
import os, requests
r = requests.get(
"https://api.sume.com/v1/videos/models",
headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
timeout=30,
)
r.raise_for_status()
for m in r.json()["data"]:
d = m["supported_durations"]
print(m["id"], f"{min(d)}-{max(d)}s", m["supported_resolutions"], "seed" if m["seed"] else "no-seed")How should you wire discovery into a pipeline?
Fetch the list at startup or on a short cache, then validate each request against the entry for the model you chose: is the duration in supported_durations, is the resolution in supported_resolutions, does the model accept the reference type you plan to send. Sume's docs say size returns 400 unsupported_parameter because every v1 model reports supported_sizes: null, and a seed is rejected because each model reports seed: false. Both are visible in the list before you spend anything.
If you also use OpenRouter, keep the two catalogs separate in your code. Ids differ (org/slug against bare ids), and a model that exists on one list may not exist on the other. Map ids explicitly rather than stripping prefixes.
Limits
I did not verify that Sume's general model list accepts an output_modalities filter, so the table says it is not documented. The live list changes as models ship or retire, so do not hard-code it; h3-max-recast and higgsfield-genjutsu are described as listed only when their provider is configured.
Sources
Related posts
More in Developers
- OpenRouter video is ZDR-ineligible: what Sume says about retention
OpenRouter says video generation cannot use Zero Data Retention because output is held for retrieval. Sume has no ZDR toggle; what to tell your security team.
- Pace bulk Sume submits with generation_limits, not wave_size_hint
Size in-flight work as concurrency minus active minus queued, capped by queue capacity. A short Node pacer that reads generation_limits from each submit.
- Pin a TTS model id: sonic-latest or sonic-3.6 on Sume
Voice vendors move aliases under you. How sonic-latest and sonic-3.6 behave on the Sume TTS router, and why to send an explicit id in production.
- Poll a Sume bulk-run queue in Python and list items not completed
A short asyncio script that polls GET /v1/format-run-queues/{id} until the queue is completed, prints the counts and lists every item that did not complete.
Written by Sume