GET /v1/video-router/models/wan-3.0: fetch one model's limits
Fetch one Sume video model with GET /v1/video-router/models/{model_id}, such as wan-3.0 or seedance-2.5. Unknown ids return 404. Read limits before you submit.

To read one model's limits on Sume, call GET /v1/video-router/models/{model_id} with the id as the last path segment, for example wan-3.0 or seedance-2.5. The dots belong in the path exactly as written. An id that is not in the catalog returns 404. The list route is GET /v1/video-router/models, and the OpenRouter-shaped list is GET /v1/videos/models.
Reading one row is cheaper than downloading the whole catalog when your code already knows which id it wants.
Which route returns what
Both surfaces describe the same models and create the same jobs. Pick one and stay on it.
| Route | Use it for |
|---|---|
GET /v1/video-router/models | The full catalog with capabilities and list pricing times 1.25 on each row |
GET /v1/video-router/models/{model_id} | One model; 404 if the id is unknown |
GET /v1/videos/models | OpenRouter-shaped list with supported_durations, supported_input_references and more |
POST /v1/videos | Submit a job; new integrations should use this |
A pre-flight check in code
The point of reading the row is to reject a bad request in your own code before it costs a call. This Python check asks for one model and tests duration and resolution against it. It prints the raw row so you can see the field names that your account returns.
import asyncio, os
import httpx
async def main():
headers = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
async with httpx.AsyncClient(base_url="https://api.sume.com", headers=headers) as client:
r = await client.get("/v1/video-router/models/wan-3.0")
if r.status_code == 404:
print("unknown model id")
return
r.raise_for_status()
print(r.json())
asyncio.run(main())Two cautions
First, do not hard-code limits from a blog post. The row is the source of truth and changes when a provider changes. Second, a 404 on a model id is not a transient error, so do not retry it. Fall through to the next id in your ladder or fix the spelling. Ids such as seedance-2.5 and wan-3.0 are exact strings, and wan-3 or seedance-25 will not resolve.
What to read from the row
Pull these fields and cache them for a few minutes at most.
If you serve many users, fetch the row once per process and refresh it on a timer. A catalog read is cheap, but there is no reason to make one before every submit.
Send the bearer key on every call, including catalog reads. Keep it in an environment variable and out of source control, and use a separate key for scripts that only read the catalog so that you can revoke it on its own.
- Allowed durations and the min and max.
- Supported resolutions and aspect ratios.
- Which reference types the model accepts.
- The listed price rows, which show the Sume billable rate.
Sources
Related posts
More in Developers
- Get the video URL from a Sume webhook: pick the artifact by type
A Sume job.completed payload lists artifacts with id, url, type and content_type. Select the video by content_type, not array index. TypeScript for Node.
- Go net/http client for Sume images: handle 200 and 202 on a model swap
A Go program that posts to Sume /v1/images with the model id from an env var and branches on 200 versus 202, so a gpt-image-1 swap is not a rebuild.
- gpt-image-1 returns 404 model_not_found on Sume: which id to send
gpt-image-1, gpt-image-1.5 or gemini-2.5-flash-image sent to Sume /v1/images return 404 model_not_found. Ids to send instead, plus a lookup.
- GPT Image 2.5 custom size: the pixel rules and the 1024x1536 call
GPT Image 2.5 on Sume takes custom pixels via image_size: multiples of 16, edge up to 3840, aspect up to 3:1. Check your size, then call it with Python.
Written by Sume