Kling API
В каталоге 8 записей семейства Kling: версии и режимы. Имя модели ставится в
поле model запроса createTask, а всё
остальное уходит вложенным объектом input. У каждой модели ниже её
поля, готовый вызов и ответ; общее для всех видео — на странице
Видео, а сам порядок вызова разобран в
разделе Как устроена задача.
Модели семейства
| Идентификатор | Модель | Задача | Страница на сайте |
|---|---|---|---|
| kling/3-0-video | Kling 3.0 | text-to-video / image-to-video | Открыть |
| kling/3-0-motion-control | Kling 3.0 Motion Control | motion-control | Открыть |
| kling/3-turbo-text-to-video | Kling 3.0 Turbo text-to-video | text-to-video | Открыть |
| kling/3-turbo-image-to-video | Kling 3.0 Turbo image-to-video | image-to-video | Открыть |
| kling/3-0-omni-text-to-video | Kling O3 | text-to-video | Открыть |
| kling/3-0-omni-reference-to-video | Kling O3 reference-to-video | reference-to-video | Открыть |
| kling/4-0-keyframe-to-video | Kling 4.0 keyframe-to-video | text-to-video / keyframe-to-video | Открыть |
| kling/4-0-reference-to-video | Kling 4.0 reference-to-video | text-to-video / reference-to-video | Открыть |
Kling 3.0
Открыть страницу моделиkling/3-0-video
Поля запроса
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| model | текст | обязательное | kling/3-0-video |
| input | объект | обязательное | Параметры генерации — поля из таблицы ниже |
Поля input
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| prompt | текст | обязательное | от 1 до 2 500 символов |
| sound | да или нет | обязательное | true или false |
| image_urls | список ссылок | опц. | до 2 ссылок на изображение |
| duration | целое число | опц. | целое от 3 до 15 |
| aspect_ratio | значение из списка | опц. | 16:9 · 9:16 · 1:1 |
| mode | значение из списка | опц. |
std · pro · 4K
· без него шлюз подставит std
|
| multi_shots | да или нет | опц. |
true или false
· без него шлюз подставит false
|
| multi_prompt | структура | опц. | структура по документации поставщика, проверяется у него |
| kling_elements | структура | опц. | структура по документации поставщика, проверяется у него |
Поле image_urls. Кадры видео: до 2 картинок. Первая — первый кадр, вторая — последний.
Один план или несколько. Поле multi_shots выбирает, как модель снимает ролик. Оно булево, и маршрут отказывает, если его не прислать вовсе, — поэтому шлюз подставляет false, обычный ролик одним планом.
При multi_shots: false ролик снимается по промпту из поля prompt. Звук включается полем sound.
При multi_shots: true промпт из prompt не действует: сцены задаются списком multi_prompt, до пяти кадров, у каждого свой промпт и длительность от одной до двенадцати секунд, не длиннее пятисот знаков. Из image_urls берётся только первая картинка — первым кадром, а звук в этом режиме включается сам.
В обоих режимах в промпте можно сослаться на элемент через @имя, а сами элементы перечислить в kling_elements: от двух до четырёх картинок либо один ролик на элемент, не больше трёх элементов на ролик.
Поле multi_prompt. Список кадров многокадрового видео, до пяти. Действует при multi_shots: true.
| Поле | Тип | Обяз. | Что в нём |
|---|---|---|---|
| prompt | текст | обязательное | Промпт кадра, до 500 знаков. Ссылка на элемент через @имя занимает в нём 37 знаков. |
| duration | целое число | обязательное | Длительность кадра в секундах, от 1 до 12. |
{
"model": "kling/3-0-video",
"input": {
"prompt": "Собака на пляже",
"sound": true,
"duration": 7,
"mode": "std",
"multi_shots": true,
"multi_prompt": [
{
"prompt": "Собака бежит по пляжу вдоль воды",
"duration": 3
},
{
"prompt": "Собака прыгает в волну",
"duration": 4
}
]
}
}
Поле kling_elements. Список элементов, не больше трёх на видео. В промпте на элемент ссылаются через @ и его имя.
| Поле | Тип | Обяз. | Что в нём |
|---|---|---|---|
| name | текст | обязательное | Имя элемента. В промпте оно пишется с @ впереди: @element_cat. |
| description | текст | обязательное | Что на картинках. |
| element_input_urls | список ссылок | обязательное | Картинки элемента: от двух до четырёх, JPG или PNG, до 10 МБ каждая. Либо одно видео MP4 или MOV не короче 3 секунд. |
| element_input_audio_urls | список ссылок | опц. | Запись голоса: одна, от 5 до 30 секунд. |
| start_time | целое число | опц. | Начало нужного отрезка видео в миллисекундах, когда элемент задан видео. Без поля — 0. |
| end_time | целое число | опц. | Конец отрезка в миллисекундах. Отрезок — от 3000 до 8000 миллисекунд. |
Первый кадр при этом не обязателен: видео с элементом снимается и без image_urls.
Промпт со ссылкой на элемент пишется по-английски: по русскому промпту модель оживляет саму картинку и сцену не меняет.
Внешность берётся с картинок: в description достаточно назвать, что на них.
{
"model": "kling/3-0-video",
"input": {
"prompt": "@element_cat walks along a beach at sunset",
"sound": false,
"duration": 3,
"mode": "std",
"aspect_ratio": "16:9",
"multi_shots": false,
"kling_elements": [
{
"name": "element_cat",
"description": "ginger cat in a white spacesuit",
"element_input_urls": [
"https://gen202.com/assets/sample-nano-banana-pro.jpg",
"https://gen202.com/assets/sample-nano-banana-2.jpg"
]
}
]
}
}
Пример вызова
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
-H "Authorization: Bearer sk-ваш-ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "kling/3-0-video",
"input": {
"prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
"sound": false,
"aspect_ratio": "1:1",
"duration": 3,
"image_urls": [
"https://gen202.com/assets/sample-nano-banana-pro.jpg"
],
"mode": "std"
}
}' | jq -r '.data.taskId')
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while true; do
RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
-H "Authorization: Bearer sk-ваш-ключ")
STATE=$(echo "$RECORD" | jq -r '.data.state')
case "$STATE" in success|fail) break;; esac
sleep 3
done
# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
# внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
if .state == "fail"
then "отказ \(.failCode): \(.failMsg)"
else .resultJson | fromjson | .resultUrls[0]
end'
import json
import time
import requests
headers = {"Authorization": "Bearer sk-ваш-ключ"}
# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
"https://api.gen202.com/api/v1/jobs/createTask",
headers=headers,
json={
"model": "kling/3-0-video",
"input": {
"prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
"sound": False,
"aspect_ratio": "1:1",
"duration": 3,
"image_urls": [
"https://gen202.com/assets/sample-nano-banana-pro.jpg"
],
"mode": "std"
}
},
).json()
task_id = created["data"]["taskId"]
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while True:
task = requests.get(
"https://api.gen202.com/api/v1/jobs/recordInfo",
headers=headers,
params={"taskId": task_id},
).json()["data"]
if task["state"] in ("success", "fail"):
break
time.sleep(3)
# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])
# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])
Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в
3 секунды, пока задача не закончится, и разбирает ответ до ссылки
на файл. Разборов два, потому что поле resultJson — строка JSON
внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её
перечислений, поэтому он проходит проверку шлюза как есть.
Подставить остаётся только свой ключ.
Пример на оболочке разбирает ответ через jq; на Python своего
ничего не нужно, кроме requests.
Ответ, когда задача готова
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "kling/3-0-video",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": ""
}
}
Ссылка на файл лежит в resultJson — это строка, внутри которой ещё
один JSON, поэтому разбирать её нужно вторым разбором. Пока задача не завершилась, там пустая
строка, а в state — waiting,
queuing или generating. В настоящем ответе
есть ещё поле creditsConsumed со списанием; здесь его нет намеренно —
сумма зависит от запрошенного варианта, а цены живут в
каталоге. Все поля записи перечислены в разделе
Формат ответа.
kling/3-0-motion-control
Поля запроса
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| model | текст | обязательное | kling/3-0-motion-control |
| input | объект | обязательное | Параметры генерации — поля из таблицы ниже |
Поля input
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| input_urls | список ссылок | обязательное | от 1 до 1 ссылок на изображение |
| video_urls | список ссылок | обязательное | от 1 до 1 ссылок на видео |
| prompt | текст | опц. | не длиннее 2 500 символов |
| mode | значение из списка | опц. | 720p · 1080p |
| character_orientation | значение из списка | опц. | video · image |
| background_source | значение из списка | опц. | input_video · input_image |
Пример вызова
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
-H "Authorization: Bearer sk-ваш-ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "kling/3-0-motion-control",
"input": {
"input_urls": [
"https://gen202.com/assets/sample-nano-banana-2.jpg"
],
"video_urls": [
"https://example.com/input.mp4"
],
"prompt": "Заменить фон на вечернюю городскую улицу, свет тёплый"
}
}' | jq -r '.data.taskId')
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while true; do
RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
-H "Authorization: Bearer sk-ваш-ключ")
STATE=$(echo "$RECORD" | jq -r '.data.state')
case "$STATE" in success|fail) break;; esac
sleep 3
done
# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
# внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
if .state == "fail"
then "отказ \(.failCode): \(.failMsg)"
else .resultJson | fromjson | .resultUrls[0]
end'
import json
import time
import requests
headers = {"Authorization": "Bearer sk-ваш-ключ"}
# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
"https://api.gen202.com/api/v1/jobs/createTask",
headers=headers,
json={
"model": "kling/3-0-motion-control",
"input": {
"input_urls": [
"https://gen202.com/assets/sample-nano-banana-2.jpg"
],
"video_urls": [
"https://example.com/input.mp4"
],
"prompt": "Заменить фон на вечернюю городскую улицу, свет тёплый"
}
},
).json()
task_id = created["data"]["taskId"]
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while True:
task = requests.get(
"https://api.gen202.com/api/v1/jobs/recordInfo",
headers=headers,
params={"taskId": task_id},
).json()["data"]
if task["state"] in ("success", "fail"):
break
time.sleep(3)
# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])
# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])
Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в
3 секунды, пока задача не закончится, и разбирает ответ до ссылки
на файл. Разборов два, потому что поле resultJson — строка JSON
внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её
перечислений, поэтому он проходит проверку шлюза как есть.
Заменить в нём нужно два значения: свой ключ и ссылки на исходные файлы — адреса example.com стоят заполнителями, файлов по ним нет.
Пример на оболочке разбирает ответ через jq; на Python своего
ничего не нужно, кроме requests.
Ответ, когда задача готова
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "kling/3-0-motion-control",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": ""
}
}
Ссылка на файл лежит в resultJson — это строка, внутри которой ещё
один JSON, поэтому разбирать её нужно вторым разбором. Пока задача не завершилась, там пустая
строка, а в state — waiting,
queuing или generating. В настоящем ответе
есть ещё поле creditsConsumed со списанием; здесь его нет намеренно —
сумма зависит от запрошенного варианта, а цены живут в
каталоге. Все поля записи перечислены в разделе
Формат ответа.
Общее для всех моделей: Как устроена задача — чем отправить и как дождаться · Формат ответа — где в ответе ссылка на файл · Загрузка своих файлов — как получить ссылку на свою картинку · Отказы — что означает отказ
Kling 3.0 Turbo
Открыть страницу моделиkling/3-turbo-text-to-video
Поля запроса
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| model | текст | обязательное | kling/3-turbo-text-to-video |
| input | объект | обязательное | Параметры генерации — поля из таблицы ниже |
Поля input
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| prompt | текст | обязательное | от 1 до 2 500 символов |
| duration | целое число | обязательное | целое от 3 до 15 |
| aspect_ratio | значение из списка | обязательное | 1:1 · 9:16 · 16:9 |
| resolution | значение из списка | опц. |
720p · 1080p
· без него шлюз подставит 720p
|
Пример вызова
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
-H "Authorization: Bearer sk-ваш-ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "kling/3-turbo-text-to-video",
"input": {
"prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
"duration": 3,
"aspect_ratio": "1:1",
"resolution": "720p"
}
}' | jq -r '.data.taskId')
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while true; do
RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
-H "Authorization: Bearer sk-ваш-ключ")
STATE=$(echo "$RECORD" | jq -r '.data.state')
case "$STATE" in success|fail) break;; esac
sleep 3
done
# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
# внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
if .state == "fail"
then "отказ \(.failCode): \(.failMsg)"
else .resultJson | fromjson | .resultUrls[0]
end'
import json
import time
import requests
headers = {"Authorization": "Bearer sk-ваш-ключ"}
# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
"https://api.gen202.com/api/v1/jobs/createTask",
headers=headers,
json={
"model": "kling/3-turbo-text-to-video",
"input": {
"prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
"duration": 3,
"aspect_ratio": "1:1",
"resolution": "720p"
}
},
).json()
task_id = created["data"]["taskId"]
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while True:
task = requests.get(
"https://api.gen202.com/api/v1/jobs/recordInfo",
headers=headers,
params={"taskId": task_id},
).json()["data"]
if task["state"] in ("success", "fail"):
break
time.sleep(3)
# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])
# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])
Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в
3 секунды, пока задача не закончится, и разбирает ответ до ссылки
на файл. Разборов два, потому что поле resultJson — строка JSON
внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её
перечислений, поэтому он проходит проверку шлюза как есть.
Подставить остаётся только свой ключ.
Пример на оболочке разбирает ответ через jq; на Python своего
ничего не нужно, кроме requests.
Ответ, когда задача готова
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "kling/3-turbo-text-to-video",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": ""
}
}
Ссылка на файл лежит в resultJson — это строка, внутри которой ещё
один JSON, поэтому разбирать её нужно вторым разбором. Пока задача не завершилась, там пустая
строка, а в state — waiting,
queuing или generating. В настоящем ответе
есть ещё поле creditsConsumed со списанием; здесь его нет намеренно —
сумма зависит от запрошенного варианта, а цены живут в
каталоге. Все поля записи перечислены в разделе
Формат ответа.
kling/3-turbo-image-to-video
Поля запроса
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| model | текст | обязательное | kling/3-turbo-image-to-video |
| input | объект | обязательное | Параметры генерации — поля из таблицы ниже |
Поля input
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| prompt | текст | обязательное | от 1 до 2 500 символов |
| image_urls | список ссылок | обязательное | от 1 до 2 ссылок на изображение |
| duration | целое число | обязательное | целое от 3 до 15 |
| resolution | значение из списка | опц. |
720p · 1080p
· без него шлюз подставит 720p
|
Поле image_urls. Кадры видео: от одной до 2 картинок, JPG или PNG до 10 МБ. Первая — первый кадр.
Пример вызова
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
-H "Authorization: Bearer sk-ваш-ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "kling/3-turbo-image-to-video",
"input": {
"prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
"image_urls": [
"https://gen202.com/assets/sample-nano-banana-pro.jpg"
],
"duration": 3,
"resolution": "720p"
}
}' | jq -r '.data.taskId')
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while true; do
RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
-H "Authorization: Bearer sk-ваш-ключ")
STATE=$(echo "$RECORD" | jq -r '.data.state')
case "$STATE" in success|fail) break;; esac
sleep 3
done
# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
# внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
if .state == "fail"
then "отказ \(.failCode): \(.failMsg)"
else .resultJson | fromjson | .resultUrls[0]
end'
import json
import time
import requests
headers = {"Authorization": "Bearer sk-ваш-ключ"}
# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
"https://api.gen202.com/api/v1/jobs/createTask",
headers=headers,
json={
"model": "kling/3-turbo-image-to-video",
"input": {
"prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
"image_urls": [
"https://gen202.com/assets/sample-nano-banana-pro.jpg"
],
"duration": 3,
"resolution": "720p"
}
},
).json()
task_id = created["data"]["taskId"]
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while True:
task = requests.get(
"https://api.gen202.com/api/v1/jobs/recordInfo",
headers=headers,
params={"taskId": task_id},
).json()["data"]
if task["state"] in ("success", "fail"):
break
time.sleep(3)
# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])
# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])
Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в
3 секунды, пока задача не закончится, и разбирает ответ до ссылки
на файл. Разборов два, потому что поле resultJson — строка JSON
внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её
перечислений, поэтому он проходит проверку шлюза как есть.
Заменить в нём нужно два значения: свой ключ и ссылку на изображение — в примере стоит образец с нашего сайта.
Пример на оболочке разбирает ответ через jq; на Python своего
ничего не нужно, кроме requests.
Ответ, когда задача готова
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "kling/3-turbo-image-to-video",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": ""
}
}
Ссылка на файл лежит в resultJson — это строка, внутри которой ещё
один JSON, поэтому разбирать её нужно вторым разбором. Пока задача не завершилась, там пустая
строка, а в state — waiting,
queuing или generating. В настоящем ответе
есть ещё поле creditsConsumed со списанием; здесь его нет намеренно —
сумма зависит от запрошенного варианта, а цены живут в
каталоге. Все поля записи перечислены в разделе
Формат ответа.
Общее для всех моделей: Как устроена задача — чем отправить и как дождаться · Формат ответа — где в ответе ссылка на файл · Загрузка своих файлов — как получить ссылку на свою картинку · Отказы — что означает отказ
Kling O3
Открыть страницу моделиkling/3-0-omni-text-to-video
Поля запроса
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| model | текст | обязательное | kling/3-0-omni-text-to-video |
| input | объект | обязательное | Параметры генерации — поля из таблицы ниже |
Поля input
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| prompt | текст | обязательное | от 1 до 3 072 символов |
| customize_multi_shots | да или нет | опц. | true или false |
| prefer_multi_shots | да или нет | опц. | true или false |
| multi_prompt | список объектов | опц. | от 0 до 6 объектов с полями: prompt, duration |
| audio | да или нет | опц. | true или false |
| resolution | значение из списка | опц. | 720p · 1080p · 4k |
| aspect_ratio | значение из списка | опц. | 16:9 · 9:16 · 1:1 |
| duration | целое число | опц. | целое от 3 до 15 |
Пример вызова
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
-H "Authorization: Bearer sk-ваш-ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "kling/3-0-omni-text-to-video",
"input": {
"prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
"aspect_ratio": "1:1",
"resolution": "720p",
"duration": 3,
"audio": false
}
}' | jq -r '.data.taskId')
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while true; do
RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
-H "Authorization: Bearer sk-ваш-ключ")
STATE=$(echo "$RECORD" | jq -r '.data.state')
case "$STATE" in success|fail) break;; esac
sleep 3
done
# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
# внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
if .state == "fail"
then "отказ \(.failCode): \(.failMsg)"
else .resultJson | fromjson | .resultUrls[0]
end'
import json
import time
import requests
headers = {"Authorization": "Bearer sk-ваш-ключ"}
# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
"https://api.gen202.com/api/v1/jobs/createTask",
headers=headers,
json={
"model": "kling/3-0-omni-text-to-video",
"input": {
"prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
"aspect_ratio": "1:1",
"resolution": "720p",
"duration": 3,
"audio": False
}
},
).json()
task_id = created["data"]["taskId"]
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while True:
task = requests.get(
"https://api.gen202.com/api/v1/jobs/recordInfo",
headers=headers,
params={"taskId": task_id},
).json()["data"]
if task["state"] in ("success", "fail"):
break
time.sleep(3)
# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])
# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])
Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в
3 секунды, пока задача не закончится, и разбирает ответ до ссылки
на файл. Разборов два, потому что поле resultJson — строка JSON
внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её
перечислений, поэтому он проходит проверку шлюза как есть.
Подставить остаётся только свой ключ.
Пример на оболочке разбирает ответ через jq; на Python своего
ничего не нужно, кроме requests.
Ответ, когда задача готова
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "kling/3-0-omni-text-to-video",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": ""
}
}
Ссылка на файл лежит в resultJson — это строка, внутри которой ещё
один JSON, поэтому разбирать её нужно вторым разбором. Пока задача не завершилась, там пустая
строка, а в state — waiting,
queuing или generating. В настоящем ответе
есть ещё поле creditsConsumed со списанием; здесь его нет намеренно —
сумма зависит от запрошенного варианта, а цены живут в
каталоге. Все поля записи перечислены в разделе
Формат ответа.
kling/3-0-omni-reference-to-video
Поля запроса
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| model | текст | обязательное | kling/3-0-omni-reference-to-video |
| input | объект | обязательное | Параметры генерации — поля из таблицы ниже |
Поля input
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| prompt | текст | обязательное | от 1 до 3 072 символов |
| image_urls | список ссылок | обязательное | от 1 до 7 ссылок на изображение |
| customize_multi_shots | да или нет | опц. | true или false |
| prefer_multi_shots | да или нет | опц. | true или false |
| multi_prompt | список объектов | опц. | от 0 до 6 объектов с полями: prompt, duration |
| audio | да или нет | опц. | true или false |
| resolution | значение из списка | опц. | 720p · 1080p · 4k |
| aspect_ratio | значение из списка | опц. | 16:9 · 9:16 · 1:1 |
| duration | целое число | опц. | целое от 3 до 15 |
Поле image_urls. Картинки-референсы: от одной до 7. Модель берёт с них героя, предмет или место; JPG или PNG до 50 МБ, стороны от 300 точек, пропорции от 0,4 до 2,5. В промпте на картинку ссылаются <<<image_1>>>, <<<image_2>>> — по порядку в списке.
Пример вызова
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
-H "Authorization: Bearer sk-ваш-ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "kling/3-0-omni-reference-to-video",
"input": {
"prompt": "The ginger cat from <<<image_1>>>, in a white spacesuit, floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
"image_urls": [
"https://gen202.com/assets/sample-nano-banana-pro.jpg"
],
"aspect_ratio": "1:1",
"resolution": "720p",
"duration": 3,
"audio": false
}
}' | jq -r '.data.taskId')
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while true; do
RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
-H "Authorization: Bearer sk-ваш-ключ")
STATE=$(echo "$RECORD" | jq -r '.data.state')
case "$STATE" in success|fail) break;; esac
sleep 3
done
# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
# внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
if .state == "fail"
then "отказ \(.failCode): \(.failMsg)"
else .resultJson | fromjson | .resultUrls[0]
end'
import json
import time
import requests
headers = {"Authorization": "Bearer sk-ваш-ключ"}
# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
"https://api.gen202.com/api/v1/jobs/createTask",
headers=headers,
json={
"model": "kling/3-0-omni-reference-to-video",
"input": {
"prompt": "The ginger cat from <<<image_1>>>, in a white spacesuit, floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
"image_urls": [
"https://gen202.com/assets/sample-nano-banana-pro.jpg"
],
"aspect_ratio": "1:1",
"resolution": "720p",
"duration": 3,
"audio": False
}
},
).json()
task_id = created["data"]["taskId"]
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while True:
task = requests.get(
"https://api.gen202.com/api/v1/jobs/recordInfo",
headers=headers,
params={"taskId": task_id},
).json()["data"]
if task["state"] in ("success", "fail"):
break
time.sleep(3)
# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])
# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])
Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в
3 секунды, пока задача не закончится, и разбирает ответ до ссылки
на файл. Разборов два, потому что поле resultJson — строка JSON
внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её
перечислений, поэтому он проходит проверку шлюза как есть.
Заменить в нём нужно два значения: свой ключ и ссылку на изображение — в примере стоит образец с нашего сайта.
Пример на оболочке разбирает ответ через jq; на Python своего
ничего не нужно, кроме requests.
Ответ, когда задача готова
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "kling/3-0-omni-reference-to-video",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": ""
}
}
Ссылка на файл лежит в resultJson — это строка, внутри которой ещё
один JSON, поэтому разбирать её нужно вторым разбором. Пока задача не завершилась, там пустая
строка, а в state — waiting,
queuing или generating. В настоящем ответе
есть ещё поле creditsConsumed со списанием; здесь его нет намеренно —
сумма зависит от запрошенного варианта, а цены живут в
каталоге. Все поля записи перечислены в разделе
Формат ответа.
Общее для всех моделей: Как устроена задача — чем отправить и как дождаться · Формат ответа — где в ответе ссылка на файл · Загрузка своих файлов — как получить ссылку на свою картинку · Отказы — что означает отказ
Kling 4.0 keyframe-to-video
Открыть страницу моделиkling/4-0-keyframe-to-video
Поля запроса
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| model | текст | обязательное | kling/4-0-keyframe-to-video |
| input | объект | обязательное | Параметры генерации — поля из таблицы ниже |
Поля input
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| prompt | текст | обязательное | от 1 до 8 000 символов |
| duration | целое число | опц. | целое от 3 до 30 |
| resolution | значение из списка | опц. | 720p · 1080p |
| aspect_ratio | значение из списка | опц. | auto · 16:9 · 9:16 · 1:1 · 21:9 |
| first_frame_url | ссылка | опц. | одна ссылка на изображение |
| keyframe_urls | список ссылок | опц. | до 8 ссылок на изображение |
| last_frame_url | ссылка | опц. | одна ссылка на изображение |
Поле keyframe_urls. Промежуточные кадры: до 8, по порядку. Число кадров вместе с первым и последним ограничено длиной видео: 3 секунды — до 4 кадров, 4 секунды — до 5, и так далее. Все 10 кадров можно дать с 9 секунд.
Пример вызова
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
-H "Authorization: Bearer sk-ваш-ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "kling/4-0-keyframe-to-video",
"input": {
"prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
"aspect_ratio": "auto",
"resolution": "720p",
"duration": 3,
"first_frame_url": "https://gen202.com/assets/sample-nano-banana-pro.jpg"
}
}' | jq -r '.data.taskId')
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while true; do
RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
-H "Authorization: Bearer sk-ваш-ключ")
STATE=$(echo "$RECORD" | jq -r '.data.state')
case "$STATE" in success|fail) break;; esac
sleep 3
done
# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
# внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
if .state == "fail"
then "отказ \(.failCode): \(.failMsg)"
else .resultJson | fromjson | .resultUrls[0]
end'
import json
import time
import requests
headers = {"Authorization": "Bearer sk-ваш-ключ"}
# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
"https://api.gen202.com/api/v1/jobs/createTask",
headers=headers,
json={
"model": "kling/4-0-keyframe-to-video",
"input": {
"prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
"aspect_ratio": "auto",
"resolution": "720p",
"duration": 3,
"first_frame_url": "https://gen202.com/assets/sample-nano-banana-pro.jpg"
}
},
).json()
task_id = created["data"]["taskId"]
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while True:
task = requests.get(
"https://api.gen202.com/api/v1/jobs/recordInfo",
headers=headers,
params={"taskId": task_id},
).json()["data"]
if task["state"] in ("success", "fail"):
break
time.sleep(3)
# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])
# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])
Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в
3 секунды, пока задача не закончится, и разбирает ответ до ссылки
на файл. Разборов два, потому что поле resultJson — строка JSON
внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её
перечислений, поэтому он проходит проверку шлюза как есть.
Подставить остаётся только свой ключ.
Пример на оболочке разбирает ответ через jq; на Python своего
ничего не нужно, кроме requests.
Ответ, когда задача готова
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "kling/4-0-keyframe-to-video",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": ""
}
}
Ссылка на файл лежит в resultJson — это строка, внутри которой ещё
один JSON, поэтому разбирать её нужно вторым разбором. Пока задача не завершилась, там пустая
строка, а в state — waiting,
queuing или generating. В настоящем ответе
есть ещё поле creditsConsumed со списанием; здесь его нет намеренно —
сумма зависит от запрошенного варианта, а цены живут в
каталоге. Все поля записи перечислены в разделе
Формат ответа.
Общее для всех моделей: Как устроена задача — чем отправить и как дождаться · Формат ответа — где в ответе ссылка на файл · Загрузка своих файлов — как получить ссылку на свою картинку · Отказы — что означает отказ
Kling 4.0 reference-to-video
Открыть страницу моделиkling/4-0-reference-to-video
Поля запроса
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| model | текст | обязательное | kling/4-0-reference-to-video |
| input | объект | обязательное | Параметры генерации — поля из таблицы ниже |
Поля input
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| prompt | текст | обязательное | от 1 до 8 000 символов |
| duration | целое число | опц. | целое от 3 до 30 |
| resolution | значение из списка | опц. | 720p · 1080p |
| aspect_ratio | значение из списка | опц. | auto · 16:9 · 9:16 · 1:1 · 21:9 |
| image_urls | список ссылок | опц. | до 10 ссылок на изображение |
| video_urls | список ссылок | опц. | до 5 ссылок на видео |
| keep_original_sound | да или нет | опц. | true или false |
Поле image_urls. Изображения-референсы: до 10. На них показывают персонажа, лист персонажа или раскадровку; стороны от 300 точек, пропорции от 2:5 до 5:2. В промпте на изображение ссылаются @image_1, @image_2 — по порядку в списке.
Поле video_urls. Видео-референсы: до 5, все вместе — до 30 секунд. Модель берёт с них игру персонажа, действие, движение камеры и темп. В промпте — @video_1, @video_2 по порядку.
Пример вызова
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
-H "Authorization: Bearer sk-ваш-ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "kling/4-0-reference-to-video",
"input": {
"prompt": "The ginger cat from @image_1, in a white spacesuit, floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
"aspect_ratio": "1:1",
"resolution": "720p",
"duration": 3,
"image_urls": [
"https://gen202.com/assets/sample-nano-banana-pro.jpg"
]
}
}' | jq -r '.data.taskId')
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while true; do
RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
-H "Authorization: Bearer sk-ваш-ключ")
STATE=$(echo "$RECORD" | jq -r '.data.state')
case "$STATE" in success|fail) break;; esac
sleep 3
done
# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
# внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
if .state == "fail"
then "отказ \(.failCode): \(.failMsg)"
else .resultJson | fromjson | .resultUrls[0]
end'
import json
import time
import requests
headers = {"Authorization": "Bearer sk-ваш-ключ"}
# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
"https://api.gen202.com/api/v1/jobs/createTask",
headers=headers,
json={
"model": "kling/4-0-reference-to-video",
"input": {
"prompt": "The ginger cat from @image_1, in a white spacesuit, floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
"aspect_ratio": "1:1",
"resolution": "720p",
"duration": 3,
"image_urls": [
"https://gen202.com/assets/sample-nano-banana-pro.jpg"
]
}
},
).json()
task_id = created["data"]["taskId"]
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while True:
task = requests.get(
"https://api.gen202.com/api/v1/jobs/recordInfo",
headers=headers,
params={"taskId": task_id},
).json()["data"]
if task["state"] in ("success", "fail"):
break
time.sleep(3)
# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])
# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])
Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в
3 секунды, пока задача не закончится, и разбирает ответ до ссылки
на файл. Разборов два, потому что поле resultJson — строка JSON
внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её
перечислений, поэтому он проходит проверку шлюза как есть.
Подставить остаётся только свой ключ.
Пример на оболочке разбирает ответ через jq; на Python своего
ничего не нужно, кроме requests.
Ответ, когда задача готова
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "kling/4-0-reference-to-video",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": ""
}
}
Ссылка на файл лежит в resultJson — это строка, внутри которой ещё
один JSON, поэтому разбирать её нужно вторым разбором. Пока задача не завершилась, там пустая
строка, а в state — waiting,
queuing или generating. В настоящем ответе
есть ещё поле creditsConsumed со списанием; здесь его нет намеренно —
сумма зависит от запрошенного варианта, а цены живут в
каталоге. Все поля записи перечислены в разделе
Формат ответа.
Общее для всех моделей: Как устроена задача — чем отправить и как дождаться · Формат ответа — где в ответе ссылка на файл · Загрузка своих файлов — как получить ссылку на свою картинку · Отказы — что означает отказ