# 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: Kuaishou
Model key in the API: `kling_pro`

## Connect in three steps

1. [Get a key](https://api.cyhub.ai/docs/connection.md?lang=en): Create a key in the dashboard after you confirm your email. One key opens every model.
2. [Check the price](https://api.cyhub.ai/docs/generations.md?lang=en): POST /v1/price shows the cost of a run in advance, without charging you.
3. [Run a task and collect the result](https://api.cyhub.ai/docs/tasks.md?lang=en): POST /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.

```bash
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"])
```

```javascript
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](https://cyhub.ai/cabinet/keys)

## Price before the run

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

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

```bash
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

## <a id="v4.0"></a>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.

#### `prompt` (Required)

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: String
- Minimum characters: 1
- Maximum characters: 5000

#### `start_frame` (Optional)

One URL of the picture the video starts from.

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

#### `middle_frames` (Optional)

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_frame` (Optional)

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

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

#### `quality` (Optional)

Quality: 720p or 1080p, the price depends on it.

- Type: String
- Allowed values: `720p`, `1080p`
- Default: `"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

#### `length` (Optional)

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

- Type: Integer
- Minimum: 3
- Maximum: 30
- Default: `5`

#### `aspect_ratio` (Optional)

Aspect ratio of a video without frames. With any frame, the video takes the aspect ratio of the frames.

- Type: String
- Allowed values: `16:9`, `1:1`, `9:16`, `21:9`
- Default: `"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.

| 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 |

[How to send files](https://api.cyhub.ai/docs/files.md?lang=en)

### 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](https://api.cyhub.ai/docs/generations.md?lang=en)

### 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.

```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](https://api.cyhub.ai/docs/tasks.md?lang=en#result)

## <a id="v4.0-omni"></a>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.

#### `prompt` (Required)

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: String
- Minimum characters: 1
- Maximum characters: 5000

#### `image_urls` (Optional)

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

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

#### `video_urls` (Optional)

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_sound` (Optional)

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

- Type: Boolean
- Default: `false`
- Applies only when: `video_urls` is set

#### `quality` (Optional)

Quality: 720p or 1080p, the price depends on it.

- Type: String
- Allowed values: `720p`, `1080p`
- Default: `"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

#### `length` (Optional)

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

- Type: Integer
- Minimum: 3
- Maximum: 30
- Default: `5`

#### `aspect_ratio` (Optional)

Aspect ratio of the video. "auto": the model picks it from the materials.

- Type: String
- Allowed values: `auto`, `16:9`, `1:1`, `9:16`, `21:9`
- Default: `"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 |

[How to send files](https://api.cyhub.ai/docs/files.md?lang=en)

### 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](https://api.cyhub.ai/docs/generations.md?lang=en)

### 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.

```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](https://api.cyhub.ai/docs/tasks.md?lang=en#result)

## See also

- [Kling 4.0: features and prices](https://api.cyhub.ai/models/kling-4)
- Other versions: [Kling 3.0 API](https://api.cyhub.ai/en/models/kling-3/api.md), [Kling 2.6 API](https://api.cyhub.ai/en/models/kling-2-6/api.md), [Kling 2.5 Turbo API](https://api.cyhub.ai/en/models/kling-2-5-turbo/api.md), [Kling 2.1 Master API](https://api.cyhub.ai/en/models/kling-2-1-master/api.md), [Kling 2.1 API](https://api.cyhub.ai/en/models/kling-2-1/api.md), [Kling 1.6 API](https://api.cyhub.ai/en/models/kling-1-6/api.md)
- Similar models: [Seedance 2.5 API](https://api.cyhub.ai/en/models/seedance-2-5/api.md), [Kling Motion 3.0 API](https://api.cyhub.ai/en/models/kling-motion/api.md), [Veo 3.1 API](https://api.cyhub.ai/en/models/veo-3-1/api.md), [Wan 3.0 API](https://api.cyhub.ai/en/models/wan-3/api.md), [MiniMax H3 (Hailuo 03) API](https://api.cyhub.ai/en/models/minimax-h3/api.md), [Gemini Omni API](https://api.cyhub.ai/en/models/gemini-omni/api.md)
- [API documentation](https://api.cyhub.ai/docs.md?lang=en)
- [API errors and how to handle them](https://api.cyhub.ai/docs/errors.md?lang=en)
