A continuous five-second intimate portrait of the same elderly female tailor in her quiet workroom. Her hands remain gently resting on the folded fabric on the table. She slowly raises her gaze from the cloth toward someone just beside the camera and gives a small warm smile; her shoulders rise subtly with a breath. Preserve her age, face, glasses, hairstyle, fingers and clothing exactly. A curtain moves very slightly at the edge of the softly lit window. Fixed camera, natural expression and skin, no talking, no cuts.
Kling 1.6 Standard Image to Video API
kwaivgi/kling-video/v1.6/standard/image-to-videoKling 1.6 Standard Image to Video transforms still images into fluid 720p video clips with start_image_url first-frame animation or multi-image Elements consistency across 5-second and 10-second outputs. It preserves character likeness, texture details, and scene composition while applying coherent camera motion and natural real-world physics.

Playground uploads: JPG, PNG or WebP, up to 10 MiB per file. Use JSON mode for HTTP(S) URLs.
Examples
REST API Spec
Quick Start
Submit an endpoint request and poll for status. Replace example URLs with your accessible files.
Step 1: Configure API authentication
Obtain an API key from the dashboard and include Authorization: Bearer <API_KEY> in every request header.
- Submission Endpoint
- POST
https://api.vidgo.ai/api/generate/submit - Auth Header
- Authorization: Bearer VIDGO_API_KEY
Step 2: Submit a generation task
POST /api/generate/submit. Pass model and optional callback_url at the root level, with generation parameters inside input.
REQUEST_BODY=$(cat <<'JSON'
{
"model": "kwaivgi/kling-video/v1.6/standard/image-to-video",
"input": {
"prompt": "A quiet forest in morning light, with a slow camera pan.",
"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 task completion
Poll status with task_id; continue while not_started or running, and stop on finished or failed. Read video URLs from data.files[].file_url on success, or data.error_message on failure.
Status Endpoint
GET https://api.vidgo.ai/api/generate/status/{task_id}Poll status using task_id; continue while not_started or running, stop when 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-23T08:00:00"
}
}{
"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 end-to-end script example
Expand to view a production-ready script with retry logic, 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-video/v1.6/standard/image-to-video",
"input": {
"prompt": "A quiet forest in morning light, with a slow camera pan.",
"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)
Supported generation parameters inside the input object when submitting a POST request to /api/generate/submit:
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| prompt | string | Required | — | Required nonblank string, at most 2,500 Unicode characters after trimming. |
| duration | integer | Required | — | Required integer: 5 or 10 seconds. No strings, booleans or fractional durations. No API default; the playground starts at 5 seconds. |
| aspect_ratio | string | Optional | — | Optional: 1:1, 16:9 or 9:16. No default. Not supported for Standard first-frame animation; available in Elements. |
| negative_prompt | string | Optional | — | Optional string, at most 2,500 Unicode characters. |
| cfg_scale | number | Optional | — | Optional finite number from 0 to 1. No default. Not supported in Elements. |
| start_image_url | string | Conditional | — | Required HTTP(S) first-frame image URL for frame animation; mutually exclusive with image_urls. |
| image_urls | array | Conditional | — | Elements requires 1–4 HTTP(S) reference image URLs; mutually exclusive with first frame, last frame and cfg_scale. |
Response Fields (query result)
Task details returned when polling GET /api/generate/status/{task_id}:
| Field | Type | Description |
|---|---|---|
| code | integer | Business response code, 200 on success. |
| data.task_id | string | Globally unique asynchronous task identifier. |
| data.status | string | Execution status: not_started, running, finished, or failed. |
| data.files | array | Generated video files upon completion, each with file_url and file_type. |
| data.error_message | string | null | Error description if task fails. |
Task Lifecycle
Clients should inspect the status field and stop polling when reaching finished or failed:
not_startedTask received and queued for execution.
runningGeneration is in progress.
finishedGeneration complete; retrieve video URL from data.files.
failedGeneration failed; inspect data.error_message; deducted credits are refunded per standard policy.
Polling & Error Handling
- Recommended Polling IntervalStart polling every 2–3 seconds, increasing to 5 seconds as the task continues, to avoid excessive requests.
- Network Fluctuations & RetriesIf status polling encounters 5xx or timeouts, the task is still running; retry querying after a brief pause.
- Asynchronous Webhook CallbackProvide callback_url at the root of the request payload to receive the completed task result automatically via POST.
Specifications
| Specification | Value | Description |
|---|---|---|
| Model ID | kwaivgi/kling-video/v1.6/standard/image-to-video | Root-level model field. |
| Duration | 5 / 10s | Required integer: 5 or 10 seconds. No strings, booleans or fractional durations. No API default; the playground starts at 5 seconds. |
Kling 1.6 Standard Image to Video API frequently asked questions
What is the Kling 1.6 Standard Image to Video API?
Kling 1.6 Standard Image to Video is an image-to-video diffusion model developed by Kwaivgi. It converts static input images and descriptive prompts into fluid 720p video clips, offering single-frame start_image_url animation and multi-image Elements asset consistency. Built on modern multi-modal generative architecture, it retains source identity, color grading, and structural fidelity while synthesizing realistic motion and cinematography. You can call it programmatically or try it from the playground above.
What input image workflows does Kling 1.6 Standard Image to Video support?
The endpoint supports two dedicated workflows: first-frame animation via start_image_url for animating a single image, and Elements multi-image reference via image_urls (1 to 4 images) for preserving character and style consistency. These two workflows are mutually exclusive in a single request.
Can I specify a custom aspect ratio in Kling 1.6 Standard Image to Video?
When using start_image_url first-frame animation, the model automatically inherits the aspect ratio of the source image and does not accept a custom aspect_ratio parameter. When using the Elements workflow with image_urls, you can explicitly configure 16:9, 9:16, or 1:1.
Does Kling 1.6 Standard Image to Video support end frame guidance?
No. The Standard series only supports start_image_url for single-frame animation. If your production workflow requires defining both a starting frame and an ending frame for targeted motion transitions, please use the Kling 1.6 Pro Image to Video endpoint.
What are the key advantages of the Elements workflow in Kling 1.6 Standard Image to Video?
The Elements workflow accepts between 1 and 4 reference images, allowing you to feed multiple perspectives or poses of the same subject. The model references these images to synthesize novel angles and movements while minimizing character drift and visual deformation.
How is Kling 1.6 Standard Image to Video priced?
Usage is billed per second of generated video at 9 credits per second ($0.045/s). Generating a 5-second clip costs 45 credits ($0.225), and a 10-second clip costs 90 credits ($0.450). If a task fails or terminates prematurely, credits are fully refunded.
What image file formats and size constraints are supported?
The interactive playground supports JPG, PNG, and WebP files up to 10 MiB each. When using the API directly, pass publicly accessible HTTP(S) URLs pointing directly to valid image files with correct MIME types.