Kling 4.0 — видеомодель нового поколения Kling от Kuaishou. Асинхронная задача отправляется через POST /v1/videos/generations: без референсов это видео из текста, либо до 10 изображений, 5 видео и 3 аудио в качестве референсов вместе. 3–30 секунд, 720P / 1080P, 16:9 или 9:16, всегда со звуком. Оплата по секундам; с референсными видео оплачиваются секунды результата плюс секунды референсных видео.
Быстрый старт
Три шага: отправить задачу, опросить её и забрать ссылку на видео. Замените YOUR_API_KEY своим ключом, и команды ниже заработают как есть.
Шаг 1 · Отправка (сразу возвращает id задачи, HTTP 202)
curl https://nezhagate.com/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "kling-4.0", "prompt": "танцовщица кружится среди падающих кленовых листьев, камера медленно облетает её", "duration": 5, "resolution": "720P", "size": "16:9"}'Ответ (HTTP 202)
{
"id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
"object": "video.generation.job",
"status": "queued",
"created": 1791281400,
"model": "kling-4.0"
}Шаг 2 · Опрашивайте каждые 5–10 секунд, пока status не станет succeeded или failed
curl https://nezhagate.com/v1/videos/jobs/img_5c2e8f1a9b3d7e6f0a4c8b2d \ -H "Authorization: Bearer YOUR_API_KEY"
Ответ при успехе
{
"id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
"object": "video.generation.job",
"status": "succeeded",
"created": 1791281400,
"model": "kling-4.0",
"data": [
{"url": "https://img.nezhagate.com/i/8c1f0e5d2b7a49e3a6d0c4f1b9e2a7d5.mp4"}
],
"usage": {"clips": 1, "model": "kling-4.0"}
}Шаг 3 · data[0].url — это ролик (MP4). Он хранится 15 дней; чтобы пользоваться им дольше, скачайте его в своё хранилище.
Полный пример (Python: отправить, дождаться, сохранить на диск)
import time
import requests
BASE = "https://nezhagate.com/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
# 1. отправка
job = requests.post(f"{BASE}/videos/generations", headers=HEADERS, json={
"model": "kling-4.0",
"prompt": "танцовщица кружится среди падающих кленовых листьев, камера медленно облетает её",
"duration": 5,
"resolution": "720P",
"size": "16:9",
}).json()
if "error" in job:
raise SystemExit(job["error"]["message"])
# 2. опрос каждые 10 секунд, не дольше часа
deadline = time.time() + 3600
while job["status"] not in ("succeeded", "failed") and time.time() < deadline:
time.sleep(10)
job = requests.get(f"{BASE}/videos/jobs/{job['id']}", headers=HEADERS).json()
# 3. скачивание видео
if job["status"] == "succeeded":
url = job["data"][0]["url"]
with open("kling-4.0.mp4", "wb") as f:
f.write(requests.get(url).content)
print("saved", url)
elif job["status"] == "failed":
print("failed:", job["error"]["code"], job["error"]["message"])
else:
print("still", job["status"], job["id"])Пока задача в очереди, опрос также возвращает queue_position (сколько задач впереди вашей) и eta_seconds (ожидаемое время ожидания). Если ваш лимит ожидания истёк, не отправляйте задачу заново: она никуда не делась, продолжайте опрашивать тот же id позже.
Аутентификация
Authorization: Bearer YOUR_API_KEY Content-Type: application/json
Чтобы начать, создайте API-ключ в консоли.
Основные характеристики
| Длительность | 3–30 с с шагом в секунду (по умолчанию 5 с) |
| Разрешение | 720P / 1080P |
| Пропорции | 16:9 / 9:16 |
| Референсные изображения | до 10 · все как референсы (персонажи, костюмы, реквизит, обстановка), не первый кадр |
| Референсные видео | до 5 · каждое 2–30 с и высотой 700–4553 пикселей, всего до 30 с · входят в оплачиваемые секунды |
| Референсное аудио | до 3 · каждое 5–30 с чёткой человеческой речи, задаёт голос · не оплачивается |
| Звук | всегда включён, отключить нельзя (audio: false отклоняется) |
| Длина промпта | до 2500 символов (китайский и английский считаются одинаково) |
| Оплата | по секундам: (секунды результата + секунды референсных видео) x цена за секунду для разрешения |
Параметры запроса
JSON-тело запроса POST /v1/videos/generations:
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| model | string | Да | ID модели: kling-4.0. |
| prompt | string | Да | Что происходит, камера, действие и звук, до 2500 символов. С референсами напишите, для чего каждый, например «персонаж с изображения 1 размахивает копьём в лесу с изображения 2, повторяя движения из референсного видео, и говорит голосом из референсного аудио: давай!». |
| duration | integer | Нет | Длительность результата, целое число от 3 до 30, по умолчанию 5; псевдоним seconds. |
| resolution | string | Нет | 720P (по умолчанию) или 1080P. |
| size | string | Нет | 16:9 (по умолчанию) или 9:16; псевдоним aspect_ratio. Другие соотношения отклоняются (400). |
| images | array | Нет | До 10 референсных изображений (публичные ссылки, data: URI или base64, каждое до 16 МБ); также image (одно) или reference_images. Все — референсы, а не первый кадр; start_frame, end_frame и image_role=first_frame отклоняются. |
| video_references | array | Нет | До 5 референсных видео (mp4 / mov, каждое 2–30 с, высотой 700–4553 пикселей и до 50 МБ, всего до 30 с): прямые ссылки на файл, base64 (data:video/mp4;base64,...) или ссылки после загрузки в Playground. Оплачиваются по секундам, см. «Цена» ниже. |
| audio_reference | array | Нет | До 3 референсных аудио (mp3 / wav / m4a, каждое 5–30 с и до 15 МБ), задающих голос персонажа: только чёткая человеческая речь (музыка и эффекты не пройдут); только http(s) ссылки, вместе с референсным изображением или видео. Не оплачивается. |
| audio | boolean | Нет | Звук есть в каждом ролике и не отключается; false отклоняется (400), просто не передавайте его. |
| callback_url | string | Нет | Куда отправить результат, когда задача завершится; подробнее — в разделе о вебхуках ниже. |
| n | integer | Нет | Каждая задача создаёт один ролик; передавать параметр не нужно. При значении больше 1 всё равно создаётся один ролик, но при отправке резервируется стоимость n роликов, а лишнее возвращается после завершения задачи. |
Другие поля (seed, negative_prompt, fps, watermark и т. п.) дальше не передаются и не влияют на цену; результат всегда в MP4 и возвращается в виде url.
Цена
Оплата по секундам: стоимость = цена за секунду для разрешения x (секунды результата + секунды каждого референсного видео). Одна и та же ссылка на видео считается один раз; референсные изображения и аудио бесплатны. Сумма резервируется при отправке, при успехе списывается та же сумма, при ошибке всё возвращается. 1 кредит = $0.005.
| Разрешение | Кредитов за секунду | USD за секунду | Ролик 5 с | 10 с результата + референс 5 с (15 оплачиваемых с) |
|---|---|---|---|---|
| 720P | 18 | $0.09 | $0.45 | $1.35 |
| 1080P | 25 | $0.125 | $0.625 | $1.875 |
Референсные материалы
- Референсные изображения — только референсы, не первый кадр. Напишите в промпте, для чего каждое, по номеру, например «персонаж с изображения 1», «обстановка с изображения 2».
- Референсные видео задают движение и камеру и сочетаются с изображениями. Каждое 2–30 с и высотой 700–4553 пикселей (например 1280x720 горизонтально или 720x1280 вертикально; видео 480P не пройдёт), всего до 30 с. При отправке мы скачиваем и измеряем каждое: видео с нечитаемой длительностью, слишком короткое или недостаточно высокое получает 400 без оплаты.
- Референсное аудио задаёт голос персонажа и должно быть 5–30 с чёткой человеческой речи; музыка, эффекты или фрагменты короче 5 с отклоняются. Реплики напишите в промпте.
- Каждое изображение — публичная ссылка на изображение,
data:URI или base64, не более 16 MB; несколько изображений передавайте массивом вimages. При отправке мы сначала сохраняем изображения у себя, и только потом задача встаёт в очередь; изображение, которое не удаётся прочитать, отклоняется с ошибкой 400, вmessageуказано, какое именно, и ничего не списывается. - Референсные материалы мы размещаем у себя и храним 7 дней, готовые ролики — 15 дней.
С референсными изображениями, видео и аудио
curl https://nezhagate.com/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "kling-4.0", "prompt": "персонаж с изображения 1 размахивает копьём в лесу с изображения 2, повторяя движения из референсного видео, и кричит голосом из референсного аудио: давай", "images": ["https://example.com/character.png", "https://example.com/forest.png"], "video_references": ["https://example.com/moves-1280x720.mp4"], "audio_reference": ["https://example.com/voice-8s.mp3"], "duration": 10, "resolution": "720P", "size": "16:9"}'Эта задача даёт 10 с результата при референсном видео 5 с, поэтому оплачиваются 15 секунд; референсное аудио бесплатно.
Статус задачи и поля ответа
GET /v1/videos/jobs/{id} возвращает эти статусы; все поля описаны в разделе Асинхронные задачи. Опрашивайте каждые 5–10 секунд или получайте результат вебхуком (см. ниже). Опрос бесплатный, и прочитать задачу может любой ключ того же аккаунта.
| Статус | Что значит |
|---|---|
| queued | В очереди. В ответе есть queue_position (сколько задач впереди) и eta_seconds (ожидаемое время ожидания). |
| processing | Генерируется. |
| succeeded | Готово. Результат в data[0].url, детали оплаты в usage. |
| failed | Ошибка. Причина в error; зарезервированные кредиты возвращаются полностью. |
processingможет снова смениться наqueued: например, пока заняты все линии, пока готовый ролик скачивается повторно или после перезапуска сервиса. Если линия не смогла выполнить задачу, шлюз может передать её следующей линии для повторного рендера; сколько бы линий ни прошла задача, она оплачивается один раз.- Один аккаунт выполняет до 50 задач одновременно; остальные ждут в порядке отправки, а задача, не начавшаяся за 15 минут, завершается ошибкой с полным возвратом. Записи о задачах хранятся 3 дня, ссылки на видео — 15 дней.
Сколько ждать
В наших тестах (720P / 1080P, 3–5 с) ролик обычно был готов за 3–5 минут; при большой очереди дольше. Мы ждём до 120 минут и при тайм-ауте возвращаем всё.
Медианное время рендера в наших тестах: 3.3 мин.
Ошибки и возвраты
Ошибка при отправке сразу возвращается как HTTP 4xx / 5xx: задача не создаётся, ничего не списывается. О неудаче после того, как задача принята, сообщает эндпоинт задачи, а резерв возвращается полностью. Все коды перечислены в разделе Коды ошибок.
Ошибки при отправке
| HTTP | code | Причина | Что делать |
|---|---|---|---|
| 400 | invalid_request | Недопустимый параметр: длительность, разрешение, пропорция или число референсов выходят за пределы, допустимые для этой модели; промпт слишком длинный; не удаётся прочитать референсное изображение или видео; передан audio: false модели, ролики которой всегда со звуком, и т. п. Что именно не так, указано в message. | Исправьте то, что указано в message, и отправьте снова. |
| 400 | invalid_callback_url | callback_url — не публичный адрес http(s) или длиннее 2000 символов. | Укажите адрес, доступный из интернета. |
| 400 | model_not_found | ID модели написан с ошибкой, model не передан или модель нельзя использовать на этом эндпоинте (например, чат-модель на эндпоинте изображений). | Берите ID модели из GET /v1/models или из справочника API. |
| 401 | invalid_api_key | Ключ не существует, удалён или отключён, либо отключён аккаунт. | Проверьте ключ на странице API Keys в консоли. |
| 402 | insufficient_quota | Баланса не хватает, чтобы зарезервировать стоимость этого запроса. Шлюз сначала резервирует максимально возможную стоимость запроса, поэтому ошибка может возникнуть и при всплеске одновременных вызовов. | Если был всплеск запросов, подождите несколько секунд и повторите; в остальных случаях пополните баланс. |
| 429 | rate_limit_exceeded | Превышен лимит запросов в минуту, заданный для этого ключа (считается за последние 60 секунд). Заголовка Retry-After нет. | Подождите несколько секунд и повторите или увеличьте лимит ключа в консоли. |
| 503 | model_maintenance | Модель на обслуживании и не принимает запросы; пока идёт обслуживание, другая модель вместо неё не ответит. | Повторите, когда обслуживание закончится; ход работ — на странице статуса. |
| 503 | service_unavailable | Временный сбой на нашей стороне, например при сохранении референсного файла. Задача не создана, ничего не списано. | Повторите чуть позже. |
Неудачные задачи (status — failed)
| code | Когда возникает | Что делать |
|---|---|---|
| content_policy | Видео: промпт, референс или сгенерированный видеоряд либо звук не прошли проверку контента (если отклонён звук, param равен audio). Wan Standard и Prime: исходные материалы не прошли проверку. error.reason — FaceDetectionSuspect (предположительно лицо реального человека) или DataInspectionFailed (отклонён входной контент). В error.message указаны причина и рекомендуемые изменения. Неудачные задания не оплачиваются. | Перепишите промпт или замените референс и только потом отправляйте снова: те же входные данные будут отклонены повторно. |
| duration_rejected | Референс не принят: референсное аудио не является 5–30 с чёткой человеческой речи, или у референсного видео недопустимая длительность. При param = audio дело в аудио. | Возьмите голос длиной от 5 с (или уберите референсное аудио) и обрежьте референсные видео до 2–30 с, затем отправьте снова; без изменений будет та же ошибка. |
| render_failed | Видео: на этот раз ролик не получился; обычно это разовый сбой. | Повторная отправка того же запроса обычно проходит успешно. |
| render_timeout | Видео: очередь или рендер заняли слишком много времени, и поставщик отказался от задачи. | Отправьте задачу заново. |
| result_fetch_failed | Видео создано, но на нашей стороне его так и не удалось скачать или сохранить, несмотря на повторные попытки. | Отправьте задачу заново. |
| upstream_error | Любая другая ошибка: перепробованы все линии, задача ждала 15 минут и так и не запустилась, поставщик отказал без объяснения причины и т. п.; что именно произошло, указано в message. | Обычно повторная отправка проходит успешно. |
Ориентируйтесь на code, а не на текст message. Любой незнакомый code (или его отсутствие) обрабатывайте как upstream_error: повторная отправка обычно проходит успешно. За каждую неудачную задачу деньги возвращаются полностью.
Вебхуки вместо опроса
Добавьте при отправке callback_url — как только задача завершится, успешно или с ошибкой, шлюз отправит на этот URL ровно то же, что возвращает эндпоинт опроса; запрос подписан, а при неудачной доставке повторяется. Общий адрес для всего аккаунта можно также задать в консоли, в разделе «Настройки → Вебхуки». Документация по вебхукам →
curl https://nezhagate.com/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "kling-4.0", "prompt": "танцовщица кружится среди падающих кленовых листьев, камера медленно облетает её", "duration": 5, "resolution": "720P", "size": "16:9", "callback_url": "https://your-domain.com/webhook"}'