Kling 4.0 API
Kling 4.0 video up to 30 seconds with sound in two modes. Frames: from a description and keyframes, up to 10 of them. Omni: from your pictures, videos, elements and ready voices, each material can be referred to in the description.
For AI assistants:Download .mdAll documentation .mdOpen as text
Connect in three steps
- Get a keyCreate a key in the dashboard after you confirm your email. One key opens every model.
- Check the pricePOST /v1/price shows the cost of a run in advance, without charging you.
- Run a task and collect the resultPOST /v1/tasks starts a task, GET /v1/tasks/{id} shows its status and files.
Ready-to-use code
Replace YOUR_API_KEY with your key. The code starts a task and waits for the result. In cURL, repeat the second request with the id from the first response instead of TASK_ID until status becomes succeeded.
curl -X POST "https://api.cyhub.ai/v1/tasks" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "kling_pro",
"settings": {
"model_version": "v4.0",
"prompt": "Котёнок с Frame_first прыгает на диван и сворачивается клубком, как на Frame_1",
"start_frame": [
"https://example.com/kitten.jpg"
],
"middle_frames": [
"https://example.com/kitten-sofa.jpg"
],
"length": 5,
"quality": "1080p"
}
}'
curl "https://api.cyhub.ai/v1/tasks/TASK_ID" \
-H "Authorization: Bearer YOUR_API_KEY"import time
import requests
API = "https://api.cyhub.ai/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
body = {
"model": "kling_pro",
"settings": {
"model_version": "v4.0",
"prompt": "Котёнок с Frame_first прыгает на диван и сворачивается клубком, как на Frame_1",
"start_frame": [
"https://example.com/kitten.jpg",
],
"middle_frames": [
"https://example.com/kitten-sofa.jpg",
],
"length": 5,
"quality": "1080p",
},
}
response = requests.post(f"{API}/tasks", json=body, headers=HEADERS, timeout=60)
response.raise_for_status()
task = response.json()
while task["status"] in ("queued", "running"):
time.sleep(5)
task = requests.get(f"{API}/tasks/{task['id']}", headers=HEADERS, timeout=30).json()
print(task["status"], task["result"])const API = "https://api.cyhub.ai/v1";
const HEADERS = { Authorization: "Bearer YOUR_API_KEY", "Content-Type": "application/json" };
const body = {
"model": "kling_pro",
"settings": {
"model_version": "v4.0",
"prompt": "Котёнок с Frame_first прыгает на диван и сворачивается клубком, как на Frame_1",
"start_frame": [
"https://example.com/kitten.jpg"
],
"middle_frames": [
"https://example.com/kitten-sofa.jpg"
],
"length": 5,
"quality": "1080p"
}
};
async function main() {
let response = await fetch(`${API}/tasks`, { method: "POST", headers: HEADERS, body: JSON.stringify(body) });
if (!response.ok) throw new Error(await response.text());
let task = await response.json();
while (task.status === "queued" || task.status === "running") {
await new Promise((resolve) => setTimeout(resolve, 5000));
response = await fetch(`${API}/tasks/${task.id}`, { headers: HEADERS });
task = await response.json();
}
console.log(task.status, task.result);
}
main();Price before the run
Prices as of 17.10.2026: from 30 ₽. POST /v1/price shows the exact price of your settings.
| Mode | Price |
|---|---|
| Kling 4.0, frames | from 30 ₽ |
| Kling 4.0 Omni | from 30 ₽ |
Send the same settings to POST /v1/price: the response shows the price of the run without charging you.
curl -X POST "https://api.cyhub.ai/v1/price" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "kling_pro",
"settings": {
"model_version": "v4.0",
"prompt": "Котёнок с Frame_first прыгает на диван и сворачивается клубком, как на Frame_1",
"start_frame": [
"https://example.com/kitten.jpg"
],
"middle_frames": [
"https://example.com/kitten-sofa.jpg"
],
"length": 5,
"quality": "1080p"
}
}'amount_minor: the price of the run in minor units (kopecks for rubles)currency: the wallet currencyavailable_minor: how much your balance has for new tasks right now
Modes
Each mode has its own parameters and examples. The mode is set by the model_version field.
- Kling 4.0, frames
model_version = v4.0 - Kling 4.0 Omni
model_version = v4.0-omni
What the options mean
2.1: 3D motion, facial detail, Sound Effects
2.1 Master: cinematic quality, 1080p only, Sound Effects
2.5 Turbo: 40% faster, realistic physics, Sound Effects
2.6: built-in audio generation, 1080p/48 FPS
3.0: Multi-Shot, element binding, up to 15 seconds
4.0: two modes. "Frames": up to 10 keyframes. Omni: pictures, videos and elements. Up to 30 seconds, with sound
Kling 4.0, frames
A video from a description and keyframes: first, middle and last, up to 10 in total. 3 to 30 seconds, 720p or 1080p, always with sound. This mode has no elements.
Value of the model_version field: v4.0
Price in this mode from 30 ₽.
Parameters
Model parameters go inside settings. Omitted optional fields take their default values.
promptRequiredWhat happens in the video: the action, the camera movement, the mood of the scene. A frame can be referred to with a label: Frame_first (first), Frame_last (last), Frame_1, Frame_2 and so on (middle frames in order).
Type: StringMinimum characters: 1Maximum characters: 5000start_frameOptionalOne URL of the picture the video starts from.
Type: List (String, uri)Maximum items: 1middle_framesOptionalMiddle frames in order, up to 8 picture URLs: the video goes through them along the way. With the first and last frames, up to 10 frames in total and no more than the seconds of the video plus one (4 frames for 3 seconds). The first and last frames are optional.
Type: List (String, uri)Maximum items: 8end_frameOptionalOne URL of the picture the video ends with. Works without a first frame too.
Type: List (String, uri)Maximum items: 1qualityOptionalQuality: 720p or 1080p, the price depends on it.
Type: StringAllowed values:720p1080pDefault:"720p"What the options mean
720p:
1280×720 resolution
Good for social media and quick previews
1080p:
1920×1080 resolution (Full HD)
Professional quality for ads and content
4K:
The sharpest video, for big screens
Version 3.0 onlylengthOptionalVideo length in seconds, 3 to 30. The price grows with every second.
Type: IntegerMinimum: 3Maximum: 30Default:5aspect_ratioOptionalAspect ratio of a video without frames. With any frame, the video takes the aspect ratio of the frames.
Type: StringAllowed values:16:91:19:1621:9Default:"16:9"Applies only when:start_frameis not set andend_frameis not set andmiddle_framesis not set
Parameters not listed here are not accepted: the response is 422 unknown_setting.
The API sets these settings itself, do not send them: api_request = true
Input
- Frames are URLs of JPG or PNG files up to 10 MB: each side at least 300 pixels, aspect ratio from 1:2.5 to 2.5:1.
- We download the frames ourselves: the link must open without signing in and lead straight to the file, without a redirect.
- Up to 10 frames in total and no more than the seconds of the video plus one: up to 4 frames for 3 seconds, up to 10 for 9 seconds and longer. Any frame can be skipped, a middle frame works without a first one. A middle frame has no time of its own: the frames go in order.
- This mode has no elements: Kling takes them only in 3.0 and in 4.0 Omni.
- Price: per second of video, it does not depend on the number of frames.
| Field | Accepts | Formats | Files | File size up to |
|---|---|---|---|---|
start_frame | Images | jpeg, jpg, png | 1 | 10 MB |
middle_frames | Images | jpeg, jpg, png | 8 | 10 MB |
end_frame | Images | jpeg, jpg, png | 1 | 10 MB |
Request example
Send this JSON to POST /v1/tasks with your API key. To check the price first, send the same JSON to POST /v1/price.
A first and a middle frame, no last
{
"model": "kling_pro",
"settings": {
"model_version": "v4.0",
"prompt": "Котёнок с Frame_first прыгает на диван и сворачивается клубком, как на Frame_1",
"start_frame": [
"https://example.com/kitten.jpg"
],
"middle_frames": [
"https://example.com/kitten-sofa.jpg"
],
"length": 5,
"quality": "1080p"
}
}Video from a description
{
"model": "kling_pro",
"settings": {
"model_version": "v4.0",
"prompt": "Маяк на скале во время шторма, камера медленно облетает его",
"length": 10,
"aspect_ratio": "21:9"
}
}The price is calculated when the task is accepted, currency RUB.
Output
- One MP4 video, with sound if it is on.
- Generation usually takes 3-5 minutes.
| Kind | Formats | How many | Note |
|---|---|---|---|
video | mp4 | 1 |
A finished task as GET /v1/tasks/{id} returns it (some fields left out). The caption may sit on the task or on a single file and may be empty; the model picks the file name.
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "succeeded",
"finished_at": "2026-10-01T12:03:41+00:00",
"result": {
"caption": "Caption of the result: the model and its settings",
"texts": [],
"files_expire_at": "2026-10-08T12:03:41+00:00",
"files_expired": false,
"artifacts": [
{
"index": 0,
"kind": "video",
"filename": "video.mp4",
"size": 12582912,
"caption": "",
"download_path": "/v1/tasks/7c9e6679-7425-40de-944b-e07fc1f90ae7/artifacts/0"
}
]
}
}Kling 4.0 Omni
A video from your materials: pictures, videos and elements, referred to in the description. 3 to 30 seconds, 720p or 1080p, always with sound.
Value of the model_version field: v4.0-omni
Price in this mode from 30 ₽.
Parameters
Model parameters go inside settings. Omitted optional fields take their default values.
promptRequiredWhat to do with the materials and what happens in the video. A material is referred to with a label: Image_1 (the first picture of image_urls), Video_1 (the first video of video_urls) and so on in order, an element from the library with the label Element_<id>. For example: "Image_1 walks towards the camera against the background of Video_1".
Type: StringMinimum characters: 1Maximum characters: 5000image_urlsOptionalPictures, up to 10: heroes, objects, places, style. They do not change the price.
Type: List (String, uri)Maximum items: 10video_urlsOptionalVideos, up to 5: background, motion, a hero or sound. All together 2 to 30 seconds, the short side of the frame from 700 pixels. They go as whole files, without trimming. The price also depends on the video length.
Type: List (String, uri)Maximum items: 5keep_original_soundOptionalKeep the sound of your video in the clip: the model makes no new sound then. Only with a video.
Type: BooleanDefault:falseApplies only when:video_urlsis setqualityOptionalQuality: 720p or 1080p, the price depends on it.
Type: StringAllowed values:720p1080pDefault:"720p"What the options mean
720p:
1280×720 resolution
Good for social media and quick previews
1080p:
1920×1080 resolution (Full HD)
Professional quality for ads and content
4K:
The sharpest video, for big screens
Version 3.0 onlylengthOptionalVideo length in seconds, 3 to 30. The price grows with every second.
Type: IntegerMinimum: 3Maximum: 30Default:5aspect_ratioOptionalAspect ratio of the video. "auto": the model picks it from the materials.
Type: StringAllowed values:auto16:91:19:1621:9Default:"auto"
Parameters not listed here are not accepted: the response is 422 unknown_setting.
The API sets these settings itself, do not send them: api_request = true
Input
- Frames are URLs of JPG or PNG files up to 10 MB: each side at least 300 pixels, aspect ratio from 1:2.5 to 2.5:1.
- We download the frames ourselves: the link must open without signing in and lead straight to the file, without a redirect.
- Up to 15 materials in total: up to 10 pictures, up to 5 videos, up to 7 elements (up to 3 video elements, up to 5 videos and video elements together).
- Elements from the library of the account (GET /v1/models/kling_pro/elements) go into the description as the label Element_<id>.
- Price without a video: per second of the clip. With a video: per second of the clip and also for the larger of two, the clip length or the total video length, at a lower rate. Pictures and elements do not change the price. We measure the videos ourselves, so POST /v1/price tells the price with a video.
| Field | Accepts | Formats | Files | File size up to |
|---|---|---|---|---|
image_urls | Images | jpeg, jpg, png | 10 | 10 MB |
video_urls | Video | mp4, mov | 5 | 100 MB |
Request example
Send this JSON to POST /v1/tasks with your API key. To check the price first, send the same JSON to POST /v1/price.
Background from a video, hero from a picture
{
"model": "kling_pro",
"settings": {
"model_version": "v4.0-omni",
"prompt": "Возьми фон из Video_1, а героя с Image_1: он идёт к камере",
"image_urls": [
"https://example.com/hero.png"
],
"video_urls": [
"https://example.com/street.mp4"
],
"length": 8,
"aspect_ratio": "auto"
}
}The price is calculated when the task is accepted, currency RUB.
Output
- One MP4 video, with sound if it is on.
- Generation usually takes 3-5 minutes.
| Kind | Formats | How many | Note |
|---|---|---|---|
video | mp4 | 1 |
A finished task as GET /v1/tasks/{id} returns it (some fields left out). The caption may sit on the task or on a single file and may be empty; the model picks the file name.
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "succeeded",
"finished_at": "2026-10-01T12:03:41+00:00",
"result": {
"caption": "Caption of the result: the model and its settings",
"texts": [],
"files_expire_at": "2026-10-08T12:03:41+00:00",
"files_expired": false,
"artifacts": [
{
"index": 0,
"kind": "video",
"filename": "video.mp4",
"size": 12582912,
"caption": "",
"download_path": "/v1/tasks/7c9e6679-7425-40de-944b-e07fc1f90ae7/artifacts/0"
}
]
}
}See also
- Kling 4.0: features and prices
- Other versions: Kling 3.0 API, Kling 2.6 API, Kling 2.5 Turbo API, Kling 2.1 Master API, Kling 2.1 API, Kling 1.6 API
- Similar models: Seedance 2.5 API, Kling Motion 3.0 API, Veo 3.1 API, Wan 3.0 API, MiniMax H3 (Hailuo 03) API, Gemini Omni API
- API documentation
- API errors and how to handle them
Try Kling 4.0 through the API
One key opens every CyHUB model. Payment in rubles, and you see the price before the run.
Get an API key