Kling 3 input_references 400 unsupported_capability: fix
Sending input_references to kling-3 on Sume returns 400 unsupported_capability. Move the image to frame_images or pick a model that takes references.

Why does kling-3 return 400 unsupported_capability for input_references?
Because the kling-3 catalog row does not list any input reference type. Sume checks each input_references entry against the model's supported_input_references and rejects a type that is not in the list with a 400 and the code unsupported_capability. The message has the form "kling-3 does not support input_references type image_url."
This is deliberate: a loud 400 before submit is better than a clip that ignores your reference and still bills you. The Kling row is text-to-video and image-to-video with a first and last frame, and its constraint is "no reference_*_urls".
Which fix applies to my request?
Pick by what the image was for. If it was the starting picture of the shot, it belongs in frame_images. If it was a style or identity reference, you need a model that accepts references.
The three fixes below are the whole decision.
| The image was... | Do this | Field |
|---|---|---|
| The first frame of the clip | Keep kling-3, resend as first frame | frame_images with frame_type: first_frame |
| The last frame of the clip | Send a first frame too, then the last | frame_images, both frame types |
| A style or identity reference | Switch to a model that lists the type | input_references on a Seedance 2.x row, Wan 3.0 or MiniMax |
What does the corrected request look like?
Here is the same intent as a first frame. The image URL must be public HTTPS; the docs list inaccessible reference media as a common cause of failed jobs.
Note the field changes from input_references to frame_images, and each entry carries a frame_type.
{
"model": "kling-3",
"prompt": "The character turns toward the window and smiles, slow push-in",
"frame_images": [
{
"type": "image_url",
"image_url": { "url": "https://example.com/master.png" },
"frame_type": "first_frame"
}
],
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9"
}What if I send both fields?
The video docs state that when frame_images and input_references are both present, frame_images takes precedence and the request is treated as image-to-video. In other words a request that carries a first frame is not a reference request, so do not assume your reference images are being used. Send one mode per request, and confirm with a short test clip.
A last frame without a first frame is its own error; see the first and last frame guide and the image-to-video versus reference-to-video comparison.
How do I avoid the 400 in the first place?
Read the catalog instead of hard-coding capabilities. GET /v1/videos/models returns supported_input_references, supported_frame_images, supported_durations and supported_resolutions for each row, and the answer for kling-3 is empty for references.
If you call the legacy Video Router, the same rule applies under its own field names: the catalog capabilities show reference_images: false for kling-3, and the flat reference_image_urls field is the one to leave out. Either way the fix is in your request, not in a retry.
Sources
Related posts
More in Developers
- Calling the Sume API from Kotlin: no SDK, so write the poll loop
Sume publishes a TypeScript SDK and no Kotlin package. The documented submit, poll, fetch loop works from OkHttp or Ktor; the deadline lives in your client.
- 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.
- 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.
Written by Sume