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.

4 min readSume
All posts

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.

From OpenRouter's guide and Sume's docs, read 2026-10-01.
AreaOpenRouterSume
Dedicated list/api/v1/videos/models/v1/videos/models (no /api segment)
Filter on general listoutput_modalities=video on the Models APINot documented for video; use the dedicated list or /v1/catalog
Model idorg/slug, for example google/veo-3.1Bare catalog ids, for example seedance-2
AuthOpenRouter keyAuthorization: Bearer $SUME_API_KEY
Generate-time autoNonemodel: "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

All Developers posts

Written by Sume