Краткое практическое введение
Kling 3.0 подходит для случаев, когда нужно сгенерировать или отредактировать короткое видео несколькими разными способами через один и тот же Public API endpoint.
Практически у модели пять основных сценариев:
text_to_video - видео только по текстовому описанию;
image_to_video - анимация одного исходного изображения;
reference_image_to_video - видео по стартовому кадру с дополнительными референсами изображений;
edit_video - редактирование уже готового видео;
reference_video_to_video - генерация на основе референс-видео с возможностью добавить изображения-референсы.
Дополнительно модель поддерживает несколько полезных опций:
generate_audio для генерации нативного аудио в режимах без входного видео;
voice_ids для озвучки в text_to_video;
use_multi_prompt и multi_prompt для multi-shot сценариев с несколькими сценами;
- конечный кадр для
image_to_video и reference_image_to_video;
- массивы изображений и массивы
elements для более точного контроля персонажей, объектов и стиля.
Каждый вызов создаёт асинхронную операцию. Сразу после запроса API возвращает id, стартовый статус и стоимость запуска, а готовый ролик нужно получать отдельной проверкой статуса.
Создание операции
- Endpoint:
POST /api/v1/operations
- Авторизация:
Authorization: Bearer brth_...
- Запрос создаёт новую операцию и сразу возвращает
id, стартовый статус и стоимость.
- Выполнение асинхронное.
Практически у Kling 3.0 есть пять публичных режимов:
text_to_video
image_to_video
reference_image_to_video
edit_video
reference_video_to_video
Тело запроса
Базовая форма запроса:
{
"tool": "kling-3-0",
"input": {
"kling_generation_type": "image_to_video",
"kling_model_tier": "standard",
"...": "..."
}
}
tool - slug нейросети. Для этой модели всегда используйте "kling-3-0".
input - параметры конкретного запуска.
- Набор полей внутри
input зависит от выбранного kling_generation_type.
- Параметры передаются напрямую внутри
input, без дополнительного вложенного объекта input.input.
Параметры
| Параметр | Тип | Обязательный | Описание |
|---|
kling_generation_type | enum | Да | Режим запуска. Варианты: text_to_video, image_to_video, reference_image_to_video, edit_video, reference_video_to_video. Именно этот параметр определяет, какие остальные поля нужно передавать. |
kling_model_tier | enum | Да | Качество модели. Варианты: standard, pro. Влияет на цену во всех режимах. |
use_multi_prompt | boolean | Нет | Включает multi-shot сценарий с несколькими сценами. Практически имеет смысл в режимах без входного видео. Если включён, основной prompt можно не передавать, а детализацию сцены нужно описывать в multi_prompt. |
prompt | string | Да | Основное текстовое описание ролика или правок. Максимум 2500 символов. Для text_to_video можно использовать маркеры <<<voice_1>>> и <<<voice_2>>>, если передаёте voice_ids. |
multi_prompt | object[] | Да | Массив сцен для multi-shot генерации. Каждый элемент должен содержать prompt и duration. Минимум 1, максимум 6 сцен. Длительность одной сцены - от 3 до 15 секунд. Если используете multi_prompt, поле duration должно совпадать с суммой длительностей всех сцен. |
image_url | string (url) | Да | Один URL исходного изображения для режима image_to_video. Разрешены только внешние http/https ссылки. Допустимые форматы Public API: JPG, JPEG, PNG, WebP. |
start_image_url | string (url) | Да | Один URL стартового кадра для режима с референс-изображениями. Форматы Public API: JPG / JPEG / PNG / WebP. |
|
Примеры запросов
Сценарий 1. Видео из текста
cURL
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "kling-3-0",
"input": {
"kling_generation_type": "text_to_video",
"kling_model_tier": "standard",
"prompt": "Кинематографичный ночной город после дождя. <<<voice_1>>> говорит спокойным голосом: «Мы уже рядом». Камера медленно едет вперёд, отражения неона в мокром асфальте, мягкий пар в воздухе.",
"duration": 5,
"aspect_ratio": "16:9",
"generate_audio": true,
"voice_ids": [
"11111111-1111-1111-1111-111111111111"
]
}
}'
JavaScript / TypeScript
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'kling-3-0',
input: {
kling_generation_type: 'text_to_video',
kling_model_tier: 'standard',
prompt:
'Кинематографичный ночной город после дождя. <<<voice_1>>> говорит спокойным голосом: «Мы уже рядом». Камера медленно едет вперёд, отражения неона в мокром асфальте, мягкий пар в воздухе.',
duration: 5,
aspect_ratio: '16:9',
generate_audio: true,
voice_ids: ['11111111-1111-1111-1111-111111111111'],
},
}),
})
const data = await response.json()
console.log(data)
Python
import requests
response = requests.post(
"https://bratuha.ru/api/v1/operations",
headers={
"Authorization": "Bearer brth_ваш_ключ",
"Content-Type": "application/json",
},
json={
"tool": "kling-3-0",
"input": {
"kling_generation_type": "text_to_video",
"kling_model_tier": "standard",
"prompt": "Кинематографичный ночной город после дождя. <<<voice_1>>> говорит спокойным голосом: «Мы уже рядом». Камера медленно едет вперёд, отражения неона в мокром асфальте, мягкий пар в воздухе.",
"duration": 5,
"aspect_ratio": "16:9",
"generate_audio": True,
"voice_ids": ["11111111-1111-1111-1111-111111111111"],
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Сценарий 2. Анимация одного изображения
cURL
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "kling-3-0",
"input": {
"kling_generation_type": "image_to_video",
"kling_model_tier": "standard",
"prompt": "Девушка делает пол-оборота, улыбается в камеру, лёгкий ветер шевелит волосы, мягкий золотой свет, плавное движение камеры.",
"image_url": "https://cdn.example.com/source-image-1.jpg",
"duration": 5,
"generate_audio": false
}
}'
JavaScript / TypeScript
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'kling-3-0',
input: {
kling_generation_type: 'image_to_video',
kling_model_tier: 'standard',
prompt:
'Девушка делает пол-оборота, улыбается в камеру, лёгкий ветер шевелит волосы, мягкий золотой свет, плавное движение камеры.',
image_url: 'https://cdn.example.com/source-image-1.jpg',
duration: 5,
generate_audio: false,
},
}),
})
const data = await response.json()
console.log(data)
Python
import requests
response = requests.post(
"https://bratuha.ru/api/v1/operations",
headers={
"Authorization": "Bearer brth_ваш_ключ",
"Content-Type": "application/json",
},
json={
"tool": "kling-3-0",
"input": {
"kling_generation_type": "image_to_video",
"kling_model_tier": "standard",
"prompt": "Девушка делает пол-оборота, улыбается в камеру, лёгкий ветер шевелит волосы, мягкий золотой свет, плавное движение камеры.",
"image_url": "https://cdn.example.com/source-image-1.jpg",
"duration": 5,
"generate_audio": False,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Сценарий 3. Видео по стартовому кадру и нескольким сценам
cURL
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "kling-3-0",
"input": {
"kling_generation_type": "reference_image_to_video",
"kling_model_tier": "standard",
"use_multi_prompt": true,
"start_image_url": "https://cdn.example.com/source-image-1.jpg",
"image_urls": [
"https://cdn.example.com/source-image-2.jpg",
"https://cdn.example.com/source-image-3.jpg"
],
"duration": 10,
"multi_prompt": [
{
"prompt": "Персонаж медленно поднимает голову и смотрит в сторону камеры, лёгкий ветер, спокойный фон.",
"duration": 4
},
{
"prompt": "Камера плавно приближается, персонаж делает шаг вперёд и мягко улыбается, сохраняется тот же стиль и освещение.",
"duration": 6
}
],
"generate_audio": false
}
}'
JavaScript / TypeScript
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'kling-3-0',
input: {
kling_generation_type: 'reference_image_to_video',
kling_model_tier: 'standard',
use_multi_prompt: true,
start_image_url: 'https://cdn.example.com/source-image-1.jpg',
image_urls: [
'https://cdn.example.com/source-image-2.jpg',
'https://cdn.example.com/source-image-3.jpg',
],
duration: 10,
multi_prompt: [
{
prompt:
'Персонаж медленно поднимает голову и смотрит в сторону камеры, лёгкий ветер, спокойный фон.',
duration: 4,
},
{
prompt:
'Камера плавно приближается, персонаж делает шаг вперёд и мягко улыбается, сохраняется тот же стиль и освещение.',
duration: 6,
},
],
generate_audio: false,
},
}),
})
const data = await response.json()
console.log(data)
Python
import requests
response = requests.post(
"https://bratuha.ru/api/v1/operations",
headers={
"Authorization": "Bearer brth_ваш_ключ",
"Content-Type": "application/json",
},
json={
"tool": "kling-3-0",
"input": {
"kling_generation_type": "reference_image_to_video",
"kling_model_tier": "standard",
"use_multi_prompt": True,
"start_image_url": "https://cdn.example.com/source-image-1.jpg",
"image_urls": [
"https://cdn.example.com/source-image-2.jpg",
"https://cdn.example.com/source-image-3.jpg",
],
"duration": 10,
"multi_prompt": [
{
"prompt": "Персонаж медленно поднимает голову и смотрит в сторону камеры, лёгкий ветер, спокойный фон.",
"duration": 4,
},
{
"prompt": "Камера плавно приближается, персонаж делает шаг вперёд и мягко улыбается, сохраняется тот же стиль и освещение.",
"duration": 6,
},
],
"generate_audio": False,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Сценарий 4. Редактирование готового видео
cURL
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "kling-3-0",
"input": {
"kling_generation_type": "edit_video",
"kling_model_tier": "pro",
"prompt": "Сделай фон более кинематографичным, усили мягкий контровой свет, сохрани лицо и движения человека без искажений.",
"video_url_edit": "https://cdn.example.com/source-video-1.mp4",
"keep_audio_edit": true
}
}'
JavaScript / TypeScript
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'kling-3-0',
input: {
kling_generation_type: 'edit_video',
kling_model_tier: 'pro',
prompt:
'Сделай фон более кинематографичным, усили мягкий контровой свет, сохрани лицо и движения человека без искажений.',
video_url_edit: 'https://cdn.example.com/source-video-1.mp4',
keep_audio_edit: true,
},
}),
})
const data = await response.json()
console.log(data)
Python
import requests
response = requests.post(
"https://bratuha.ru/api/v1/operations",
headers={
"Authorization": "Bearer brth_ваш_ключ",
"Content-Type": "application/json",
},
json={
"tool": "kling-3-0",
"input": {
"kling_generation_type": "edit_video",
"kling_model_tier": "pro",
"prompt": "Сделай фон более кинематографичным, усили мягкий контровой свет, сохрани лицо и движения человека без искажений.",
"video_url_edit": "https://cdn.example.com/source-video-1.mp4",
"keep_audio_edit": True,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Сценарий 5. Видео по референс-видео
cURL
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "kling-3-0",
"input": {
"kling_generation_type": "reference_video_to_video",
"kling_model_tier": "pro",
"prompt": "Замени автомобиль в ролике на автомобиль с референсных изображений, сохрани ракурс, темп движения и общую композицию.",
"video_url_reference": "https://cdn.example.com/source-video-2.mov",
"image_urls_reference": [
"https://cdn.example.com/source-image-4.jpg",
"https://cdn.example.com/source-image-5.jpg"
],
"duration_v2v": 7,
"aspect_ratio_v2v": "16:9",
"keep_audio_reference": true
}
}'
JavaScript / TypeScript
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'kling-3-0',
input: {
kling_generation_type: 'reference_video_to_video',
kling_model_tier: 'pro',
prompt:
'Замени автомобиль в ролике на автомобиль с референсных изображений, сохрани ракурс, темп движения и общую композицию.',
video_url_reference: 'https://cdn.example.com/source-video-2.mov',
image_urls_reference: [
'https://cdn.example.com/source-image-4.jpg',
'https://cdn.example.com/source-image-5.jpg',
],
duration_v2v: 7,
aspect_ratio_v2v: '16:9',
keep_audio_reference: true,
},
}),
})
const data = await response.json()
console.log(data)
Python
import requests
response = requests.post(
"https://bratuha.ru/api/v1/operations",
headers={
"Authorization": "Bearer brth_ваш_ключ",
"Content-Type": "application/json",
},
json={
"tool": "kling-3-0",
"input": {
"kling_generation_type": "reference_video_to_video",
"kling_model_tier": "pro",
"prompt": "Замени автомобиль в ролике на автомобиль с референсных изображений, сохрани ракурс, темп движения и общую композицию.",
"video_url_reference": "https://cdn.example.com/source-video-2.mov",
"image_urls_reference": [
"https://cdn.example.com/source-image-4.jpg",
"https://cdn.example.com/source-image-5.jpg",
],
"duration_v2v": 7,
"aspect_ratio_v2v": "16:9",
"keep_audio_reference": True,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Примеры ответов
Ответ после создания
{
"id": "op_uuid-123",
"status": "queued",
"tool": "kling-3-0",
"cost": 165,
"balance_after": 495,
"created_at": "2026-03-27T12:00:00Z"
}
Ответ после завершения
{
"id": "op_uuid-123",
"status": "completed",
"tool": "kling-3-0",
"cost": 165,
"created_at": "2026-03-27T12:00:00Z",
"completed_at": "2026-03-27T12:03:41Z",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/kling-3-0/result.mp4"
]
},
"error_message": null
}
Проверка статуса
После создания операции сохраните id и используйте его для отдельной проверки статуса:
- Endpoint:
GET /api/v1/operations/{id}
- Этот
id возвращается сразу после POST /api/v1/operations.
cURL
curl -H "Authorization: Bearer brth_ваш_ключ" \
https://bratuha.ru/api/v1/operations/op_uuid-123
JavaScript / TypeScript
const response = await fetch(
'https://bratuha.ru/api/v1/operations/op_uuid-123',
{
headers: {
Authorization: 'Bearer brth_ваш_ключ',
},
},
)
const data = await response.json()
console.log(data)
Формат результата
После успешного завершения операция возвращает result в таком формате:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/kling-3-0/result.mp4"
]
}
Что важно знать:
type для Kling 3.0 в Public API нужно обрабатывать как "video";
urls - массив ссылок на готовые mp4-файлы;
- обычно один запуск возвращает один ролик, но клиенту интеграции лучше обрабатывать результат как массив ссылок;
- это исправляет слабое место автогенерации, где результат может выглядеть как абстрактный
file, хотя реальные completed операции у kling-3-0 возвращают именно video.
Ценообразование
Базовая ставка начинается от 27 ₽ за секунду.
Итоговая цена зависит от четырёх вещей:
- выбранного режима
kling_generation_type;
- модели
kling_model_tier;
- включения
generate_audio, если режим поддерживает генерацию аудио;
- длительности ролика в секундах.
Практические правила расчёта:
- для
text_to_video, image_to_video и reference_image_to_video цена считается по полю duration;
- для
reference_video_to_video цена считается по полю duration_v2v;
- для multi-shot сценариев сумма
multi_prompt[*].duration должна совпадать с duration;
- секунды округляются вверх;
- минимальная расчётная длительность -
3 секунды;
- общий верхний предел pricing-matrix -
15 секунд, но для video-to-video сценариев практически ориентируйтесь на исходные видео до 10 секунд.
Генерация без входного видео
| Режим | Standard без аудио | Standard с аудио | Pro без аудио | Pro с аудио |
|---|
text_to_video | 27 ₽/сек | 33 ₽/сек | 33 ₽/сек | 42 ₽/сек |
image_to_video | 27 ₽/сек | 33 ₽/сек | 33 ₽/сек | 42 ₽/сек |
reference_image_to_video | 27 ₽/сек | 33 ₽/сек | 33 ₽/сек | 42 ₽/сек |
Редактирование и референс-видео
| Режим | Standard | Pro |
|---|
edit_video | 40 ₽/сек | 50 ₽/сек |
reference_video_to_video | 40 ₽/сек | 50 ₽/сек |
Что это означает на практике:
pro всегда дороже standard;
generate_audio = true влияет только на text_to_video, image_to_video и reference_image_to_video;
keep_audio_edit и keep_audio_reference меняют поведение результата, но не увеличивают цену сами по себе;
- чем длиннее ролик, тем выше итоговая стоимость.
Примеры расчёта:
text_to_video + standard + generate_audio = true + 5 секунд = 165 ₽;
image_to_video + pro + generate_audio = false + 9 секунд = 297 ₽;
reference_video_to_video + pro + 7 секунд = 350 ₽.
Ограничения и практические заметки
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую операцию.
- Все операции выполняются асинхронно: сначала вы получаете
queued, затем отдельно проверяете статус по id.
- Для всех файлов нужны внешние
http/https URL. localhost, private IP и внутренние адреса не принимаются.
- Для image URL в Public API используйте только
.jpg, .jpeg, .png, .webp. Форматы HEIC/HEIF, которые доступны в UI-загрузке, через внешние URL для Public API не поддерживаются.
- Для video URL используйте только
.mp4 и .mov.
- Режимы
edit_video и reference_video_to_video практически рассчитаны на входные ролики длиной от 3 до 10 секунд.
- Если включаете
use_multi_prompt, следите, чтобы duration совпадал с суммой multi_prompt[*].duration.
- Не комбинируйте
use_multi_prompt = true с конечным кадром use_end_image_i2v или use_end_image_reference.
- В
reference_image_to_video поле image_urls поддерживает до 4 изображений, но вместе с конечным кадром лучше ориентироваться на лимит 2.
- Для
voice_ids используйте не более двух голосов и обязательно ставьте соответствующие маркеры <<<voice_1>>> и <<<voice_2>>> внутри prompt.
- Если нужно точнее удерживать конкретный объект или персонажа, используйте
elements, elements_edit или elements_reference, а не пытайтесь описать всё только текстом.
- Не опрашивайте
GET /api/v1/operations/{id} слишком часто. Практически безопасно проверять статус примерно раз в секунду.