last_frame without first_frame returns 400: kling-3 and Seedance fix
A frame_images list with only a last_frame is rejected with 400 unsupported_capability. Send a first_frame too; Kling 3.0 uses start and end frames only.

Why does a last_frame alone return 400?
Because Sume treats a last frame as an ending for a clip that starts from a first frame you supply. A frame_images list that contains a last_frame but no first_frame is rejected with a 400, the code unsupported_capability, and the message "frame_images with a last_frame also requires a first_frame."
There is no "end only" mode on any catalog row, so the fix is in the request, not in the model choice.
Which rows accept first and last frames?
The Seedance rows (seedance-2.5, seedance-2, seedance-2-fast, seedance-2-mini) and kling-3 all list both first_frame and last_frame in their capabilities, as do Wan 3.0 and the MiniMax rows. grok-imagine-video-1.5 is a start-frame model and the Videos panel's Grok entry needs a start frame.
Kling's own comparison page says Kling 3.0 supports start and end keyframes only, while Kling 4.0 supports up to 10 keyframes. On Sume, two frames is the ceiling for kling-3 regardless of what Kling 4.0 offers elsewhere.
| You send | Result | Fix |
|---|---|---|
| first_frame only | Image-to-video from the picture | Nothing to fix |
| first_frame and last_frame | Clip that starts and ends on your pictures | Nothing to fix |
| last_frame only | 400 unsupported_capability | Add a first_frame entry |
| Three or more frames | No multi-keyframe field on Sume | Chain clips: last frame of one is first frame of the next |
What does the fixed request look like?
Add the first frame. Each entry in frame_images carries its own frame_type. For a loop, reuse the same image URL for both frames.
{
"model": "kling-3",
"prompt": "A lantern sways gently in the evening breeze, locked camera",
"frame_images": [
{
"type": "image_url",
"image_url": { "url": "https://example.com/lantern.png" },
"frame_type": "first_frame"
},
{
"type": "image_url",
"image_url": { "url": "https://example.com/lantern.png" },
"frame_type": "last_frame"
}
],
"duration": 6,
"resolution": "720p",
"aspect_ratio": "1:1"
}What happens if I also send input_references?
The docs say that when both fields are present, frame_images takes precedence and the request is treated as image-to-video. So a reference list sent next to a first frame is not used as references. Keep the two modes in separate requests. The image-to-video versus reference-to-video comparison explains when to use each.
How do I get past two frames?
Chain clips. Download the first clip, extract its final frame, and submit it as the first_frame of the next. Sume has no timestamped keyframe field, so a 10-keyframe plan like the one Kling describes for 4.0 becomes several short jobs. Costs add up per job, since each submit reserves the provider list price times 1.25, so plan the number of segments before you start. For loops and chaining patterns see looping with the same first and last image.
Sources
Related posts
More in Developers
- Latin American Spanish text to speech: es or es-MX on Sume?
Sume's TTS language is a free string and its voice library tags voices with plain es. What that means for Mexican, Argentine or Spain Spanish, and how to test.
- Live AI avatar API: a Tavus conversation vs a Sume job
A live avatar API creates a room you join. Sume's Avatar API creates a job you poll. Field-by-field map of Tavus create conversation and Sume talking-video.
- Luma Agents API polling: 20 s wait, 10-minute video timeout, and Sume
Luma's quickstart says wait 20 seconds, then poll, with a hard 2-minute image and 10-minute video timeout, not backoff. A matching Sume loop that actually runs.
- Luma Ray 2 to Ray 3.2 migration: the field map and what changes
Luma is retiring Ray 3, Ray 2, Ray 2 Flash and more for ray-3.2 on one /v1/generations endpoint. The field map, the poll-only change, and Sume's contrast.
Written by Sume