CyHUB
РусскийGet an API key

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.

Developer: KuaishouModel key in the API: kling_pro

For AI assistants:Download .mdAll documentation .mdOpen as text

Connect in three steps

  1. Get a keyCreate a key in the dashboard after you confirm your email. One key opens every model.
  2. Check the pricePOST /v1/price shows the cost of a run in advance, without charging you.
  3. 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
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"
Python
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"])
Node.js
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();
Get a key

Price before the run

Prices as of 17.10.2026: from 30 ₽. POST /v1/price shows the exact price of your settings.

ModePrice
Kling 4.0, framesfrom 30 ₽
Kling 4.0 Omnifrom 30 ₽

Send the same settings to POST /v1/price: the response shows the price of the run without charging you.

cURL
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 currency
  • available_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.

What the options mean
1.6: Sound Effects, first/last frame

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.

promptRequired

What 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: 5000
start_frameOptional

One URL of the picture the video starts from.

Type: List (String, uri)Maximum items: 1
middle_framesOptional

Middle 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: 8
end_frameOptional

One URL of the picture the video ends with. Works without a first frame too.

Type: List (String, uri)Maximum items: 1
qualityOptional

Quality: 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 only
lengthOptional

Video length in seconds, 3 to 30. The price grows with every second.

Type: IntegerMinimum: 3Maximum: 30Default: 5
aspect_ratioOptional

Aspect 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_frame is not set and end_frame is not set and middle_frames is 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.
FieldAcceptsFormatsFilesFile size up to
start_frameImagesjpeg, jpg, png110 MB
middle_framesImagesjpeg, jpg, png810 MB
end_frameImagesjpeg, jpg, png110 MB
How to send files

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

JSON
{
  "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

JSON
{
  "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.

Complete generation example

Output

  • One MP4 video, with sound if it is on.
  • Generation usually takes 3-5 minutes.
KindFormatsHow manyNote
videomp41

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.

JSON
{
  "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"
      }
    ]
  }
}
How to read the result and download files

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.

promptRequired

What 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: 5000
image_urlsOptional

Pictures, up to 10: heroes, objects, places, style. They do not change the price.

Type: List (String, uri)Maximum items: 10
video_urlsOptional

Videos, 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: 5
keep_original_soundOptional

Keep the sound of your video in the clip: the model makes no new sound then. Only with a video.

Type: BooleanDefault: false
Applies only when: video_urls is set
qualityOptional

Quality: 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 only
lengthOptional

Video length in seconds, 3 to 30. The price grows with every second.

Type: IntegerMinimum: 3Maximum: 30Default: 5
aspect_ratioOptional

Aspect 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.
FieldAcceptsFormatsFilesFile size up to
image_urlsImagesjpeg, jpg, png1010 MB
video_urlsVideomp4, mov5100 MB
How to send files

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

JSON
{
  "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.

Complete generation example

Output

  • One MP4 video, with sound if it is on.
  • Generation usually takes 3-5 minutes.
KindFormatsHow manyNote
videomp41

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.

JSON
{
  "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"
      }
    ]
  }
}
How to read the result and download files

See also

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