Image-to-Video
Generate video from a first frame or first-and-last frames plus prompt and optional Elements with Kling 3.0. Async task API: submit, poll, then download.
- First frame: one first-frame image + optional text / Elements
- First & last frames: first-frame image + last-frame image + optional text / Elements
Supports multi-shot storytelling, native audio, 720p / 1080p / 4k resolution, and 3–15 second duration.
This is an async task-based API: submit a request to receive a task id, poll for status, then download the video when complete.
Only Kling 3.0 is supported.
Note: First-frame and first-and-last-frame modes are supported. Last-frame-only generation is not supported.
Base URL
https://api.autorouter.top— Production
Authentication
BearerAuth: http (bearer)
Authenticate using a Bearer Token.
Format: Authorization: Bearer sk-xxxxxx
Endpoints
POST /kling/image-to-video/kling-3.0
Create Video Generation Task
Create a video generation task from a first frame or first-and-last frames.
Request Body
Content-Type: application/json
Example (first frame):
{
"contents": [
{
"type": "prompt",
"text": "A girl sat on the train, looking out the window with a melancholic expression, her head swaying with the train."
},
{
"type": "first_frame",
"url": "https://example.com/first.png"
}
],
"settings": {
"resolution": "4k",
"duration": 10,
"audio": "off",
"multi_shot": false
},
"options": {
"callback_url": "https://xxx/callback",
"external_task_id": "",
"watermark_info": {
"enabled": false
}
}
}Example (first & last frames + element):
{
"contents": [
{
"type": "prompt",
"text": "A girl sat on the train, looking out the window with a melancholic expression, her head swaying with the train."
},
{
"type": "first_frame",
"url": "https://example.com/first.png"
},
{
"type": "last_frame",
"url": "https://example.com/last.png"
},
{
"type": "element",
"element_id": "163",
"id": "element_1"
}
],
"settings": {
"resolution": "1080p",
"duration": 10,
"audio": "native",
"multi_shot": false
},
"options": {
"callback_url": "https://xxx/callback",
"external_task_id": "",
"watermark_info": {
"enabled": true
}
}
}Properties:
| Name | Type | Required | Default | Enum | Description |
|---|---|---|---|---|---|
contents | object[] | Yes | - | - | Reference inputs (prompts, images, Elements, etc.) |
contents[].type | string | Yes | - | prompt, first_frame, last_frame, element | Input type |
settings | object | No | - | - | Output config such as resolution and duration |
settings.multi_shot | boolean | No | true | - | Whether to generate multi-shot video |
settings.audio | string | No | off | native, off | Whether to generate audio |
settings.resolution | string | No | 720p | 720p, 1080p, 4k | Video resolution |
settings.duration | integer | No | 5 | 3–15 | Duration in seconds |
options | object | No | - | - | General config such as callback URL and watermark |
options.callback_url | string | No | - | - | Callback URL for task status changes |
options.external_task_id | string | No | - | - | Custom task ID; must be unique within the account |
options.watermark_info | object | No | - | - | Whether to also generate a watermarked result |
contentsobject[](Required)
Reference input collection. Example format:
[
{
"type": "prompt",
"text": "string"
},
{
"type": "first_frame",
"url": "string"
},
{
"type": "last_frame",
"url": "string"
},
{
"type": "element",
"element_id": "string",
"id": "string"
}
]Input type:
prompt: Text promptfirst_frame: First-frame imagelast_frame: Last-frame imageelement: Element
{
"type": "prompt",
"text": "string"
}text: Prompt content, max 3072 characters (recommended ≤ 2500)- Multi-shot format:
"shot n, m, words; shot n, m, words;"(separated by standard semicolons), where:n: shot sequence number (1–6 shots supported)m: shot duration in seconds (each shot ≥ 1s; sum must equal total video duration)words: shot prompt (max 512 characters)
- Reference an Element in the prompt with
@xxx, e.g.@Zhang - Avoid Element names that are substrings of each other (e.g.
@Zhangand@ZhangSan) - Avoid Element names that overlap with prompt content (e.g. do not use
@gmailif the prompt containswang@gmail.com)
{
"type": "first_frame",
"url": "string"
}first_frameis required;last_frameis optionalurl: Image URL or Base64- Formats:
.jpg,.jpeg,.png - Size: max 50MB
- Dimensions: width and height ≥ 300px; aspect ratio between
1:2.5and2.5:1 - Supports first-frame and first-and-last-frame generation; last-frame-only is not supported
{
"type": "element",
"element_id": "string",
"id": "string"
}element_id: Element ID returned by the Element-related APIid: Input index ID used in the prompt (e.g.@element_1); must be unique within the same task- At most 3 Elements per task
settingsobject(Optional)
Output configuration such as resolution and duration.
Whether to generate multi-shot video. Default true.
When set to false, multi-shot prompts will not produce multi-shot output.
Whether to generate audio for the video. Default off.
native: Include native audio matching the visualsoff: No audio
Output video resolution. Default 720p.
720p: 720P output1080p: 1080P output4k: 4K output
Video duration in seconds. Default 5.
Options: 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
optionsobject(Optional)
General configurations such as callback URL and watermark.
{
"callback_url": "https://example.com/cb",
"external_task_id": "string",
"watermark_info": {
"enabled": false
}
}Callback URL for task result notifications. If set, the server sends a notification when the task status changes.
Custom task ID. Does not overwrite the system-generated task ID and can be used for querying. Must be unique within the account.
Whether to also generate a watermarked result, controlled by enabled:
{
"enabled": false
}true: Include watermarked resultfalse(default): No watermark
Custom watermarks are not supported.
Responses
200: Task created successfully
Content-Type: application/json
Request Example
curl -X POST "https://api.autorouter.top/kling/image-to-video/kling-3.0" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-xxxxxx" \
-d '{
"contents": [
{
"type": "prompt",
"text": "A girl sat on the train, looking out the window with a melancholic expression, her head swaying with the train."
},
{
"type": "first_frame",
"url": "https://example.com/first.png"
}
],
"settings": {
"resolution": "4k",
"duration": 10,
"audio": "off",
"multi_shot": false
}
}'Response Example
{
"code": 0,
"message": "string",
"request_id": "string",
"data": {
"id": "string",
"status": "submitted",
"create_time": 1781080778802,
"update_time": 1781080794151,
"external_id": "string"
}
}Response fields:
| Name | Type | Description |
|---|---|---|
code | integer | Error code; 0 means success |
message | string | Error message |
request_id | string | Request ID generated by the system |
data.id | string | System-generated task ID |
data.status | string | Task status: submitted, processing, succeeded, failed |
data.create_time | integer | Task creation time, Unix timestamp (ms) |
data.update_time | integer | Task update time, Unix timestamp (ms) |
data.external_id | string | Custom task ID, if any |
GET /kling/tasks
Query Video Generation Task
Query async task status and results by task ID or custom task ID.
- Use either
task_idsorexternal_task_ids, not both - Batch queries are supported; separate multiple IDs with
, - Generated results are cleared after about 30 days; save them promptly
Query Params
| Name | Type | Required | Description |
|---|---|---|---|
task_ids | string | No | System-generated task IDs, comma-separated |
external_task_ids | string | No | Custom task IDs, comma-separated |
Responses
200: Task queried successfully
Content-Type: application/json
Request Example
curl -X GET "https://api.autorouter.top/kling/tasks?task_ids={id}" \
-H "Authorization: Bearer sk-xxxxxx"Response Example
{
"code": 0,
"message": "string",
"request_id": "string",
"data": [
{
"id": "893605946402811985",
"status": "succeeded",
"message": "string",
"create_time": 1781080778802,
"update_time": 1781080794151,
"external_id": "string",
"outputs": [
{
"type": "video",
"id": "string",
"url": "string",
"watermark_url": "string",
"duration": "10"
}
],
"billing": [
{
"charge_type": "cash",
"cash_type": "balance",
"amount": "string",
"package_type": "video",
"list_price": "string"
}
]
}
]
}Response fields:
| Name | Type | Description |
|---|---|---|
code | integer | Error code; 0 means success |
message | string | Error message |
request_id | string | Request ID generated by the system, for tracing and troubleshooting |
data | object[] | Task list |
data[].id | string | Task ID being queried |
data[].status | string | Task status: submitted, processing, succeeded, failed |
data[].message | string | Status message; failure reason when failed (e.g. content moderation) |
data[].create_time | integer | Task creation time, Unix timestamp (ms) |
data[].update_time | integer | Task update time, Unix timestamp (ms) |
data[].external_id | string | Custom task ID, if any |
data[].outputs | object[] | Generated results; fields vary by type |
data[].billing | object[] | Billing details |
statusstring
Task status:
submitted: Submittedprocessing: Processingsucceeded: Succeededfailed: Failed
Recommended poll interval: 3–5 seconds until status is succeeded or failed.
outputsobject[]
Generated results. Fields depend on type. Possible values: image, video, audio, element, voice. Image-to-video success typically returns type=video.
| Name | Type | Description |
|---|---|---|
type | string | Fixed as video |
id | string | Video ID generated by the system |
url | string | Result URL (hotlink-protected; cleared after ~30 days; save promptly) |
watermark_url | string | Watermarked result URL (hotlink-protected) |
duration | string | Generated video duration in seconds |
| Name | Type | Description |
|---|---|---|
type | string | Fixed as image |
url | string | Result URL (hotlink-protected; cleared after ~30 days) |
watermark_url | string | Watermarked image download URL (hotlink-protected) |
group_id | string | Only present for grouped images; marks group relationship |
| Name | Type | Description |
|---|---|---|
type | string | Fixed as audio |
id | string | Audio ID generated by the system |
mp3_url | string | MP3 result URL (hotlink-protected; cleared after ~30 days) |
wav_url | string | WAV result URL (hotlink-protected; cleared after ~30 days) |
mp3_duration | string | MP3 duration in seconds |
wav_duration | string | WAV duration in seconds |
| Name | Type | Description |
|---|---|---|
type | string | Fixed as voice |
id | string | Audio ID generated by the system |
name | string | Audio name |
url | string | Material download link |
owned_by | string | Voice source: kling for official library, numbers for creator ID |
status | string | Status: succeeded, deleted |
| Name | Type | Description |
|---|---|---|
type | string | Fixed as element |
id | string | Element ID generated by the system |
name | string | Element name |
description | string | Element description |
element_type | string | Element type: video_character_elements, multi_image_elements |
references | object[] | Related materials |
references[].type | string | Material type: image, video, voice |
references[].role | string | Material role; image: frontal / reference; video and voice: refer |
references[].url | string | Material download link |
references[].id | string | Voice ID (when type=voice) |
references[].name | string | Voice name (when type=voice) |
references[].owned_by | string | Voice source (when type=voice) |
owned_by | string | Element source: kling for official library, numbers for creator ID |
status | string | Status: succeeded, deleted |
tags | object[] | Element tags |
tags[].id | integer | Tag ID |
tags[].name | string | Tag name |
tags[].description | string | Tag description |
billingobject[]
Billing details.
Account charge type:
cash: Balance deductionunit: Resource package deduction
Balance type; only present when charge_type=cash:
balance: Official quotatest_balance: Test quota
Deduction amount. When charge_type=cash, the discounted balance price; when charge_type=unit, the resource package units deducted (decimal string).
Resource package type; only present when charge_type=unit. Enum: video, image, audio.
List price for balance deduction; only present when charge_type=cash.
Error Handling
HTTP 400 Parameter Errors
| Scenario | Suggestion |
|---|---|
| Missing first-frame image | Provide at least one type=first_frame |
| Last frame only | Not supported; include a first frame |
| More than 3 Elements | Use at most 3 Elements |
| Invalid image format / size | Follow first_frame / last_frame limits |
Invalid duration / resolution | Use documented enum values |
| Multi-shot duration mismatch | Ensure sum of shot durations equals settings.duration |
HTTP 401 / 403 Auth Errors
401 Unauthorized: Invalid or expired API Key403 Forbidden: API Key is not allowed to access this model
HTTP 402 Insufficient Balance
Insufficient balance. Please top up in the AutoRouter console.
Task failed Status
| Cause | Suggestion |
|---|---|
| Content moderation failed | Adjust the prompt or change the reference image |
| Image URL unreachable | Ensure public access, or use Base64 |
| Invalid parameter combination | Follow the Request Body rules |
When a task fails, AutoRouter automatically refunds your account.
Text-to-Video
Generate video from a text prompt. Supports multi-shot storytelling, native audio, 720p / 1080p / 4k resolution, and 3–15 second duration. This is an async task-based API: submit a request to receive a task id, poll for status, then download the video when complete. Only Kling 3.0 is supported.
Omni
Unified Omni video generation with Kling 3.0 Omni. Combine prompts, images, Elements, and reference videos. Async task API: submit, poll, then download.