Генерирует видео по текстовому описанию или оживляет картинку, превращая её в короткий ролик. Цена: 540p - 12 ₽/сек., 720p - 26 ₽/сек., 1080p - 26 ₽/сек.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Vidu Q3 делает короткие ролики длиной от 1 до 16 секунд: оживляет картинку, строит переход от первого кадра к конечному или снимает сцену целиком по текстовому описанию. Модель сама озвучивает сцену - шум улицы, шаги, плеск воды, реплики героев - и может добавить фоновую музыку. Подходит для превью, коротких рекламных сцен, оживления иллюстраций и фото.
Основные сценарии:
Каждый вызов создаёт асинхронную операцию. После запуска сохраните id и проверяйте статус отдельным запросом.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Сценарий выбирают два параметра:
generation_type - image (видео из изображения, по умолчанию) или text (видео из текста);use_end_image - только для image: false для ролика из одной картинки, true для ролика между первым и конечным кадром (тогда нужен last_image).{
"tool": "vidu-q3",
"input": {
"...": "..."
}
}
tool - slug нейросети, всегда "vidu-q3".input - параметры запуска. Все поля передаются прямо внутри этого объекта, без дополнительной вложенности.prompt и image, остальное подставится по умолчанию: 720p, 3 секунды, со звуком и фоновой музыкой.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
generation_type | enum | Да | Сценарий: image - видео из изображения, text - видео из текста. Если не указать - image. |
prompt | string | Да | Описание сцены: что происходит, как двигается камера, что звучит. От 3 до 5000 символов. |
image | string (url) | Да, при generation_type: "image" | Ссылка на картинку для первого кадра. Один файл: jpg, jpeg, png или webp. В режиме text не нужен и не учитывается. |
use_end_image | boolean | Нет | Только для generation_type: "image". true - ролик заканчивается картинкой из last_image. По умолчанию false. |
last_image | string (url) | Да, при use_end_image: true | Ссылка на картинку для последнего кадра. Один файл: jpg, jpeg, png или webp. Без use_end_image: true не учитывается. |
resolution | enum | Да | Качество видео: 540p, 720p или 1080p. Если не указать - 720p. |
duration | number | Да | Длительность ролика в секундах, целое число от 1 до 16. Если не указать - 3. |
movement_amplitude | enum | Да | Сила движения в кадре: auto - модель решает сама, small - едва заметное движение, medium - умеренное, large - активное. Если не указать - auto. |
generate_audio | boolean | Нет | Звук в ролике: окружение, эффекты, речь героев. По умолчанию ; - ролик без звуковой дорожки. На цену не влияет. |
Ссылки в image и last_image - только внешние http/https URL с расширением jpg, jpeg, png или webp.
Самый дешёвый вариант: 1 секунда в 540p без звука.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "vidu-q3",
"input": {
"generation_type": "image",
"prompt": "Идёт снег, женщина моргает и улыбается в камеру",
"image": "https://cdn.example.com/source-image-1.jpg",
"resolution": "540p",
"duration": 1,
"movement_amplitude": "small",
"generate_audio": false
}
}'
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',
input: {
generation_type: 'image',
prompt: 'Идёт снег, женщина моргает и улыбается в камеру',
image: 'https://cdn.example.com/source-image-1.jpg',
resolution: '540p',
duration: 1,
movement_amplitude: 'small',
generate_audio: false,
},
}),
})
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',
'input': {
'generation_type': 'image',
'prompt': 'Идёт снег, женщина моргает и улыбается в камеру',
'image': 'https://cdn.example.com/source-image-1.jpg',
'resolution': '540p',
'duration': 1,
'movement_amplitude': 'small',
'generate_audio': False,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Первая картинка - пекарь у печи, вторая - он же у стола с готовой выпечкой. Звук сцены остаётся, фоновая музыка выключена.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "vidu-q3",
"input": {
"generation_type": "image",
"prompt": "Пекарь достаёт противень с круассанами из печи и несёт его к столу, камера плавно следует за ним",
"image": "https://cdn.example.com/first-frame-1.jpg",
"use_end_image": true,
"last_image": "https://cdn.example.com/last-frame-1.jpg",
"resolution": "720p",
"duration": 5,
"movement_amplitude": "auto",
"generate_audio": true,
"bgm": false
}
}'
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',
input: {
generation_type: 'image',
prompt:
'Пекарь достаёт противень с круассанами из печи и несёт его к столу, камера плавно следует за ним',
image: 'https://cdn.example.com/first-frame-1.jpg',
use_end_image: true,
last_image: 'https://cdn.example.com/last-frame-1.jpg',
resolution: '720p',
duration: 5,
movement_amplitude: 'auto',
generate_audio: true,
bgm: false,
},
}),
})
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',
'input': {
'generation_type': 'image',
'prompt': 'Пекарь достаёт противень с круассанами из печи и несёт его к столу, камера плавно следует за ним',
'image': 'https://cdn.example.com/first-frame-1.jpg',
'use_end_image': True,
'last_image': 'https://cdn.example.com/last-frame-1.jpg',
'resolution': '720p',
'duration': 5,
'movement_amplitude': 'auto',
'generate_audio': True,
'bgm': False,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Картинки не нужны. Реплику героя лучше писать по-английски - так модель произносит её слово в слово.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "vidu-q3",
"input": {
"generation_type": "text",
"prompt": "Рассвет, над озером туман. Пожилой рыбак сидит на краю деревянного пирса, поворачивается к камере и спокойно говорит: \"They only bite here till seven.\" Тихо плещет вода, вдалеке кричат чайки",
"resolution": "720p",
"duration": 8,
"movement_amplitude": "auto",
"generate_audio": true,
"bgm": false
}
}'
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',
input: {
generation_type: 'text',
prompt:
'Рассвет, над озером туман. Пожилой рыбак сидит на краю деревянного пирса, поворачивается к камере и спокойно говорит: "They only bite here till seven." Тихо плещет вода, вдалеке кричат чайки',
resolution: '720p',
duration: 8,
movement_amplitude: 'auto',
generate_audio: true,
bgm: false,
},
}),
})
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',
'input': {
'generation_type': 'text',
'prompt': 'Рассвет, над озером туман. Пожилой рыбак сидит на краю деревянного пирса, поворачивается к камере и спокойно говорит: "They only bite here till seven." Тихо плещет вода, вдалеке кричат чайки',
'resolution': '720p',
'duration': 8,
'movement_amplitude': 'auto',
'generate_audio': True,
'bgm': False,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "vidu-q3",
"cost": 12,
"balance_after": 488,
"created_at": "2026-09-30T21:31:10.969263+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "vidu-q3",
"cost": 12,
"created_at": "2026-09-30T21:31:10.969263+00:00",
"completed_at": "2026-09-30T21:32:00.653593+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/vidu-q3/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))
}
}
Короткий ролик в 540p готов меньше чем за минуту, длинные ролики в 720p и 1080p - за несколько минут. Одну операцию можно опрашивать не чаще раза в секунду, разумный интервал - 10 секунд.
После завершения в result приходит одно видео:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/vidu-q3/video-1.mp4"
]
}
type - всегда "video".urls - массив с одной ссылкой на MP4.duration. Со generate_audio: true в файле есть звуковая дорожка, с false - только видео.image пропорции повторяют исходную картинку: кадр 16:9 в 540p даёт ролик 964×536, в 720p - 1284×716. В режиме text пропорции выбрать нельзя, модель отдаёт кадр около 4:3 (в 720p - 1104×816).Цена считается за секунду: ставка зависит от качества и умножается на duration. Сценарий, конечный кадр, амплитуда движения, звук и музыка на цену не влияют.
| Качество | За секунду | 1 сек. | 3 сек. | 5 сек. | 8 сек. | 16 сек. |
|---|---|---|---|---|---|---|
540p | 12 ₽ | 12 ₽ | 36 ₽ | 60 ₽ | 96 ₽ | 192 ₽ |
720p | 26 ₽ | 26 ₽ | 78 ₽ | 130 ₽ | 208 ₽ | 416 ₽ |
1080p | 26 ₽ | 26 ₽ | 78 ₽ | 130 ₽ | 208 ₽ | 416 ₽ |
720p и 1080p стоят одинаково, так что если нужен ролик выше 540p, выгоднее сразу брать 1080p. Самый дешёвый запуск - 1 секунда в 540p за 12 ₽. Запрос только с prompt и image использует значения по умолчанию (720p, 3 секунды) и стоит 78 ₽. Сумма списывается при создании операции и видна в поле cost. Если операция завершилась ошибкой, деньги возвращаются на баланс.
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую платную операцию. Если ответ на создание потерялся, не отправляйте запрос вслепую ещё раз.queued, результат забирайте через GET /api/v1/operations/{id}.image и last_image принимают только внешние http/https ссылки на jpg, jpeg, png или webp. Адреса localhost и внутренних сетей не принимаются, файл должен открываться без авторизации.duration - только целое число от 1 до 16. Дробное значение или число вне диапазона вернёт validation_error.last_image учитывается только при use_end_image: true. Для плавного перехода берите два кадра одной сцены с одинаковыми пропорциями.generate_audio: false - звука не будет совсем. Чтобы оставить звук сцены без музыки, передайте generate_audio: true и bgm: false.truefalsebgm | boolean | Нет | Фоновая музыка поверх звука сцены. Учитывается только при generate_audio: true, по умолчанию true. При generate_audio: false музыки тоже не будет. На цену не влияет. |