Video Router aliases first_frame_url, last_frame_url, duration_seconds
Three Video Router fields are aliases: first_frame_url for image_url, last_frame_url for end_image_url, duration_seconds for duration. Use the canonical names.

Three request fields on POST /v1/video-router/generate are aliases: first_frame_url is the same as image_url, last_frame_url is the same as end_image_url, and duration_seconds is the same as duration. The OpenAPI schema marks the two frame aliases deprecated and says to prefer image_url and end_image_url, so new code should use those names.
If you carry code from an older integration, it is worth normalizing the names once on your side rather than sending both. The schema is strict (additionalProperties is false), so an unknown spelling is not silently accepted.
The mapping
The request normalizer in the Sume API reads image_url first and falls back to first_frame_url, and does the same for the end frame. When you send both spellings of one field, the canonical name is read first.
| Use this | Alias | Notes |
|---|---|---|
| image_url | first_frame_url | Alias marked deprecated; required for grok-imagine-video-1.5 |
| end_image_url | last_frame_url | Alias marked deprecated; needs an image_url or first_frame_url |
| duration | duration_seconds | Whole seconds, schema range 2 to 30 |
Per-model limits still apply
The schema range for duration is 2 to 30, but every id narrows it. wan-3.0 accepts 2 to 30, seedance-2.5 accepts 4 to 30, the MiniMax H3 ids accept 5 to 15, gemini-omni-flash-1.1 accepts 3 to 10, and every other model is capped at 15 seconds, as the API reference spells out. Whole seconds only: the field is an integer.
Frame rules carry over too. end_image_url requires a first frame, either as image_url or as the first_frame_url alias, and grok-imagine-video-1.5 does not support an end frame at all.
Other fields worth knowing
Two optional fields never reach the model. metadata is an object stored with the Sume job request and not sent to the provider, so it is the right place for your SKU or campaign id. model_params is reserved for per-model knobs, with an empty allowlist in v1, so omit it or send an empty object.
Pair these with an Idempotency-Key per intent and you have a clean submit: canonical field names, your own tag in metadata, and a safe retry. The retired-alias cleanup costs nothing now and avoids surprises when a deprecated spelling is eventually removed.
Example in canonical names
A start-and-end-frame clip on seedance-2.5:
``json
{
"model": "seedance-2.5",
"prompt": "Camera pulls back from the product to reveal the shelf",
"image_url": "https://example.com/start.png",
"end_image_url": "https://example.com/end.png",
"resolution": "720p",
"duration": 10,
"mode": "async"
}
``
Replace image_url with first_frame_url and duration with duration_seconds and the request means the same thing. On the newer /v1/videos route the equivalent is frame_images with first_frame and last_frame entries plus duration, so moving off the Video Router also retires the aliases for good.
Sources
Related posts
More in Developers
- Video Router sync waits 30 seconds; your Seedance 2.5 clip keeps going
mode sync and subscribe are the same bounded wait of at most 30 seconds. A long Seedance 2.5 job returns 2xx with the current state; poll, do not resubmit.
- video_trim_output_requires_exact: keyframe cuts can't resize
FFmpeg stream copy cannot filter, and Sume's keyframe trim cannot take an output size or fps. Why it is refused, and the one-line fix.
- video_url 400 on Sume: edit is supported only by Omni Flash 1.1
A video_url on any other model returns 400 on the Sume Video Router. Which models take a source video, and how to pick one for your edit.
- VideoObject for a product video: thumbnail, date and duration
Google's VideoObject needs name, thumbnailUrl and uploadDate. How to fill them and the duration from a Sume trim result and a video-frames still.
Written by Sume