Создаёт драматические видео по сценарию, референсам и загруженным ассетам, помогая собрать сцену с персонажами, предметами и нужной композицией. Цена - 14 ₽ за секунду видео.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Vidu Q3 Drama снимает короткую сцену по сценарию: вы описываете кадры, реплики и движение камеры, а героев, место действия и важные предметы задаёте отдельными референсами - ассетами. Модель держит внешность персонажей по их фотографиям, собирает сцену из нескольких планов и озвучивает реплики. Подходит для коротких сериалов, роликов с одними и теми же героями, раскадровок и рекламных мини-историй. Длина ролика - от 2 до 30 секунд.
Каждый вызов создаёт асинхронную операцию. После запуска сохраните id и проверяйте статус отдельным запросом.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Основа запроса во всех сценариях одна: название name, сценарий content и массив ассетов assets. Дальше два варианта:
image, placement: "panorama" (так работает по умолчанию);image, которая подсказывает модели расстановку героев и композицию кадра; как её использовать, задаёт placement.{
"tool": "vidu-q3-drama",
"input": {
"...": "..."
}
}
tool - slug нейросети, всегда "vidu-q3-drama".input - параметры запуска. Все поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
name | string | Да | Короткое название задачи, от 1 до 20 символов. На результат почти не влияет, нужно для порядка. |
content | string | Да | Сценарий: что происходит по кадрам, кто что говорит, эмоции, движение камеры. От 10 до 5000 символов. На ассеты ссылайтесь по их номеру в скобках, например «пекарь (01)». |
assets | object[] | Да | Ассеты - персонажи, места и предметы с референсами. От 1 до 14 элементов, удобнее всего 3-10. Поля элемента описаны в таблице ниже. |
image | string (url) | Нет | Изображение для позиционирования: подсказка, где стоят герои и как построен кадр. Один файл jpg, jpeg, png или webp. |
placement | enum | Нет | Как использовать image: upload - как загруженный референс расстановки, panorama - как панораму места действия, step - как последовательный референс. Если не передать, используется panorama. Для сцены без image оставьте panorama. |
quality | enum | Нет | Качество: standard - стандартное, обычно быстрее; high - высокое, детальнее. Если не передать, используется high. На цену не влияет. |
duration | number | Нет | Длина ролика в секундах, целое число от 2 до 30. Если не передать, используется 8. От неё зависит цена. |
resolution | enum | Нет | Разрешение: 720p или 1080p. Если не передать, используется 1080p. На цену не влияет. |
aspect_ratio | enum | Нет | Пропорции: 9:16 - вертикальное видео, 16:9 - горизонтальное. Если не передать, используется 9:16. |
style | string | Нет | Визуальный стиль одним-двумя словами, до 30 символов, без знаков препинания (., ,, ;, :, !, ?). Например реалистично или аниме. |
Поля элемента assets:
| Поле | Тип | Обязательный | Описание |
|---|---|---|---|
id | string | Да | Номер ассета - строка из двух цифр от "01" до "14". Именно строка с ведущим нулём: "1", 1 или "15" вернут 400 validation_error. Номера внутри запроса должны быть разными. |
name | string | Да | Название ассета, от 1 до 30 символов, например Пекарь или Кухня. |
type | enum | Да | Что это: character - персонаж, scene - место действия, tool - важный предмет. |
image_uri | string (url) | Да | Референс ассета - ссылка на одну картинку jpg, jpeg, png или webp. Для персонажа лучше всего подходит чёткое фото лица и фигуры. |
description | string | Нет | Описание до 1000 символов: внешность, одежда, роль, детали места или предмета. |
Ссылки на картинки передавайте как внешние http/https URL. Файл должен открываться без авторизации, размер - до 128 МБ.
Три ассета: два персонажа и место действия. В сценарии каждый упомянут по номеру.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "vidu-q3-drama",
"input": {
"name": "Утро в пекарне",
"content": "Кадр 1: утро, пекарня (03). Пекарь (01) выкладывает горячие круассаны на прилавок, над дверью звенит колокольчик.\nКадр 2: входит покупательница (02), стряхивает снег с пальто и говорит: \"Two croissants, please.\"\nКадр 3: крупный план пекаря, он улыбается и отвечает: \"Straight from the oven.\"",
"assets": [
{
"id": "01",
"name": "Пекарь",
"type": "character",
"image_uri": "https://cdn.example.com/baker-1.jpg",
"description": "Мужчина около 45 лет, короткая борода, очки, белый фартук"
},
{
"id": "02",
"name": "Покупательница",
"type": "character",
"image_uri": "https://cdn.example.com/customer-2.jpg",
"description": "Женщина около 30 лет, русые волосы, зелёное пальто"
},
{
"id": "03",
"name": "Пекарня",
"type": "scene",
"image_uri": "https://cdn.example.com/bakery-3.jpg",
"description": "Маленькая пекарня: кирпичная печь, полки с хлебом, витрина"
}
],
"placement": "panorama",
"quality": "high",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9",
"style": "реалистично"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'vidu-q3-drama',
input: {
name: 'Утро в пекарне',
content: 'Кадр 1: утро, пекарня (03). Пекарь (01) выкладывает горячие круассаны на прилавок, над дверью звенит колокольчик.\nКадр 2: входит покупательница (02), стряхивает снег с пальто и говорит: "Two croissants, please."\nКадр 3: крупный план пекаря, он улыбается и отвечает: "Straight from the oven."',
assets: [
{
id: '01',
name: 'Пекарь',
type: 'character',
image_uri: 'https://cdn.example.com/baker-1.jpg',
description: 'Мужчина около 45 лет, короткая борода, очки, белый фартук',
},
{
id: '02',
name: 'Покупательница',
type: 'character',
image_uri: 'https://cdn.example.com/customer-2.jpg',
description: 'Женщина около 30 лет, русые волосы, зелёное пальто',
},
{
id: '03',
name: 'Пекарня',
type: 'scene',
image_uri: 'https://cdn.example.com/bakery-3.jpg',
description: 'Маленькая пекарня: кирпичная печь, полки с хлебом, витрина',
},
],
placement: 'panorama',
quality: 'high',
duration: 8,
resolution: '1080p',
aspect_ratio: '16:9',
style: 'реалистично',
},
}),
})
const data = await response.json()
console.log(data.id, data.status)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'vidu-q3-drama',
'input': {
'name': 'Утро в пекарне',
'content': 'Кадр 1: утро, пекарня (03). Пекарь (01) выкладывает горячие круассаны на прилавок, над дверью звенит колокольчик.\nКадр 2: входит покупательница (02), стряхивает снег с пальто и говорит: "Two croissants, please."\nКадр 3: крупный план пекаря, он улыбается и отвечает: "Straight from the oven."',
'assets': [
{
'id': '01',
'name': 'Пекарь',
'type': 'character',
'image_uri': 'https://cdn.example.com/baker-1.jpg',
'description': 'Мужчина около 45 лет, короткая борода, очки, белый фартук',
},
{
'id': '02',
'name': 'Покупательница',
'type': 'character',
'image_uri': 'https://cdn.example.com/customer-2.jpg',
'description': 'Женщина около 30 лет, русые волосы, зелёное пальто',
},
{
'id': '03',
'name': 'Пекарня',
'type': 'scene',
'image_uri': 'https://cdn.example.com/bakery-3.jpg',
'description': 'Маленькая пекарня: кирпичная печь, полки с хлебом, витрина',
},
],
'placement': 'panorama',
'quality': 'high',
'duration': 8,
'resolution': '1080p',
'aspect_ratio': '16:9',
'style': 'реалистично',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Помимо ассетов передаётся image - эскиз или кадр, по которому модель расставляет героев. Здесь его используют как загруженный референс (placement: "upload").
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "vidu-q3-drama",
"input": {
"name": "Находка в саду",
"content": "Кадр 1: сад у дома (02). Мальчик (01) копает грядку и находит старую шкатулку (03).\nКадр 2: крупный план, он открывает крышку и замирает от удивления.",
"assets": [
{
"id": "01",
"name": "Мальчик",
"type": "character",
"image_uri": "https://cdn.example.com/boy-1.png"
},
{
"id": "02",
"name": "Сад",
"type": "scene",
"image_uri": "https://cdn.example.com/garden-2.png"
},
{
"id": "03",
"name": "Шкатулка",
"type": "tool",
"image_uri": "https://cdn.example.com/box-3.png",
"description": "Деревянная шкатулка с медными уголками"
}
],
"image": "https://cdn.example.com/layout-1.jpg",
"placement": "upload",
"quality": "standard",
"duration": 5,
"resolution": "720p",
"aspect_ratio": "9:16"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'vidu-q3-drama',
input: {
name: 'Находка в саду',
content: 'Кадр 1: сад у дома (02). Мальчик (01) копает грядку и находит старую шкатулку (03).\nКадр 2: крупный план, он открывает крышку и замирает от удивления.',
assets: [
{
id: '01',
name: 'Мальчик',
type: 'character',
image_uri: 'https://cdn.example.com/boy-1.png',
},
{
id: '02',
name: 'Сад',
type: 'scene',
image_uri: 'https://cdn.example.com/garden-2.png',
},
{
id: '03',
name: 'Шкатулка',
type: 'tool',
image_uri: 'https://cdn.example.com/box-3.png',
description: 'Деревянная шкатулка с медными уголками',
},
],
image: 'https://cdn.example.com/layout-1.jpg',
placement: 'upload',
quality: 'standard',
duration: 5,
resolution: '720p',
aspect_ratio: '9:16',
},
}),
})
const data = await response.json()
console.log(data.id, data.status)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'vidu-q3-drama',
'input': {
'name': 'Находка в саду',
'content': 'Кадр 1: сад у дома (02). Мальчик (01) копает грядку и находит старую шкатулку (03).\nКадр 2: крупный план, он открывает крышку и замирает от удивления.',
'assets': [
{
'id': '01',
'name': 'Мальчик',
'type': 'character',
'image_uri': 'https://cdn.example.com/boy-1.png',
},
{
'id': '02',
'name': 'Сад',
'type': 'scene',
'image_uri': 'https://cdn.example.com/garden-2.png',
},
{
'id': '03',
'name': 'Шкатулка',
'type': 'tool',
'image_uri': 'https://cdn.example.com/box-3.png',
'description': 'Деревянная шкатулка с медными уголками',
},
],
'image': 'https://cdn.example.com/layout-1.jpg',
'placement': 'upload',
'quality': 'standard',
'duration': 5,
'resolution': '720p',
'aspect_ratio': '9:16',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "vidu-q3-drama",
"cost": 28,
"balance_after": 972,
"created_at": "2026-10-01T16:10:38.940103+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "vidu-q3-drama",
"cost": 28,
"created_at": "2026-10-01T16:10:38.940103+00:00",
"completed_at": "2026-10-01T16:17:24.194731+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/vidu-q3-drama/video-1.mp4"
]
},
"error_message": null
}
Если модель не смогла сделать ролик, операция завершается со статусом failed, в result приходит null, а причина - в error_message. Списанная сумма возвращается на баланс.
{
"id": "op_uuid-123",
"status": "failed",
"tool": "vidu-q3-drama",
"cost": 112,
"created_at": "2026-10-01T16:10:38.940103+00:00",
"completed_at": "2026-10-01T17:10:59.000000+00:00",
"result": null,
"error_message": "Превышено время ожидания (60 мин). Нейросеть временно недоступна."
}
Сохраните id из ответа на создание и проверяйте операцию по нему:
GET /api/v1/operations/{id}
curl -H "Authorization: Bearer brth_ваш_ключ" \
https://bratuha.ru/api/v1/operations/op_uuid-123
async function waitForResult(id: string) {
while (true) {
const response = await fetch(`https://bratuha.ru/api/v1/operations/${id}`, {
headers: { Authorization: 'Bearer brth_ваш_ключ' },
})
const operation = await response.json()
if (operation.status === 'completed' || operation.status === 'failed') {
return operation
}
await new Promise((resolve) => setTimeout(resolve, 15000))
}
}
Статус меняется так: queued - в очереди, processing - ролик снимается, затем completed или failed. Ролик делается долго: двухсекундная сцена в 720p в пробном запуске была готова через 7 минут, восьмисекундная в 1080p - примерно через 11 минут. Одну операцию можно опрашивать не чаще раза в секунду, разумный интервал - 15-30 секунд.
После завершения в result приходит одно видео:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/vidu-q3-drama/video-1.mp4"
]
}
type - всегда "video".urls - массив с одной ссылкой на MP4 со звуком: реплики, шумы и музыка.duration: 2 файл длится около 2,9 секунды, при duration: 8 - около 9 секунд. Цена считается по duration, а не по длине файла.resolution и aspect_ratio: вертикальный 9:16 в 720p приходит размером 720x1280, горизонтальный 16:9 в 1080p - 1920x1080.Цена - 14 ₽ за секунду ролика: duration × 14 ₽. Качество, разрешение, пропорции, число ассетов и изображение для позиционирования на цену не влияют.
duration | Цена |
|---|---|
| 2 сек. | 28 ₽ |
| 5 сек. | 70 ₽ |
| 8 сек. | 112 ₽ |
| 12 сек. | 168 ₽ |
| 20 сек. | 280 ₽ |
| 30 сек. | 420 ₽ |
Самый дешёвый запуск - 2 секунды за 28 ₽. Запрос со значениями по умолчанию (8 секунд) стоит 112 ₽. Сумма списывается при создании операции и видна в поле cost.
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую платную операцию. Если ответ на создание потерялся, не отправляйте запрос вслепую ещё раз - сначала проверьте историю операций в личном кабинете.queued, результат забирайте через GET /api/v1/operations/{id}.image_uri внутри assets, - только внешние http/https URL на jpg, jpeg, png или webp. Адреса localhost и внутренних сетей не принимаются.id ассета - строка из двух цифр ("01"…"14"). Это самая частая ошибка интеграции: число 1 или строка "1" не проходят проверку.duration - целое число от 2 до 30. Значение вроде 7.5 вернёт 400 validation_error.style не ставьте знаки препинания: кино, реализм не пройдёт проверку, кинореализм или реалистично - пройдёт.failed с сообщением «Превышено время ожидания (60 мин). Нейросеть временно недоступна.», а деньги возвращаются на баланс.