Kwaivgi Kling V4.0 Video Extend API Documentation

Kwaivgi Kling V4.0 Video Extend API Documentation

Playground

Try it on WaveSpeedAI!

Kling V4.0 Video Extend continues a video from its last frame with a new 3 to 30 second segment guided by your prompt, at 720p or 1080p with synchronized stereo audio, and returns the original and the new segment joined. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

Features

Kling V4.0 Video Extend continues an existing video from its last frame. Describe what should happen next and generate a new segment from 3 to 30 seconds at 720p or 1080p, with synchronized audio.

The generated segment is appended to the original video to create one continuous clip.


Why Choose This?

  • Continue existing videos — Extend a clip naturally from its final frame.
  • Flexible extension length — Generate an additional 3–30 seconds.
  • 720p and 1080p output — Choose the resolution that fits your workflow.
  • Synchronized audio — Generate sound together with the new video segment.
  • Optional ending frame — Provide a last_image to guide the continuation toward a specific final frame.

Parameters

ParameterRequiredDescription
videoYesSource video to extend. The new segment begins from the video’s last frame and is appended to the original clip.
promptYesDescribe the continuation, including action, camera movement, lighting, dialogue, ambience, or sound.
durationNoLength of the generated extension in seconds. Range: 3–30. Default: 5.
resolutionNoOutput resolution: 720p or 1080p. Default: 720p.
last_imageNoOptional target ending image. The generated segment transitions from the source video’s last frame toward this image.

How to Use

  1. Upload a video — Provide the clip you want to continue.
  2. Describe what happens next — Write a prompt for the new action, camera movement, and sound.
  3. Set the duration — Choose an extension length from 3 to 30 seconds.
  4. Choose resolution — Select 720p or 1080p.
  5. Add a last image optional — Provide a target ending frame when you want more control over how the continuation finishes.
  6. Submit — Generate and retrieve the extended video.

Pricing

Only the newly generated segment is charged.

ResolutionPrice per Second
720p$0.157
1080p$0.235

For example, extending a video by 5 seconds costs $0.785 at 720p or $1.175 at 1080p.

last_image does not add a separate charge.


Best Use Cases

  • Story continuation — Extend an existing scene with new action or events.
  • Longer cinematic sequences — Continue shots without starting a new generation from scratch.
  • Camera movement extensions — Carry an existing camera motion into a longer sequence.
  • Dialogue and performance — Continue character actions with synchronized speech or sound.
  • Scene transitions — Use a target ending image to guide the clip toward a specific visual destination.

Pro Tips

  • Describe what should happen next rather than repeating everything already visible in the source video.
  • Keep the continuation consistent with the final moment of the source clip.
  • Match the extension length to the amount of action in the prompt.
  • Describe important ambience, music, dialogue, or sound effects when audio matters.
  • Use last_image when you want the extended scene to finish at a specific visual state.

Notes

  • video and prompt are required.
  • duration supports 3–30 seconds and defaults to 5.
  • resolution defaults to 720p.
  • The extension begins from the source video’s last frame.
  • The original video and generated segment are returned as one continuous clip.
  • The source video’s existing audio is retained, while the new segment includes generated synchronized audio.

Authentication

For authentication details, please refer to the Authentication Guide.

API Endpoints

Submit Task & Query Result

set -euo pipefail

export WAVESPEED_API_KEY="your-api-key"

REQUEST_BODY=$(cat <<'JSON'
{
  "prompt": "A cinematic ocean wave at sunrise, highly detailed",
  "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
  "resolution": "720p",
  "duration": 5
}
JSON
)

# 1. Submit the prediction once. Never retry this request automatically:
# a retry after an unclear failure can create a second, billed task.
CHECK='The task may already exist. Check History or the predictions list before submitting again.'
if ! SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  --connect-timeout 10 --max-time 60 \
  -X POST "https://api.wavespeed.ai/api/v3/kwaivgi/kling-v4.0/video-extend" \
  -H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
  -H "Content-Type: application/json" \
  -d "${REQUEST_BODY}"); then
  printf 'Submit failed. %s\n' "${CHECK}" >&2
  exit 1
fi

TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
  printf 'Submission response did not contain a prediction id. %s\n' "${CHECK}" >&2
  exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"

# 2. Poll until the prediction reaches a final status.
BODY_FILE=$(mktemp)
trap 'rm -f "${BODY_FILE}"' EXIT
while true; do
  # Transient errors (429, 5xx) are retried, honoring Retry-After.
  HTTP_CODE=$(curl --silent --show-error --fail-with-body \
    --connect-timeout 10 --max-time 60 --retry 5 --retry-delay 2 \
    --output "${BODY_FILE}" --write-out '%{http_code}' \
    "${RESULT_URL}" \
    -H "Authorization: Bearer ${WAVESPEED_API_KEY}" || true)
  case "${HTTP_CODE}" in
    2??) ;;
    000|429|5??)  # dropped connection or temporary error: keep polling
      printf 'Task %s: HTTP %s, polling again in 10s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
      sleep 10; continue ;;
    *) printf 'Task %s: HTTP %s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
      cat "${BODY_FILE}" >&2; exit 1 ;;
  esac
  RESULT=$(jq 'if type == "object" and has("data") then .data else . end' "${BODY_FILE}")
  STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')

  case "${STATUS}" in
    completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
    failed|cancelled|timeout|deleted)
      printf 'Task %s ended with status %s\n' "${PREDICTION_ID}" "${STATUS}" >&2
      printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
    *) sleep 2 ;;
  esac
done

Retry temporary errors only while polling, never the submit request. Errors, retries and timeouts

Parameters

Task Submission Parameters

Request Parameters

ParameterTypeRequiredDefaultRangeDescription
promptstringYes-Describe the continuation - action, camera movement, lighting and sound. Audio is generated together with the picture.
videostringYes-URL of the video to extend. The new segment is generated from its last frame and appended to the original.
last_imagestringNo--Optional target last-frame image URL. When provided, the new segment interpolates from the input video's last frame to this image.
resolutionstringNo720p720p, 1080pResolution of the new segment.
durationintegerNo53, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30Length in seconds of the new segment to append (3-30).

Every model also accepts the global request options enable_sync_mode and enable_base64_output; see their pages for details.

Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
data.idstringUnique identifier for the prediction, Task Id
data.modelstringModel ID used for the prediction
data.outputsarrayOutput values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed)
data.urlsobjectObject containing related API endpoints
data.statusstringTask status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses.
data.created_atstringISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”)
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds

Result Request Parameters

ParameterTypeRequiredDefaultDescription
idstringYes-Task ID

Result Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
dataobjectThe prediction data object containing all details
data.idstringUnique identifier for the prediction
data.modelstringModel ID used for the prediction
data.outputsarray<string | object>Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model.
data.urlsobjectObject containing related API endpoints
data.statusstringStatus: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses
data.created_atstringISO timestamp of when the request was created
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds
© 2026 WaveSpeedAI. All rights reserved.