Общая документация Public API · API-ключ можно создать в настройках аккаунта
Vidu One-Click V2 MV собирает клип под музыку или голос: вы присылаете от одной до трёх фотографий и один аудиофайл, а модель оживляет кадры, добавляет движение камеры и монтирует ролик ровно под длину трека. Подходит для клипов к песням, поздравлений, промо к подкастам и коротких историй из нескольких фото.
Сценарий у нейросети один: фотографии плюс аудио. Задание в prompt можно не писать, оно только уточняет настроение и работу камеры.
Каждый вызов создаёт асинхронную операцию. После запуска сохраните id и проверяйте статус отдельным запросом.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Обязательны два поля: images (массив из 1-3 ссылок на фото) и audio (ссылка на трек). Остальное подставится по умолчанию.
{
"tool": "vidu-one-click-v2-mv",
"input": {
"...": "..."
}
}
tool - slug нейросети, всегда "vidu-one-click-v2-mv".input - параметры запуска. Все поля передаются прямо внутри этого объекта, без дополнительной вложенности.images и audio, тогда клип выйдет в 720p с пропорциями 16:9.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
images | string[] (url) | Да | Фотографии для клипа, от 1 до 3 ссылок. Форматы jpg, jpeg, png, webp, каждый файл до 50 МБ, не меньше 128x128 px, пропорции от 1:4 до 4:1. |
audio | string (url) | Да | Музыка или голос, одна ссылка. Форматы mp3, wav, m4a, aac, flac, ogg, opus, файл до 20 МБ. Длительность до 10 минут, на практике - от 10 секунд (см. ограничения). По ней считается цена и длина клипа. |
prompt | string | Нет | Пожелания к клипу: настроение, движение камеры, эмоции героев. До 2000 символов. Можно не передавать. |
aspect_ratio | enum | Да | Пропорции клипа: 16:9, 9:16, 1:1, 4:3, 3:4. Если не указать - 16:9. |
resolution | enum | Да | Качество: 540p, 720p или 1080p. Если не указать - 720p. Влияет на цену за секунду. |
add_subtitle | boolean | Нет | Добавить в клип субтитры. По умолчанию false. На цену не влияет. |
Ссылки передавайте как внешние 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-one-click-v2-mv",
"input": {
"images": [
"https://cdn.example.com/singer-portrait-1.jpg"
],
"audio": "https://cdn.example.com/song-chorus-1.mp3",
"prompt": "Девушка поёт в камеру, лёгкое покачивание, мягкий свет",
"aspect_ratio": "9:16",
"resolution": "720p",
"add_subtitle": 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-one-click-v2-mv',
input: {
images: ['https://cdn.example.com/singer-portrait-1.jpg'],
audio: 'https://cdn.example.com/song-chorus-1.mp3',
prompt: 'Девушка поёт в камеру, лёгкое покачивание, мягкий свет',
aspect_ratio: '9:16',
resolution: '720p',
add_subtitle: 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-one-click-v2-mv',
'input': {
'images': ['https://cdn.example.com/singer-portrait-1.jpg'],
'audio': 'https://cdn.example.com/song-chorus-1.mp3',
'prompt': 'Девушка поёт в камеру, лёгкое покачивание, мягкий свет',
'aspect_ratio': '9:16',
'resolution': '720p',
'add_subtitle': 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-one-click-v2-mv",
"input": {
"images": [
"https://cdn.example.com/city-street-1.jpg",
"https://cdn.example.com/coffee-shop-2.png",
"https://cdn.example.com/bus-stop-3.webp"
],
"audio": "https://cdn.example.com/track-1.wav",
"prompt": "Плавное движение камеры, тёплое осеннее настроение",
"aspect_ratio": "16:9",
"resolution": "540p",
"add_subtitle": 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-one-click-v2-mv',
input: {
images: [
'https://cdn.example.com/city-street-1.jpg',
'https://cdn.example.com/coffee-shop-2.png',
'https://cdn.example.com/bus-stop-3.webp',
],
audio: 'https://cdn.example.com/track-1.wav',
prompt: 'Плавное движение камеры, тёплое осеннее настроение',
aspect_ratio: '16:9',
resolution: '540p',
add_subtitle: 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-one-click-v2-mv',
'input': {
'images': [
'https://cdn.example.com/city-street-1.jpg',
'https://cdn.example.com/coffee-shop-2.png',
'https://cdn.example.com/bus-stop-3.webp',
],
'audio': 'https://cdn.example.com/track-1.wav',
'prompt': 'Плавное движение камеры, тёплое осеннее настроение',
'aspect_ratio': '16:9',
'resolution': '540p',
'add_subtitle': False,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "vidu-one-click-v2-mv",
"cost": 72,
"balance_after": 928,
"created_at": "2026-09-30T21:34:55.293391+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "vidu-one-click-v2-mv",
"cost": 72,
"created_at": "2026-09-30T21:34:55.293391+00:00",
"completed_at": "2026-09-30T21:38:00.430121+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/vidu-one-click-v2-mv/video-1.mp4"
]
},
"error_message": null
}
{
"id": "op_uuid-123",
"status": "failed",
"tool": "vidu-one-click-v2-mv",
"cost": 30,
"created_at": "2026-09-30T21:32:07.221888+00:00",
"completed_at": "2026-09-30T21:32:37.400726+00:00",
"result": null,
"error_message": "Пожалуйста, укажите корректную и доступную ссылку на изображение или изображение в формате base64."
}
Такую ошибку модель возвращает и на слишком короткое аудио (4 секунды): проверьте длину трека, прежде чем искать проблему в фото.
Сохраните 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))
}
}
Обычно клип готов за 2-3 минуты: ролик на 12 секунд из двух фото в пробном запуске пришёл через 3 минуты, двухминутная песня занимает около 5 минут. Одну операцию можно опрашивать не чаще раза в секунду, разумный интервал - 10 секунд.
После завершения в result приходит одно видео:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/vidu-one-click-v2-mv/video-1.mp4"
]
}
type - всегда "video".urls - массив с одной ссылкой на MP4.resolution и aspect_ratio: 540p в 9:16 - 528x960, 540p в 16:9 - 960x528, 720p в 16:9 - 1280x720.Цена считается за каждую секунду присланного аудио: ставка зависит от resolution и умножается на длительность трека, дробная часть округляется вверх до целой секунды. Число фото, пропорции, задание и субтитры на цену не влияют.
| Качество | За секунду | 10 сек. | 30 сек. | 1 мин. | 2 мин. | 3 мин. |
|---|---|---|---|---|---|---|
540p | 6 ₽ | 60 ₽ | 180 ₽ | 360 ₽ | 720 ₽ | 1080 ₽ |
720p | 8 ₽ | 80 ₽ | 240 ₽ | 480 ₽ | 960 ₽ | 1440 ₽ |
1080p | 10 ₽ | 100 ₽ | 300 ₽ | 600 ₽ | 1200 ₽ | 1800 ₽ |
Пример: трек длиной 12,0 секунды в 540p стоит 12 × 6 = 72 ₽, трек на 12,3 секунды - уже 13 × 6 = 78 ₽. Сервер сам измеряет длительность аудио по ссылке до создания операции, сумма списывается сразу и видна в поле cost. Аудио длиннее 10 минут не принимается: запрос получит 400 validation_error, деньги не спишутся. Если операция завершилась ошибкой (failed), деньги возвращаются на баланс.
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую платную операцию. Если ответ на создание потерялся, не отправляйте запрос вслепую ещё раз.queued, результат забирайте через GET /api/v1/operations/{id}.http/https URL: фото jpg, jpeg, png, webp, аудио mp3, wav, m4a, aac, flac, ogg, opus. Адреса localhost и внутренних сетей не принимаются. Если сервер не смог скачать аудио или определить его длительность, операция не создаётся и деньги не списываются.images - всегда массив, даже для одной фотографии. Больше трёх ссылок API не примет.mp3 или m4a, а не wav.540p, а полный клип делайте после того, как понравится результат.