Kling · Video
Image / First-Last Frame VideoNEW
📌 What is this:Given a first-frame image (optionally a last frame too), generate a video that starts from the first frame and transitions toward the last.
💡 When to use:Use to animate an image or to precisely control the opening / closing frames. The aspect ratio follows the first frame; aspectRatio is ignored.
Endpoints
| Usage | Method | Path |
|---|---|---|
| Submit task | POST | /api/cqt/generator/kling |
| Query Result | GET | /api/cqt/info/kling?id={taskId} |
⏱ Recommended polling interval:Generation takes ~1-3 min; poll every 10-15s until status = succeeded / failed.
Sub-models
Sub-models that support this mode. The tiers column is credits/sec (generateAudio → = audio tier, videoUrls → = with-reference-video tier). Resolutions / durations not listed are rejected at submit (no charge).
| model | Usage | Materials | Duration (sec) | Tier price (credits/sec) |
|---|---|---|---|---|
| kling-3.0-turbo | 3.0 Turbo; same price for all modes | 1 first frame + ≤1 last frame | 3~15 | 720P=80 / 1080P=100 / 2K=120 / 4K=144 |
| kling-3.0-omni | 3.0 Omni; audio and reference video supported | 1 first frame + ≤1 last frame | 3~15 | 720P=60 / 1080P=80 / 2K=100 / 4K=300 ; generateAudio → 720P=80 / 1080P=100 / 2K=120 / 4K=300 |
| kling-3.0 | 3.0 standard; audio supported | 1 first frame + ≤1 last frame | 3~15 | 720P=60 / 1080P=80 / 2K=100 / 4K=300 ; generateAudio → 720P=90 / 1080P=120 / 2K=150 / 4K=300 |
| kling-o1 | O1; reference video supported; 5 / 10 s only | 1 first frame + ≤1 last frame | 5 / 10 | 720P=60 / 1080P=80 / 2K=120 / 4K=180 |
| kling-2.6 | 2.6; audio supported (audio from 1080P); 5 / 10 s only | 1 first frame + ≤1 last frame | 5 / 10 | 720P=30 / 1080P=50 / 2K=75 / 4K=112 ; generateAudio → 1080P=100 / 2K=150 / 4K=225 |
| kling-2.5-turbo | 2.5 Turbo; earlier version, lower price | 1 first frame + ≤1 last frame | 5 / 10 | 720P=30 / 1080P=50 / 2K=75 / 4K=112 |
| kling-2.1 | 2.1; earlier version | 1 first frame + ≤1 last frame | 5 / 10 | 720P=40 / 1080P=70 / 2K=100 / 4K=150 |
| kling-2.0 | 2.0; earlier version | 1 first frame + ≤1 last frame | 5 / 10 | 720P=40 / 1080P=70 / 2K=100 / 4K=150 |
| kling-1.6 | 1.6; earlier version | 1 first frame + ≤1 last frame | 5 / 10 | 720P=40 / 1080P=70 / 2K=100 / 4K=150 |
Request Parameters
| Param | Type | Required | Description |
|---|---|---|---|
| model | string | Required | Sub-model: kling-3.0-turbo / kling-3.0-omni / kling-3.0 / kling-o1 / kling-2.6 / kling-2.5-turbo / kling-2.1 / kling-2.0 / kling-1.6 (see the sub-model table below) |
| prompt | string | — | Video description (optional; materials can drive generation) |
| firstFrameUrl | string | Required | First-frame image URL (publicly reachable); cannot be combined with imageUrls / videoUrls |
| lastFrameUrl | string | — | Last-frame image URL (optional; requires firstFrameUrl, produces a first-to-last transition) |
| negativePrompt | string | — | Negative prompt (optional) |
| duration | integer | — | Duration (sec), range depends on the sub-model (see table), default 5 |
| resolution | string | — | 540P / 720P / 1080P / 2K / 4K (available tiers depend on the sub-model), default 720P (or the lowest tier if 720P is unavailable); 2K / 4K are upscaled |
| generateAudio | boolean | — | Whether to generate audio, default false (only kling-3.0-omni / kling-3.0 / kling-2.6; billed at the audio tier) |
| enhancePrompt | boolean | — | Whether to auto-enhance the prompt (optional) |
| seed | integer | — | Random seed (optional) |
| returnFirstFrame / returnLastFrame / returnFrameAtSecond | boolean / boolean / number | — | Also return the first / last / given-second frame image of the result video (optional), 1 credit per frame |
Request Example
curl -X POST https://api.cqtai.com/api/cqt/generator/kling \
-H 'Authorization: Bearer <API_KEY>' \
-H 'Content-Type: application/json' \
-d '{
"model": "kling-2.0",
"prompt": "the red car slowly pulls away and drives down the rainy street, camera follows",
"duration": 5,
"resolution": "720P",
"firstFrameUrl": "https://cdn.novapi.ai/seedream/1791950778488_c22c4d053b2a41fbb28193cd319473b1.jpg",
"lastFrameUrl": "https://cdn.novapi.ai/seedream/1791950778814_11e964cb95be4866838196e0bc6be7f1.jpg"
}'
# -> { "code":200, "data":"<taskId>" }Response Example
{
"code": 200,
"msg": "success",
"data": {
"id": "4251ce247e6946a39c917dfb15fa8806",
"resultUrl": "https://cdn.novapi.ai/kling/1791956609061_44272e87d4d54bc798960114b8e30905.mp4",
"status": "succeeded",
"errorMsg": null,
"createTime": "2026-10-14 13:39:38",
"completeTime": "2026-10-14 13:43:30"
}
}Response Fields
| Field | Type | Description |
|---|---|---|
| code | number | Status code; 200 means success |
| msg | string | Status message; "success" on success |
| data.id | string | Task ID (taskId); use it to poll GET /api/cqt/info |
| data.status | string | Task status: succeeded / failed / otherwise still processing |
| data.resultUrl | string | URL of the generated video; returned when status = succeeded, null otherwise |
| data.errorMsg | string | null | Failure reason; null on success |
| data.createTime | string | Task creation time |
| data.completeTime | string | null | Task completion time; null until finished |