The elderly man slowly smiles, eyes crinkling warmly, soft lamp light flickering gently
Kling 3.0 Turbo Pro Image to Video API
kwaivgi/kling-v3-turbo-pro/image-to-videoKling 3.0 Turbo Pro Image to Video animates a single first-frame image into 3–15 second 1080p video with deep detail restoration, native audio-visual lip sync, and cinematic camera direction. It preserves the subject identity, composition, and material texture of the source frame while adding natural motion and multi-shot pacing. With multi_prompt, omitting top-level duration also allows shot totals of 1–2 seconds.
Drag and drop files, paste from clipboard, or provide a URL.
1/1 files added
Examples
REST API
Quick Start
Authenticate with the API, submit the prompt and settings, then retrieve the video using the task ID.
Connect to the Vidgo API
Create an API key, keep it only on your server, and send Authorization: Bearer VIDGO_API_KEY.
- Endpoint
- POST
https://api.vidgo.ai/api/generate/submit - Authentication
- Authorization: Bearer VIDGO_API_KEY
Submit one generation task
Fill in the parameters for this endpoint using the request example, then save the returned task_id to query progress and results.
REQUEST_BODY=$(cat <<'JSON'
{
"model": "kwaivgi/kling-v3-turbo-pro/image-to-video",
"input": {
"image_urls": [
"https://cdn.vidgo.ai/apis/models/kwaivgi/kling-v3-turbo-pro/image-to-video/v1/01/input-01.png"
],
"prompt": "The elderly man slowly smiles, eyes crinkling warmly, soft lamp light flickering gently",
"duration": 5
}
}
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"Wait for the result
Query with task_id, continue for not_started/running, and stop for finished/failed. On success, read data.files[].file_url.
Track status
GET https://api.vidgo.ai/api/generate/status/{task_id}Poll status with a 2-second base interval, and increase the interval for longer tasks. Continue only while status is not_started or running, and stop once finished or failed. You can also specify callback_url in the request payload to receive webhook notifications.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "task-unified-...",
"status": "running",
"created_time": "2026-09-16T10:00:00Z"
}
}{
"code": 200,
"data": {
"task_id": "task-unified-...",
"status": "finished",
"files": [
{
"file_url": "https://storage.vidgo.ai/generated/video.mp4",
"file_type": "video"
}
],
"created_time": "2026-08-22T10:00:00Z",
"progress": 100,
"error_message": null
}
}Complete runnable example
Expand for a complete script with HTTP and business-code checks, task_id validation, polling, terminal-state handling, and a timeout boundary.
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "kwaivgi/kling-v3-turbo-pro/image-to-video",
"input": {
"image_urls": [
"https://cdn.vidgo.ai/apis/models/kwaivgi/kling-v3-turbo-pro/image-to-video/v1/01/input-01.png"
],
"prompt": "The elderly man slowly smiles, eyes crinkling warmly, soft lamp light flickering gently",
"duration": 5
}
}
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
doneInput parameters
The table lists available input parameters, types, and defaults. Request examples also include the required top-level model field.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| image_urls | array | Yes | — | Exactly one public image URL used as the first frame. |
| prompt | string | No | — | 1–2500 characters. Mutually exclusive with multi_prompt. |
| duration | integer | No | Shot total / 5 | An explicit duration must be 3–15 seconds and equal the shot total when multi_prompt is set. Omit it to use the shot total (1–15 seconds); without multi_prompt it defaults to 5 seconds. |
| multi_prompt | array | No | — | 1–6 shots, each with a nonblank prompt and optional duration of 1–15 seconds (default 5). Total duration must not exceed 15 seconds. Mutually exclusive with a nonblank prompt. |
| multi_prompt[].prompt | string | Yes (if multi_prompt is set) | — | Shot prompt, max 2500 characters. |
| multi_prompt[].duration | integer | No | 5 | Shot duration from 1 to 15 seconds. |
| aspect_ratio | string | No | — | The output aspect ratio follows the input image; aspect_ratio has no effect on this endpoint. |
Response Fields
A successful submission returns a task ID. Status queries provide progress, output files, and error details when a task fails.
| Field | Type | Description |
|---|---|---|
| code | integer | Application result code; successful responses use 0 or 200. |
| message | string | Human-readable message or error detail when present. |
| data.task_id | string | Task ID used in the status endpoint path. |
| data.status | string | not_started, running, finished, or failed. |
| data.created_time | string | Task creation time in date-time format. |
| data.progress | integer | Task progress from 0 to 100, when included in the response. |
| data.files[] | array | All output files from a successful task, in response order. |
| data.files[].file_url | string | Public URL for a generated video. |
| data.files[].file_type | string | File type, such as video. |
| data.error_message | string | null | Failure detail when status is failed. |
Task Lifecycle
Continue querying while the status is not_started or running. End polling at finished or failed, then process the output files or error details respectively.
not_startedThe task was accepted and is waiting to begin.
runningGeneration is in progress. Continue polling the same task_id.
finishedGeneration succeeded. Read every video URL from data.files[].file_url.
failedGeneration stopped with an error. Read data.error_message and stop polling.
Polling and Errors
- AuthenticationFor a 401 response, check the Bearer API key in Authorization, update the credentials, and retry.
- ValidationFor a 400 response, use the response details to check required fields, parameter ranges, and available credits, then adjust and resubmit.
- Network and timeoutIf a status query encounters a network error or timeout, retain the original task_id and retry the query, then handle the result according to the returned task status.
- Polling intervalPoll status with a 2-second base interval, and gradually increase the interval for longer tasks.
- Terminal statesContinue only for not_started or running. Stop immediately on finished or failed.
- Callback optionProvide callback_url at the request top level to receive the final flat task object; polling remains available if delivery fails.
Endpoint limits
| Specification | Value | Details |
|---|---|---|
| Input mode | First-frame image with optional text prompt | image_urls requires exactly one image; prompt is optional. |
| Output | Video | Returns an asynchronous task ID. |
| Duration | 3–15 seconds | Integer range, default 5 seconds. |
| Resolution | 1080p | Fixed by the Pro tier; not a request field. |
| Billing basis | Output seconds × 22 credits/sec | Default 5s is 110 credits ($0.55). |
Related Models
Kling 3.0 Turbo Pro Image to Video API frequently asked questions
What is the Kling 3.0 Turbo Pro Image to Video API?
Kling 3.0 Turbo Pro Image to Video is a Kuaishou (Kling AI) model for generating video from a first-frame image. It turns exactly one still image and an optional prompt into 1080p video with deep detail restoration, native audio-visual lip sync, and cinematic camera direction. Built on Kling 3.0 multi-shot storytelling and physics-aware motion modeling, it preserves the source subject, composition, and material texture while adding coherent motion and shot pacing. You can call it programmatically or try it from the playground above. Without multi_prompt, duration is 3–15 seconds. With multi_prompt, omitting top-level duration also allows a shot total of 1 or 2 seconds.
How many single reference images does Kling 3.0 Turbo Pro Image to Video need?
It needs exactly one public image URL as the first frame. That image anchors the opening composition and subject appearance, with aspect ratio following the source; optional prompt or multi_prompt guidance then shapes motion, camera, and sound.
What input material quality tips apply to Kling 3.0 Turbo Pro Image to Video?
Prefer a sharp, evenly lit first frame with clean edges and a clear subject. Restate face, wardrobe, product materials, and key structures in the prompt to extend identity and physical texture; call out environment elements you want to keep.
How do I control camera move amplitude in Kling 3.0 Turbo Pro Image to Video?
Write specific camera direction, path, and speed in the prompt, such as a slow lateral glide followed by a slight tilt up. More concrete amplitude language yields closer staging; in multi-shot mode, assign framing and moves per shot.
How does Kling 3.0 Turbo Pro Image to Video handle long-action story narrative?
multi_prompt accepts 1–6 shots. Each shot needs a nonblank prompt and an optional integer duration of 1–15 seconds, defaulting to 5. The sum must not exceed 15 seconds. Omit top-level duration to use that sum, including totals of 1 or 2 seconds. If supplied, top-level duration must be an integer from 3 to 15 and equal the sum. multi_prompt cannot be combined with a nonblank top-level prompt. Edit storyboards in JSON mode; switching to the form keeps JSON mode and all shot settings. Keep character and setting descriptions consistent across shots.
Does Kling 3.0 Turbo Pro Image to Video allow commercial licensing?
Yes, commercial use is allowed under standard Kling AI licensing and the platform service terms. Before ads, ecommerce assets, or client delivery, confirm the authorization scope for your account plan and generated outputs.
How does Kling 3.0 Turbo Pro Image to Video credit use compare with Standard?
Pro Image to Video is fixed at 1080p and billed at 22 credits per second, while Standard Image to Video in the same family is fixed at 720p and billed at 17 credits per second. For equal duration, Pro costs more credits in exchange for studio-grade full HD; draft on Standard, then switch to Pro for finals.















