Steam rises gently from the hot coffee, swirling in the morning light, subtle camera drift
Kling 3.0 Turbo Standard Image to Video API
kwaivgi/kling-v3-turbo-std/image-to-videoKling 3.0 Turbo Standard Image to Video animates a single first-frame image into 3–15 second 720p video, with composition-true subject preservation, native audio-visual lip sync, and up to 6-shot storyboard continuity. It keeps the source subject identity and framing intact while adding directed motion and matching dialogue sound. 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-std/image-to-video",
"input": {
"image_urls": [
"https://cdn.vidgo.ai/apis/models/kwaivgi/kling-v3-turbo-std/image-to-video/v1/01/input-01.png"
],
"prompt": "Steam rises gently from the hot coffee, swirling in the morning light, subtle camera drift",
"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-std/image-to-video",
"input": {
"image_urls": [
"https://cdn.vidgo.ai/apis/models/kwaivgi/kling-v3-turbo-std/image-to-video/v1/01/input-01.png"
],
"prompt": "Steam rises gently from the hot coffee, swirling in the morning light, subtle camera drift",
"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 | 720p | Fixed by the Standard tier; not a request field. |
| Billing basis | Output seconds × 17 credits/sec | Default 5s is 85 credits ($0.425). |
Related Models
Kling 3.0 Turbo Standard Image to Video API frequently asked questions
What is the Kling 3.0 Turbo Standard Image to Video API?
Kling 3.0 Turbo Standard Image to Video is a Kuaishou (Kling AI) model for animating a single first-frame image into short video. It generates 720p clips from exactly one first-frame image plus an optional prompt, with composition-true subject preservation, native audio-visual lip sync, and up to 6-shot storyboard continuity. Built on Kling 3.0 Turbo’s high-throughput generation and multi-shot consistency, it keeps the source subject identity and framing intact while adding directed motion and matching dialogue sound. 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 does Kling 3.0 Turbo Standard Image to Video use the first frame?
Provide exactly one public image URL in image_urls; that still becomes the opening frame and composition anchor. Optionally add a prompt for camera, action, and sound, or switch to multi_prompt for storyboard shots—see the Parameters table on this page for field details.
How does Kling 3.0 Turbo Standard Image to Video keep character consistency?
The model locks face, wardrobe, and framing from the first-frame image and carries character and setting cues across multi-shot cuts. Use a clear subject still and spell out appearance and clothing in the prompt to further stabilize identity across shots.
How do I configure multi_prompt on Kling 3.0 Turbo Standard Image to Video?
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.
How does aspect-ratio inheritance work on Kling 3.0 Turbo Standard Image to Video?
The output aspect ratio follows the input image; aspect_ratio has no effect on this endpoint.
Does Kling 3.0 Turbo Standard Image to Video include native audio?
Yes—results include native audio-visual sync with dialogue lip shapes aligned to speech. Write spoken lines, tone, or ambience cues in the prompt to further guide the soundtrack.
How should I choose Kling 3.0 Turbo Standard Image to Video?
Pick this Standard tier when you already have a still and want fast, cost-efficient drafts at fixed 720p (17 credits/sec). For the same first-frame workflow at higher delivery clarity, use Kling 3.0 Turbo Pro Image to Video (fixed 1080p); if you have no still and start from copy alone, choose the matching Text to Video variant.















