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.

5 min readSume
All posts

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.

How each route handles length (Sume docs, read 2026-10-07)
Route or modelFieldRangeRole
Text, image or reference to video (/v1/videos)durationPer 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 sSets the clip length
Gemini Omni Flash 1.1 editdurationHint only, default 8 sReserve estimate; source sets output
H3 Max Recastnone to sendSource clip 5 to 30 sThe inspected length of the source
Higgsfield Genjutsu motion transfernone to sendSource 4 to 30 sLength of the input video, rounded up
Kling 3.0 motion controlduration_seconds1 to 30Reservation basis; the motion video sets the length
MiniMax H3 Max lip-syncduration_seconds5 to 14.8Reservation 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

All Developers posts

Written by Sume