Animate this exact single garden snail in one continuous five-second natural-history macro shot. Its TWO upper eyestalks slowly extend forward and slightly upward from their existing positions; the two short lower feelers remain small. The snail's soft foot creeps forward just a few millimeters along the moss, carrying the same spiral shell without changing its shape. Keep the snail attached to the twig, the shell markings and damp moss stable. Locked macro camera, shallow depth of field, very small believable movement. No added tentacles, no second animal, no scene changes or text.
Kling 2.5 Turbo Pro Image to Video API
kwaivgi/kling-v2.5-turbo-pro/image-to-videoKling 2.5 Turbo Pro Image to Video generates video from images and a text prompt. Guide a 5- or 10-second clip with a start frame, an end frame, or both, and describe subject movement, scene changes and camera motion in your prompt.
622/2,500

Provide a start frame, an end frame, or both.
Examples
REST API Reference
Quick Start
Submit a task and query its status. URLs using example.com or your-domain.com are placeholders; replace image and callback URLs with your own publicly accessible URLs. Output file URLs are illustrative.
Step 1: Set up authentication
Create an API key in the dashboard and attach Authorization: Bearer <API_KEY> when submitting a task.
- Submit Endpoint
- POST
https://api.vidgo.ai/api/generate/submit - Authorization Header
- Authorization: Bearer VIDGO_API_KEY
Step 2: Submit a task
POST /api/generate/submit: kwaivgi/kling-v2.5-turbo-pro/image-to-video
REQUEST_BODY=$(cat <<'JSON'
{
"model": "kwaivgi/kling-v2.5-turbo-pro/image-to-video",
"input": {
"prompt": "A slow camera pan across a sunlit garden.",
"duration": 5,
"start_image_url": "https://example.com/start-frame.png"
}
}
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"Step 3: Poll for completion
Poll with task_id while status is not_started or running, and stop at finished or failed. On success, read data.files[].file_url; on failure, read data.error_message.
Status Endpoint
GET https://api.vidgo.ai/api/generate/status/{task_id}Poll with task_id while status is not_started or running, and stop at finished or failed. On success, read data.files[].file_url; on failure, read data.error_message.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "task-example",
"status": "not_started",
"created_time": "2026-09-24T00:00:00Z"
}
}{
"code": 200,
"data": {
"task_id": "task-example",
"status": "finished",
"files": [
{
"file_type": "video",
"file_url": "https://example.com/output.mp4"
}
],
"created_time": "2026-09-23T00:00:00Z"
}
}Complete executable script
Expand to review an end-to-end script with automatic polling, error handling, and timeout safeguards.
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "kwaivgi/kling-v2.5-turbo-pro/image-to-video",
"input": {
"prompt": "A slow camera pan across a sunlit garden.",
"duration": 5,
"start_image_url": "https://example.com/start-frame.png"
}
}
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 (input object)
Place generation parameters in input, with model and optional callback_url at the request root. Use standard JSON types; unsupported input fields are rejected.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| prompt | string | Yes | - | Required nonblank string, maximum 2,500 Unicode characters after trimming. |
| start_image_url | string | At least one | - | First-frame public HTTP(S) URL without credentials or whitespace. Provide start_image_url, end_image_url, or both. Omit when unused; empty strings and null are rejected. |
| end_image_url | string | At least one | - | Last-frame public HTTP(S) URL without credentials or whitespace. Provide start_image_url, end_image_url, or both. Omit when unused; empty strings and null are rejected. |
| duration | integer | No | 5 | Duration accepts integer values 5 or 10 and defaults to 5 when omitted. Numeric 5.0 and 10.0 are accepted as integer values; strings, booleans, non-integer values and null are rejected. |
| aspect_ratio | string | No | - | aspect_ratio is an optional string. The API reference does not specify an enum or default; omit it when unused. |
| negative_prompt | string | No | - | negative_prompt is an optional string describing content to avoid. The API reference does not specify a length limit for it; the 2,500-character limit applies only to prompt. |
Response Fields (Status Query)
Details returned by GET /api/generate/status/{task_id}:
| Field | Type | Description |
|---|---|---|
| code | integer | HTTP/business response status code (200 indicates success). |
| data.task_id | string | Globally unique task identifier. |
| data.status | string | Task lifecycle state: not_started, running, finished, or failed. |
| data.files | array | Array of output assets containing file_url and file_type upon completion. |
| data.error_message | string | null | Error diagnostic details if the task status is failed. |
Task Lifecycle
Clients should poll status until reaching either the finished or failed terminal state:
not_startedQueued
runningGenerating
finishedReady
failedFailed
Polling & Error Handling
- Polling frequencyStart polling with a 2 to 3-second interval, gradually increasing to 5 seconds for extended takes.
- Network resiliencyTransient 5xx responses or timeouts do not signify task failure; retry status requests after a short backoff.
- Webhook callbacksProvide a top-level callback_url in your submission payload to receive completion notifications automatically.
Specifications
| Specification | Value | Description |
|---|---|---|
| Model | kwaivgi/kling-v2.5-turbo-pro/image-to-video | |
| Duration | 5 / 10 s | Duration accepts integer values 5 or 10 and defaults to 5 when omitted. Numeric 5.0 and 10.0 are accepted as integer values; strings, booleans, non-integer values and null are rejected. |
Kling 2.5 Turbo Pro Image to Video API frequently asked questions
What is the Kling 2.5 Turbo Pro Image to Video API?
Kling 2.5 Turbo Pro Image to Video generates video from images and a text prompt. Guide a 5- or 10-second clip with a start frame, an end frame, or both, and describe subject movement, scene changes and camera motion in your prompt. Try it in the playground above or submit tasks through the REST API.
What video durations does Kling 2.5 Turbo Pro Image to Video support?
The model supports 5-second and 10-second video durations. Pass duration as an integer value of 5 or 10; if omitted from your payload, the default duration is 5 seconds.
How does dual-frame keyframe control work in Kling 2.5 Turbo Pro Image to Video?
Yes. Supply both start_image_url and end_image_url to guide the first and last frames of the video. A prompt is still required.
Can I generate video using only a single image in Kling 2.5 Turbo Pro Image to Video?
Yes. Provide either start_image_url or end_image_url together with a prompt. An end frame guides the closing image; it does not specify reverse playback.
What are the input image requirements for Kling 2.5 Turbo Pro Image to Video?
Provide images through publicly accessible HTTP(S) URLs without credentials or whitespace. The API reference does not list supported image formats, file sizes or resolution limits, so it does not confirm a specific format list.
How is Kling 2.5 Turbo Pro Image to Video priced?
Pricing is 42 credits ($0.210) for 5-second generations and 84 credits ($0.420) for 10-second generations. If a task fails to generate a valid output video due to server or processing errors, all consumed credits are automatically refunded.
How do reference images guide Kling 2.5 Turbo Pro Image to Video?
Use start_image_url to guide the opening frame, end_image_url to guide the closing frame, or both. Describe the desired motion in prompt, then review the subject and scene in the generated result.
When should I choose Kling 2.5 Turbo Pro Image to Video over other models?
Use this endpoint when you have product images, portraits or storyboard frames to guide a 5- or 10-second video alongside a text prompt. It accepts a start frame, an end frame, or both, with pricing based on duration.