Introduction
Kling 4.0 Video extend carries on a clip you already have. Send a video of up to 60 seconds and, if you like, a prompt for what happens next. The last frame of your clip becomes the opening frame of a new segment of 3 to 30 seconds, made with Kling 4.0 image-to-video. You get back one MP4 with your original and the new segment joined, and the new segment on its own as well.
Choose a Kling 4.0 mode by starting material
| What you have at the start | Mode |
|---|---|
| a written scene or script | Kling 4.0 Text to video |
| an opening frame, and optionally a closing frame and in-between frames | Kling 4.0 Image to video |
| photos, clips or voice samples to cast from | Kling 4.0 Reference to video |
| a clip you want to change | Kling 4.0 Video edit |
| a clip you want to continue | Kling 4.0 Video extend (you are here) |
Key features & highlights
The last frame sets the scene
The new segment starts on your final frame, so the people, the set and the light carry over. Motion does not carry over the same way, because the model sees one still. Describe the movement you want to continue.
Choose where it ends
Add last_image_url and the new segment finishes on that image. Leave it out and the model decides how the segment ends.
One file back, plus the new piece
The joined file keeps your clip's frame rate and framing, with no black bars. To line up the seam, the picture may be trimmed or adjusted by a few percent at the edges, and the sound crossfades at the seam. Your clip keeps its own sound, and the new segment always has generated stereo sound.
The shape follows your clip
There is no aspect ratio setting. The new segment follows the shape of your source.
Request parameters
| Parameter | Required | Description |
|---|---|---|
prompt | No | Optional. Describe what happens next: the action, the camera and the sound. at least 1 characters |
video_url | Yes | The clip to continue, MP4 or WebM, up to 60 seconds. Its last frame opens the new segment, so end it on a clean, sharp frame. at least 1 characters |
last_image_url | No | Optional closing frame. The new segment should end on this image. |
resolution | No | 720p (default) or 1080p. Match your source so the seam does not show a step in sharpness. |
duration_seconds | No | Length of the new segment: a whole number from 3 to 30 seconds (default 5). Drives the price. |
Pricing
Billed per second of the new segment, at the image-to-video rate for the resolution you choose. The source clip you send is not billed. A refused or failed request is not charged.
| Specification | Price |
|---|---|
| $0.1884 / second |
| $0.282 / second |
Use cases
Finish a shot that ended too early
A walk that stops before the door, a camera move that cuts out mid-way: extend it by a few seconds and describe only what is left to happen.
Build a longer scene step by step
Extend a clip, then extend the joined result again. Each step is billed only for the seconds it adds.
Land on a planned final image
Give a closing frame and the clip arrives at the composition you need, such as a product back at its main angle.
Prompt guide & pro tips
Describe the next beat, not the whole scene
The frame already shows who and where. Spend the prompt on the action that follows, the camera and the sound. With no prompt, the model carries the scene on by itself.
End your source on a clean frame
The last frame is all the model sees. A blurred or half-cut ending carries straight into the new segment, so trim your clip to a sharp frame first.
Match the resolution
Pick the same resolution as your source so the seam does not show a step in sharpness. Draft with a short segment, then ask for the longer one.
API quick start
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
-d '{
"model": "kling/4.0/video-extend",
"input": {
"duration_seconds": 5,
"resolution": "720p",
"video_url": "https://example.com/reference.mp4"
}
}'
# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"
See the API reference for authentication, the complete schema, polling, and error handling.










