Video Router 'accepts a duration of at most N seconds': ceilings

The 400 names the model's own ceiling: 30 s on seedance-2.5 and wan-3.0, 15 s on most others, 10 s on gemini-omni-flash-1.1. Table of every floor and ceiling.

4 min readSume
All posts

If Video Router answers with "model X accepts a duration of at most N seconds", the request was well formed but longer than that model's catalog ceiling. Pick a model whose ceiling fits, or split the shot into several jobs. The same check has a twin, "accepts a duration of at least N seconds", for clips that are too short.

Ceilings and floors in the catalog

Each model's duration_seconds range sits in the Video Router catalog, and the validation reads that range when the request arrives. The envelope check also runs before any money is reserved, so a refused request costs nothing.

Video Router duration range per model, from the catalog on main (read 2026-10-05)
Model idMin secondsMax seconds
seedance-2.5430
wan-3.0230
higgsfield-genjutsu430
h3-max-recast530
seedance-2, seedance-2-fast, seedance-2-mini415
kling-3415
grok-imagine-video-1.5415
minimax-h3, minimax-h3-max515
gemini-omni-flash-1.1310

Reading the error

The message has the shape "model seedance-2 accepts a duration of at most 15 seconds." and points at the field you sent, duration or duration_seconds. It is a validation error, so there is no job id to poll and nothing to cancel. Fix the number and resend; if you use an Idempotency-Key, a corrected body is a new request and should get a new key.

If you picked the model for its length, remember that the longest range is not the cheapest or the best for every shot. The catalog also lists resolutions and aspect ratios per model, and those limits differ from the duration ones.

Two traps around the check

First, the request schema has an outer band of 2 to 30 whole seconds for every model. A value of 31 or 1 never reaches the per-model message; it fails the plain range rule first. Second, gemini-omni-flash-1.1 in edit mode (a video_url source) skips the per-model duration check, because the output keeps the source length; the catalog says a duration there is only a hint for the reserve estimate.

Genjutsu and H3 Max Recast follow the source clip as well: the catalog notes say the output preserves the source length, so the duration you set is not a free choice.

Check before you submit

The script reads the range from the documented catalog endpoint and clamps or refuses on your side. It never prints the key, and it does not create a job.

import os
import requests

hdr = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"]}
r = requests.get("https://api.sume.com/v1/videos/models", headers=hdr, timeout=30)
r.raise_for_status()
catalog = {m["id"]: m for m in r.json()["data"]}

want_model, want_seconds = "seedance-2.5", 20
durations = catalog[want_model]["supported_durations"]
if want_seconds in durations:
    print(want_model, "accepts", want_seconds, "s")
else:
    print(want_model, "takes", min(durations), "to", max(durations), "s")

When not to stretch a clip

A longer ceiling is not a reason to ask for one long shot. If the story has cuts, several 8 to 12 second jobs give you retries per shot and keep a bad take from costing the whole sequence. Stitch them afterwards with the Timeline render. For a 20 second clip, only the 30 second models in the table qualify; every other row needs two jobs.

Sources

Related posts

More in Models

All Models posts

Written by Sume