duration vs duration_seconds on each Sume video route
/v1/videos takes duration; motion control and lip-sync take duration_seconds; recast and edit read the source clip. One table of what each does.

Sume's video routes do not agree on how a length is sent. POST /v1/videos takes an integer duration in seconds. The Kling 3.0 motion control and MiniMax H3 Max lip-sync routes take duration_seconds, which is a reservation basis and not a setting. H3 Max Recast and Gemini Omni Flash edit read the length from the source clip, and the duration you send is at most a hint. Sending the wrong field or the wrong number gives either a 400 or a bill that does not match the clip.
A good client keeps one small table in code that maps each route to the field it wants and to its allowed range, and validates against it before the request leaves. That moves a rejected request from a round trip to a unit test, and it stops a value that is legal on one route, such as 20 seconds on Wan 3.0, from being sent unchanged to a route where it is out of range, such as H3 Max lip-sync.
The table below is the full map. Keep it close if your code builds requests for more than one model.
The map
All rows come from the Sume route docs and the Video Router catalog.
| Route or model | Field | Range | Role |
|---|---|---|---|
| Text, image or reference to video (/v1/videos) | duration | Per model: Wan 3.0 2 to 30 s, Seedance 2.5 4 to 30 s, Omni 3 to 10 s, Kling 3 4 to 15 s, H3 and H3 Max 5 to 15 s | Sets the clip length |
| Gemini Omni Flash 1.1 edit | duration | Hint only, default 8 s | Reserve estimate; source sets output |
| H3 Max Recast | none to send | Source clip 5 to 30 s | The inspected length of the source |
| Higgsfield Genjutsu motion transfer | none to send | Source 4 to 30 s | Length of the input video, rounded up |
| Kling 3.0 motion control | duration_seconds | 1 to 30 | Reservation basis; the motion video sets the length |
| MiniMax H3 Max lip-sync | duration_seconds | 5 to 14.8 | Reservation basis; the audio sets the length |
The two kinds of field
There are two meanings hidden behind the word duration. On the generation routes it is a request: you ask for a length and the model makes it. On the routes that follow an input, it is a declaration: you tell Sume how long your input is so that the price can be reserved, and the output follows the input.
That is why motion control never forwards the value to the provider, and why lip-sync refuses a value outside its window instead of clamping it. A declaration that is wrong would produce a clip that is cut short, or a reservation that is too small.
Rounding and the bill
Both declared fields round up. Motion control bills ceil(duration_seconds) at $0.1575 per second after the margin, and lip-sync bills the rounded-up seconds at the rate for the chosen resolution. A 7.2 second motion reference is billed as 8 seconds, which is $1.26. A 5.1 second audio file on lip-sync at 768p is billed as 6 seconds, $0.60. Send the real length with decimals when the route allows it, and let the route do the rounding.
Check the length before you send
Measure your input before the request. For video, read the duration from the file's metadata, and for audio, check the length of the voiced file, as in checking a TTS file against the lip-sync window. For the generation routes, read supported_durations for the model from GET /v1/videos/models and snap your value to it. When a length is not in the supported set, change your script or your cut and do not rely on the server to round it for you. The older Video 1.0 alias has its own rule, covered in duration and duration_seconds on Video 1.0.
Sources
Related posts
More in Developers
- The duration window all fallback video models share: 5 to 10 s on Sume
Pair Omni, Seedance, Wan and MiniMax H3 as fallbacks and the only duration every one accepts is 5 to 10 seconds. Overlap table for each pair on Sume.
- Edit one region of a large photo: crop, edit, stitch back in Pillow
Crop the part you want changed, edit it with Ideogram 4.5 on Sume, then resize and feather it back into the full-resolution photo with Pillow. Code included.
- Edited script, same Idempotency-Key: 409 conflict on Sume TTS
Reusing an Idempotency-Key with a changed transcript returns 409 idempotency_conflict on Sume. How to key each script version so edits never collide.
- Elysia on Bun: verify a Sume webhook with parse: "text"
An Elysia route that checks the Sume HMAC signature on the raw string, refuses an empty secret, skips duplicates and answers webhook.test. Tested on Bun 1.4.
Written by Sume