One continuous five-second documentary portrait of the same adult ramen cook in the small late-night kitchen. With one hand at each end of a short bundle of pale fresh noodle strands, he gently lifts and gives the suspended middle one small downward bounce, loosening the strands without releasing them. His hands stay apart, strands remain connected between the two grips. Steam curls upward from the pot below. Preserve his face, rolled sleeves, apron and kitchen. Fixed waist-up view, warm practical light, natural restrained motion. No cuts, no additional people, no lettering.
Kling 2.1 Standard Image to Video API
kwaivgi/kling-video/v2.1/standard/image-to-videoKling 2.1 Standard Image to Video transforms still images into fluid 720p dynamic video clips from text prompts and a starting frame across 5-second and 10-second durations. It preserves character facial likeness, textural fidelity, and scene lighting while introducing expressive physical movements and smooth cinematic camera pans.
581/5,000

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-video/v2.1/standard/image-to-video
REQUEST_BODY=$(cat <<'JSON'
{
"model": "kwaivgi/kling-video/v2.1/standard/image-to-video",
"input": {
"prompt": "A slow camera pan across a sunlit garden.",
"start_image_url": "https://example.com/start-frame.png",
"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"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-video/v2.1/standard/image-to-video",
"input": {
"prompt": "A slow camera pan across a sunlit garden.",
"start_image_url": "https://example.com/start-frame.png",
"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
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 5,000 Unicode characters after trimming. |
| start_image_url | string | Yes | - | Required first-frame public HTTP(S) URL with a hostname and no credentials or whitespace. |
| duration | integer | No | 5 | Integer 5 or 10 seconds; defaults to 5 when omitted. Strings, booleans, fractional durations and null are rejected. |
| negative_prompt | string | No | - | Optional string describing content to avoid. |
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-video/v2.1/standard/image-to-video | |
| Duration | 5 / 10 s | Integer 5 or 10 seconds; defaults to 5 when omitted. Strings, booleans, fractional durations and null are rejected. |
Kling 2.1 Standard Image to Video API frequently asked questions
What is the Kling 2.1 Standard Image to Video API?
Kling 2.1 Standard Image to Video is a Kwaivgi model for image-to-video generation. It animates static starting frames into fluid 720p dynamic video clips across 5-second and 10-second durations with nuanced text prompt and camera movement control. Built on spatial-temporal generative diffusion architecture, it preserves the starting image's subject identity, costume textures, and scene lighting while synthesizing physically realistic actions. You can call it programmatically or try it from the playground above.
What output resolution does Kling 2.1 Standard Image to Video produce?
Kling 2.1 Standard Image to Video outputs high-definition 720p video. The generated video preserves the aspect ratio and compositional geometry of your input starting image, making it suitable for both 16:9 widescreen and 9:16 vertical displays.
Does Kling 2.1 Standard Image to Video support an end frame?
Kling 2.1 Standard Image to Video accepts only start_image_url and does not support end_image_url. If your workflow requires dual-frame interpolation between a starting image and a designated closing frame, switch to Kling 2.1 Pro Image to Video on this platform.
What video durations can you generate with Kling 2.1 Standard Image to Video?
You can generate either 5-second or 10-second videos by setting the duration parameter to integer 5 or 10. When omitted, duration defaults to 5 seconds. Fractional durations or other values are rejected before generation begins.
How is Kling 2.1 Standard Image to Video priced?
Pricing is charged per completed video: 30 credits ($0.150) for a 5-second video, and 60 credits ($0.300) for a 10-second video. Credits are deducted upon submission and refunded automatically if generation terminates in a failed state.
What image formats and URL requirements apply to Kling 2.1 Standard Image to Video?
The playground accepts JPG, PNG, and WebP image uploads up to 10 MiB. When submitting via REST API, supply a publicly accessible HTTP(S) URL in start_image_url that points directly to the image file without credentials or whitespace.
How does negative_prompt improve Kling 2.1 Standard Image to Video results?
The negative_prompt field allows you to specify visual artifacts, unnatural limb deformations, blurriness, or unwanted camera shakes to suppress during generation, helping ensure clean and stable physical motion.
What are the key differences between Kling 2.1 Standard and Kling 2.1 Pro?
Kling 2.1 Standard generates 720p video from a single starting frame at 30 credits for 5s and 60 credits for 10s. Kling 2.1 Pro upgrades output resolution to native 1080p full HD, adds optional end_image_url dual-frame interpolation, and costs 55 credits for 5s and 110 credits for 10s.