Оживляет фото в видео со звуком или собирает ролик по нескольким референсам героев, предметов и голосов. Цена зависит от разрешения: 540p — 8 ₽/сек., 720p — 16 ₽/сек., 1080p — 20 ₽/сек., 2K — 35 ₽/сек., 4K — 60 ₽/сек.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Vidu Q4 делает короткие ролики со звуком из ваших картинок. Если передать одну картинку, она станет первым кадром: модель оживит сцену, добавит движение камеры, реплики и звуки окружения. Если передать несколько картинок или голос, модель соберёт новую сцену по заданию и перенесёт в неё героев, предметы и места с референсов, а реплики озвучит голосами из аудиофайлов. Подходит для оживления фото, сюжетных роликов с постоянными персонажами, рекламы товара и коротких сцен для соцсетей.
Каждый вызов создаёт асинхронную операцию. После запуска сохраните id и проверяйте статус отдельным запросом.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Отдельного параметра режима нет - его определяет набор файлов:
reference_image_urls одна ссылка, reference_audio_urls не передан или пустой. Картинка становится первым кадром, пропорции видео повторяют её, звук есть всегда. aspect_ratio и audio в этом режиме не учитываются.reference_image_urls от 2 до 12 ссылок или передан хотя бы один голос в reference_audio_urls. Картинки не становятся первым кадром - это образцы героев, предметов и мест. Формат кадра задаёт aspect_ratio, звук включается и выключается audio.{
"tool": "vidu-q4",
"input": {
"...": "..."
}
}
tool - slug нейросети, всегда "vidu-q4".input - параметры запуска. Все поля передаются прямо внутри этого объекта, без дополнительной вложенности.prompt и reference_image_urls, остальное подставится по умолчанию: 720p, 5 секунд, 16:9 и со звуком для режима референсов.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
prompt | string | Да | Описание сцены: что происходит, кто что говорит, как движется камера, какой стиль. От 2 до 5000 символов. На картинки можно ссылаться метками @image1, @image2 и так далее по порядку в reference_image_urls, на голоса - @audio1, @audio2, @audio3. |
reference_image_urls | string[] (url) | Да | Массив ссылок на картинки jpg, jpeg, png или webp, от 1 до 12, каждая до 50 МБ. Одна ссылка - первый кадр, две и больше - референсы героев и предметов. |
reference_audio_urls | string[] (url) | Нет | Массив ссылок на голоса в mp3, до 3 файлов, каждый от 3 до 12 секунд и до 50 МБ. Даже один голос включает режим референсов. |
resolution | enum | Да | Разрешение видео: 540p, 720p, 1080p, 2K или 4K. Если не указать - 720p. От него зависит цена. |
duration | number | Да | Длительность ролика в секундах, целое число от 3 до 16. Если не указать - 5. |
aspect_ratio | enum | Да | Формат кадра в режиме референсов: 16:9, 9:16, 4:3, 3:4 или 1:1. Если не указать - 16:9. С одной картинкой без голосов не учитывается. |
audio | boolean | Нет | Звук в режиме референсов: реплики и звуки сцены. По умолчанию true, false - ролик без звука. С одной картинкой без голосов звук есть всегда. На цену не влияет. |
Ссылки на файлы - только внешние http/https URL с расширением из списка выше.
Одна картинка - первый кадр. Самый дешёвый вариант: 3 секунды в 540p.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "vidu-q4",
"input": {
"prompt": "Женщина в красном пальто поправляет шарф, улыбается в камеру и говорит: «Ну что, идём гулять?» Падает снег, вдалеке звенят колокольчики. Камера медленно приближается.",
"reference_image_urls": [
"https://cdn.example.com/first-frame-1.jpg"
],
"resolution": "540p",
"duration": 3
}
}'
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-q4',
input: {
prompt:
'Женщина в красном пальто поправляет шарф, улыбается в камеру и говорит: «Ну что, идём гулять?» Падает снег, вдалеке звенят колокольчики. Камера медленно приближается.',
reference_image_urls: ['https://cdn.example.com/first-frame-1.jpg'],
resolution: '540p',
duration: 3,
},
}),
})
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-q4',
'input': {
'prompt': 'Женщина в красном пальто поправляет шарф, улыбается в камеру и говорит: «Ну что, идём гулять?» Падает снег, вдалеке звенят колокольчики. Камера медленно приближается.',
'reference_image_urls': ['https://cdn.example.com/first-frame-1.jpg'],
'resolution': '540p',
'duration': 3,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Герой и предмет на отдельных картинках, вертикальный формат для сторис, 720p.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "vidu-q4",
"input": {
"prompt": "@image1 заходит в уютную мастерскую, ставит на стол @image2, включает его и улыбается, когда начинает играть музыка. Тёплый вечерний свет, камера плавно объезжает стол.",
"reference_image_urls": [
"https://cdn.example.com/hero-1.jpg",
"https://cdn.example.com/product-2.png"
],
"aspect_ratio": "9:16",
"resolution": "720p",
"duration": 5,
"audio": true
}
}'
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-q4',
input: {
prompt:
'@image1 заходит в уютную мастерскую, ставит на стол @image2, включает его и улыбается, когда начинает играть музыка. Тёплый вечерний свет, камера плавно объезжает стол.',
reference_image_urls: [
'https://cdn.example.com/hero-1.jpg',
'https://cdn.example.com/product-2.png',
],
aspect_ratio: '9:16',
resolution: '720p',
duration: 5,
audio: true,
},
}),
})
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-q4',
'input': {
'prompt': '@image1 заходит в уютную мастерскую, ставит на стол @image2, включает его и улыбается, когда начинает играть музыка. Тёплый вечерний свет, камера плавно объезжает стол.',
'reference_image_urls': [
'https://cdn.example.com/hero-1.jpg',
'https://cdn.example.com/product-2.png',
],
'aspect_ratio': '9:16',
'resolution': '720p',
'duration': 5,
'audio': True,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Две картинки и два голоса: каждый герой говорит своим голосом. Горизонтальный ролик в 1080p на 8 секунд.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "vidu-q4",
"input": {
"prompt": "@image1 и @image2 сидят за столиком в кафе. @image1 говорит голосом @audio1: «Ты опять заказала два десерта?» @image2 смеётся и отвечает голосом @audio2: «Один из них твой!» Камера медленно приближается.",
"reference_image_urls": [
"https://cdn.example.com/man-1.jpg",
"https://cdn.example.com/woman-2.jpg"
],
"reference_audio_urls": [
"https://cdn.example.com/voice-man-1.mp3",
"https://cdn.example.com/voice-woman-2.mp3"
],
"aspect_ratio": "16:9",
"resolution": "1080p",
"duration": 8
}
}'
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-q4',
input: {
prompt:
'@image1 и @image2 сидят за столиком в кафе. @image1 говорит голосом @audio1: «Ты опять заказала два десерта?» @image2 смеётся и отвечает голосом @audio2: «Один из них твой!» Камера медленно приближается.',
reference_image_urls: [
'https://cdn.example.com/man-1.jpg',
'https://cdn.example.com/woman-2.jpg',
],
reference_audio_urls: [
'https://cdn.example.com/voice-man-1.mp3',
'https://cdn.example.com/voice-woman-2.mp3',
],
aspect_ratio: '16:9',
resolution: '1080p',
duration: 8,
},
}),
})
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-q4',
'input': {
'prompt': '@image1 и @image2 сидят за столиком в кафе. @image1 говорит голосом @audio1: «Ты опять заказала два десерта?» @image2 смеётся и отвечает голосом @audio2: «Один из них твой!» Камера медленно приближается.',
'reference_image_urls': [
'https://cdn.example.com/man-1.jpg',
'https://cdn.example.com/woman-2.jpg',
],
'reference_audio_urls': [
'https://cdn.example.com/voice-man-1.mp3',
'https://cdn.example.com/voice-woman-2.mp3',
],
'aspect_ratio': '16:9',
'resolution': '1080p',
'duration': 8,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "vidu-q4",
"cost": 80,
"balance_after": 420,
"created_at": "2026-10-08T10:15:10.98208+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "vidu-q4",
"cost": 80,
"created_at": "2026-10-08T10:15:10.98208+00:00",
"completed_at": "2026-10-08T10:17:02.701396+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/vidu-q4/video-1.mp4"
]
},
"error_message": null
}
Сохраните 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, 10000))
}
}
Одну операцию можно опрашивать не чаще раза в секунду, разумный интервал - 10 секунд.
После завершения в result приходит одно видео:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/vidu-q4/video-1.mp4"
]
}
type - всегда "video".urls - массив с одной ссылкой на MP4.duration. С одной картинкой пропорции повторяют её, в режиме референсов формат кадра задаёт aspect_ratio. Звуковая дорожка есть всегда, кроме режима референсов с audio: false.Цена считается за секунду: ставка зависит от resolution и умножается на duration. Режим, число картинок и голосов, формат кадра и звук на цену не влияют.
| Разрешение | За секунду | 3 сек. | 5 сек. | 8 сек. | 10 сек. | 16 сек. |
|---|---|---|---|---|---|---|
540p | 8 ₽ | 24 ₽ | 40 ₽ | 64 ₽ | 80 ₽ | 128 ₽ |
720p | 16 ₽ | 48 ₽ | 80 ₽ | 128 ₽ | 160 ₽ | 256 ₽ |
1080p | 20 ₽ | 60 ₽ | 100 ₽ | 160 ₽ | 200 ₽ | 320 ₽ |
2K | 35 ₽ | 105 ₽ | 175 ₽ | 280 ₽ | 350 ₽ | 560 ₽ |
4K | 60 ₽ | 180 ₽ | 300 ₽ | 480 ₽ | 600 ₽ | 960 ₽ |
Самый дешёвый запуск - 3 секунды в 540p за 24 ₽. Запрос только с prompt и reference_image_urls использует значения по умолчанию (720p, 5 секунд) и стоит 80 ₽. Сумма списывается при создании операции и видна в поле cost. Если операция завершилась ошибкой, деньги возвращаются на баланс.
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую платную операцию. Если ответ на создание потерялся, не отправляйте запрос вслепую ещё раз.queued, результат забирайте через GET /api/v1/operations/{id}.http/https ссылкам: картинки jpg, jpeg, png, webp, голоса mp3. Адреса localhost и внутренних сетей не принимаются, файл должен открываться без авторизации.reference_image_urls - всегда массив, даже для одной картинки. Пустой массив или больше 12 ссылок вернут validation_error, больше 3 голосов - тоже.duration - только целое число от 3 до 16. Дробное значение или число вне диапазона вернёт validation_error.@image1, @audio1 нумеруются по порядку в массивах, с единицы. В задании называйте героя так же, как он выглядит на картинке («мужчина в синем свитере»), - так модели проще связать описание с референсом.