Kling 3.0 4K Text to Video API
kwaivgi/kling-v3.0-4k/text-to-videoKling 3.0 4K Text to Video generates native 4K scenes from written prompts, with timed shots and native audio. Describe framing, materials and camera movement to guide the detail and progression of each scene.
588/2,500
REST API
Quick Start
Submit a Kling 3.0 4K Text to Video request and use its task identifier to retrieve the video.
Authentication
Send your Vidgo API key in the Authorization header as a Bearer token.
- Submit endpoint
- POST
https://api.vidgo.ai/api/generate/submit - Authentication
- Authorization: Bearer YOUR_API_KEY
Submit Request
Send the model identifier and scene prompt inside the JSON request. Change the prompt to describe your scene.
REQUEST_BODY=$(cat <<'JSON'
{
"model": "kwaivgi/kling-v3.0-4k/text-to-video",
"input": {
"prompt": "A ceramic cup sits beside a window in morning light. The camera slowly moves closer as steam curls above the rim. A quiet room tone accompanies the scene.",
"duration": 5,
"multi_shots": false,
"sound": true
}
}
JSON
)
RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
CODE=$(printf '%s' "$RESPONSE" | jq -r '.code // empty')
if [ "$CODE" != "0" ] && [ "$CODE" != "200" ]; then
printf 'API error: %s
' "$RESPONSE" >&2
exit 1
fi
printf '%s
' "$RESPONSE"Query Task Status
Replace {task_id} in the status URL with the identifier returned on submission.
Status endpoint
https://api.vidgo.ai/api/generate/status/{task_id}Query this URL with the returned task_id. Continue until finished or failed; a completed video is listed in data.files.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "example-task-id",
"status": "not_started",
"created_time": "2026-09-27T00:00:00Z"
}
}{
"code": 200,
"data": {
"task_id": "example-task-id",
"status": "finished",
"created_time": "2026-09-27T00:00:00Z",
"files": [
{
"file_type": "video",
"file_url": "https://example.com/generated-video.mp4"
}
]
}
}Complete Example
When status is finished, read file_url from video entries in files. Task IDs and output URLs below illustrate the response format.
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "kwaivgi/kling-v3.0-4k/text-to-video",
"input": {
"prompt": "A ceramic cup sits beside a window in morning light. The camera slowly moves closer as steam curls above the rim. A quiet room tone accompanies the scene.",
"duration": 5,
"multi_shots": false,
"sound": true
}
}
JSON
)
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
TASK_ID=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.data.task_id // .task_id // empty')
BUSINESS_CODE=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Submit failed:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
if [ -z "$TASK_ID" ]; then
printf 'Submit response did not include task_id:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
START_TIME=$(date +%s)
POLL_DELAY=2
while true; do
if [ $(( $(date +%s) - START_TIME )) -ge 600 ]; then
printf 'Timed out after 600 seconds
' >&2
exit 1
fi
STATUS_RESPONSE=$(curl --silent --show-error --fail-with-body \
--url "https://api.vidgo.ai/api/generate/status/$TASK_ID" \
--header "Authorization: Bearer $VIDGO_API_KEY")
STATUS=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.data.status // .status // empty')
BUSINESS_CODE=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Status request failed:
%s
' "$STATUS_RESPONSE" >&2
exit 1
fi
case "$STATUS" in
finished)
printf '%s' "$STATUS_RESPONSE" | jq -r '(.data.files // .files // [])[]?.file_url'
break
;;
failed)
printf '%s' "$STATUS_RESPONSE" | jq -r '.data.error_message // .error_message // "Generation failed"' >&2
exit 1
;;
not_started|running)
sleep "$POLL_DELAY"
if [ "$POLL_DELAY" -lt 10 ]; then POLL_DELAY=$((POLL_DELAY + 1)); fi
;;
*)
printf 'Unexpected task status: %s
' "$STATUS" >&2
exit 1
;;
esac
doneRequest Parameters
Choose a single prompt or a sequence of shots, then set duration and sound for this endpoint.
| Field | Type | Requirement | Default | Usage |
|---|---|---|---|---|
| prompt | string | When multi_shots=false | Set explicitly | Describe the subject, scene and camera direction in 1–2,500 characters. For multiple shots, write each scene in multi_prompt. |
| multi_shots | boolean | Optional | false | Choose false for one prompt, or true for separately timed shots with multi_prompt and sound=true. |
| multi_prompt | object[] | When multi_shots=true | Set explicitly | Add at least one object with prompt and duration. Each prompt uses 1–2,500 characters; each shot lasts 1–12 integer seconds. Shot times add up to duration. |
| duration | integer | Required | Set explicitly | Set the total clip length to an integer from 3 to 15 seconds. For multiple shots, use the sum of their durations. |
| sound | boolean | Required | Set explicitly | Use true for generated audio. A silent single shot uses false. Multiple shots use true. |
Response Fields
Submission returns a task identifier. Query its status to retrieve generated video URLs.
| Field | Type | Usage |
|---|---|---|
| code | integer | Response code: 0 or 200 indicates a successful API operation. |
| data.task_id | string | Identifier returned on submission; use it to query the same task. |
| data.status | string | One of not_started, running, finished or failed. A successful submission is followed by status checks. |
| data.created_time | string | Task creation time returned by the service. |
| data.files | array | Generated media entries returned when the task finishes. |
| data.files[].file_type | string | Use entries with file_type=video for the generated clip. |
| data.files[].file_url | string | Video URL for playback or download. |
| data.error_message | string | null | Read the task error detail when status=failed. |
Task Lifecycle
Keep the returned task_id and follow status until finished or failed.
not_startedThe request is accepted and waiting to start. Keep its task_id for the next status check.
runningThe video is being generated. Continue checking the same task.
finishedGeneration is complete. Read the video entries in files.
failedGeneration ended with an error. Review error_message before submitting an adjusted request.
Error Handling
- Check timing before submittingFor multiple shots, use sound=true and ensure individual durations sum to a total of 3–15 seconds.
- Keep reference URLs accessibleUse public HTTP(S) media URLs that remain reachable while the task is processed.
- Resume interrupted status checksIf a status request fails, retry the status check using the same task_id. Submit a new generation only when you intend to create another clip.
- Read the returned errorFor a failed task, inspect error_message and adjust the relevant input before trying again.
Specifications
| Specification | Value | Usage |
|---|---|---|
| Input mode | Text to Video | One scene prompt or a sequence of individually timed shot prompts. |
| Resolution | 4K | Native 4K video output. |
| Clip duration | 3–15 seconds | Whole seconds; each shot in a sequence uses 1–12 seconds. |
| Audio | sound | Generate audio with true; single-shot silent generation uses false. |
| Model identifier | kwaivgi/kling-v3.0-4k/text-to-video | Public model value for this request. |
Related Models
Kling 3.0 4K Text to Video API frequently asked questions
What is the Kling 3.0 4K Text to Video API?
Kling 3.0 4K Text to Video is a Kuaishou model for generating scenes from written prompts. It creates native 4K footage with audio and individually timed shots. Joint audio and video generation connects sound with the scene, while per-shot prompts guide its action and continuity. You can call it programmatically or try it from the playground above.
Does Kling 3.0 4K Text to Video generate native 4K?
Yes. This tier generates native 4K footage from the scene prompt. Use it when your delivery or editing timeline calls for 4K, and describe the framing, surfaces and lighting that should occupy that resolution.
How do I add audio in Kling 3.0 4K Text to Video?
Set sound=true and describe the desired dialogue, ambient sound or effects alongside the visual action. Single shots can use sound=false for silent footage; multi-shot sequences use sound=true.
How should I prompt detailed scenes in Kling 3.0 4K Text to Video?
Specify the foreground subject, relevant surface detail, light direction and camera distance. For an environment shot, describe how the camera reveals the space so the scene has a clear focal point throughout its movement.
How does Kling 3.0 4K Text to Video connect multiple shots?
Enable multi_shots and sound, then describe each shot in multi_prompt with its own 1–12 second duration. Repeat subject and setting details across shots and make their durations sum to duration, from 3 to 15 seconds.
How long can a Kling 3.0 4K Text to Video clip be?
Set duration to any integer from 3 to 15 seconds. For a sequence, divide that time among shot prompts; each individual shot uses 1–12 seconds.
When should I choose Kling 3.0 4K over Kling 3.0 Pro?
Choose 4K for native 4K footage intended for detailed scenes or a 4K timeline. Pro delivers 1080p at a lower per-second rate; select the tier that matches your final output.
How does Sound affect Kling 3.0 4K billing?
Both sound=true and sound=false cost $0.250 per second. Multiply the rate by total clip duration; a five-second clip costs $1.250. Multiple shots keep sound=true.















