Документация

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-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.
multi_prompt.json
{
  "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 достаточно назвать, что на них.

kling_elements.json
{
  "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"
        ]
      }
    ]
  }
}

Пример вызова

task.sh
# 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'
task.py
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.

Ответ, когда задача готова

recordInfo.json
{
  "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

Пример вызова

task.sh
# 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'
task.py
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.

Ответ, когда задача готова

recordInfo.json
{
  "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-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

Пример вызова

task.sh
# 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'
task.py
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.

Ответ, когда задача готова

recordInfo.json
{
  "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 МБ. Первая — первый кадр.

Пример вызова

task.sh
# 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'
task.py
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.

Ответ, когда задача готова

recordInfo.json
{
  "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/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

Пример вызова

task.sh
# 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'
task.py
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.

Ответ, когда задача готова

recordInfo.json
{
  "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>>> — по порядку в списке.

Пример вызова

task.sh
# 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'
task.py
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.

Ответ, когда задача готова

recordInfo.json
{
  "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

Поля запроса

ПолеТипОбяз.Допустимые значения
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 секунд.

Пример вызова

task.sh
# 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'
task.py
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.

Ответ, когда задача готова

recordInfo.json
{
  "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 по порядку.

Пример вызова

task.sh
# 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'
task.py
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.

Ответ, когда задача готова

recordInfo.json
{
  "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 со списанием; здесь его нет намеренно — сумма зависит от запрошенного варианта, а цены живут в каталоге. Все поля записи перечислены в разделе Формат ответа.

Общее для всех моделей: Как устроена задача  — чем отправить и как дождаться · Формат ответа  — где в ответе ссылка на файл · Загрузка своих файлов  — как получить ссылку на свою картинку · Отказы  — что означает отказ