Kwaivgi Kling V4.0 Video Edit API Documentation
Playground
Try it on WaveSpeedAI!Kling V4.0 Video Edit rewrites a 3 to 30 second video from a text instruction: it keeps the scene, subject and motion and changes what you describe, with optional reference images and audios, 720p and 1080p output and new synchronized audio generated by default (the original sound can be kept instead). Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
Kling V4.0 Video Edit transforms an existing video using natural-language instructions. Change a character, environment, weather, visual style, or other scene elements while using the source footage as the foundation for motion and composition.
Generate edited videos from 3 to 30 seconds at 720p or 1080p, with optional reference images, reference audios, and audio control.
Why Choose This?
- Instruction-based video editing — Describe what you want to change using natural language.
- Source-guided motion — Preserve the overall action and motion of the original footage while transforming selected elements.
- Reference image support — Add up to
10images to guide characters, objects, clothing, or visual style. - Reference audio support — Add up to
3audios to guide the voice and sound of the edited video. - 720p and 1080p output — Choose the resolution that fits your workflow.
- Original audio support — Generate new synchronized audio, or keep the source soundtrack.
- Flexible output — Adjust duration and aspect ratio when needed.
Parameters
| Parameter | Required | Description |
|---|---|---|
| video | Yes | Source video to edit. Supports 3–30 seconds. Longer videos are limited to the first 30 seconds. |
| prompt | Yes | Describe the changes to apply. Refer to the source video as @Video1, reference images as @Image1, @Image2, and reference audios as @Audio1, @Audio2, and so on. |
| images | No | Up to 10 reference images for subjects, objects, clothing, styles, or other visual guidance. |
| audios | No | Up to 3 reference audios, 5–30 seconds each, to guide the voice and sound of the edited video. |
| keep_original_sound | No | Keep the source video’s original audio instead of generating new synchronized audio. Default: false. |
| resolution | No | Output resolution: 720p or 1080p. Default: 720p. |
| duration | No | Output duration from 3 to 30 seconds. When omitted, the output follows the source video duration. |
| aspect_ratio | No | Output aspect ratio: 16:9, 9:16, 1:1, or 21:9. When omitted, the output follows the source video. |
How to Use
- Upload a video — Provide the footage you want to edit.
- Describe the change — Explain what should be replaced, transformed, or restyled.
- Add reference images or audios optional — Use references when a specific character, object, outfit, style, voice, or sound is needed.
- Choose output settings — Set resolution, duration, or aspect ratio if needed.
- Configure audio — Generate new synchronized audio, or keep the original soundtrack.
- Submit — Generate and retrieve the edited video.
Pricing
Charged based on the requested duration and source video length.
Billed seconds = requested duration + the longer of the requested and source durations.
Source duration is rounded up to whole seconds, capped at 30 seconds, and used when duration is omitted.
| Resolution | Per Billed Second | 5s Input + 5s Requested |
|---|---|---|
| 720p | $0.094 | $0.94 |
| 1080p | $0.141 | $1.41 |
Reference images, reference audios, aspect ratio, and audio settings add no extra charge.
Best Use Cases
- Character replacement — Replace a person or character while keeping the original scene and motion.
- Environment changes — Move existing action into a different location or setting.
- Weather and atmosphere edits — Change lighting, weather, season, or overall mood.
- Style transformation — Restyle footage while retaining its underlying movement.
- Product and clothing replacement — Introduce specific objects, products, or outfits using reference images.
- Creative video variations — Produce alternate versions of existing footage without rebuilding the scene from scratch.
Pro Tips
- Describe the changes clearly instead of rewriting the entire source scene.
- Mention important elements that should remain consistent when necessary.
- Refer to the source video as
@Video1. - Refer to reference images as
@Image1,@Image2, and so on according to their order. - Refer to reference audios as
@Audio1,@Audio2, and so on according to their order. - Explain what each reference image or audio should contribute to the edit.
- Use clear footage with visible subjects for more predictable transformations.
Notes
videoandpromptare required.- Source videos support up to
30seconds. - Up to
10reference images and up to3reference audios can be supplied. resolutiondefaults to720p.keep_original_sounddefaults tofalse: the soundtrack is generated with the edit, so describe the sound you want in the prompt. Set it totrueto keep the source audio exactly.- When
durationis omitted, the output follows the source video duration. - When
aspect_ratiois omitted, the output follows the source video’s framing. - Reference audios guide a speaker’s voice; they do not reproduce the original recording, music, or timing.
- Reference voices shape the newly generated audio. Set
keep_original_soundtotrueto keep the source video’s original audio instead.
Related Models
- Kling V4.0 Text-to-Video — Generate videos directly from text prompts with Kling V4.0.
- Kling V4.0 Image-to-Video — Animate a reference image into a video with Kling V4.0.
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",
"keep_original_sound": false,
"resolution": "720p",
"duration": 3,
"aspect_ratio": "16:9"
}
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-edit" \
-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
doneRetry temporary errors only while polling, never the submit request. Errors, retries and timeouts
Parameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| prompt | string | Yes | - | Describe the edit you want applied to the video - change a subject, the setting, the weather or the style. Refer to the video as @Video1, to reference images as @Image1, @Image2, ... and to reference audios as @Audio1, @Audio2, ... in array order. | |
| video | string | Yes | - | URL of the video to edit. The edit keeps its scene, subject and motion; 3-30 seconds, longer videos are trimmed to 30 seconds. | |
| images | array<string> | No | - | 0 ~ 10 items | Optional reference images (up to 10) for a subject, object or style to bring into the edit. |
| audios | array<string> | No | - | 0 ~ 3 items | Reference audios (up to 3), 5-30 seconds each. They guide the voice and sound of the video. |
| keep_original_sound | boolean | No | false | - | Keep the input video's own sound instead of generating new synchronized audio. |
| resolution | string | No | 720p | 720p, 1080p | Output resolution. |
| duration | integer | No | - | 3, 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, 30 | Output duration in seconds (3-30). Follows the input video's length if not specified. |
| aspect_ratio | string | No | - | 16:9, 9:16, 1:1, 21:9 | Aspect ratio of the output video. Follows the input video if not specified. |
Every model also accepts the global request options enable_sync_mode and enable_base64_output; see their pages for details.
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Output values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.status | string | Task status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses. |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction |
| data.model | string | Model ID used for the prediction |
| data.outputs | array<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.urls | object | Object containing related API endpoints |
| data.status | string | Status: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses |
| data.created_at | string | ISO timestamp of when the request was created |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |