Создаёт видео по тексту, референсам, кадрам, документу или содержимому публичной страницы. Цена зависит от разрешения: 480P - 5 ₽/сек., 720P - 10 ₽/сек., 1080P - 20 ₽/сек.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Wan 3.0 Video делает видео со звуком из самых разных исходников: из текстового описания, из одной или двух картинок, из набора референсов (картинки, видеоклипы, аудио), из документа или из публичной веб-страницы. Длина ролика - от 2 до 30 секунд, разрешение до 1080P. Модель подходит для рекламных роликов с вашим персонажем или товаром, правок готового видео по референсам, коротких объясняющих видео по инструкции или статье.
Каждый вызов создаёт асинхронную операцию. После запуска сохраните id и проверяйте статус отдельным запросом.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Сценарий задаёт параметр wan_3_0_generation_type. У каждого сценария своё поле для задания и свои файлы:
wan_3_0_generation_type | Что делает | Задание | Файлы и ссылки |
|---|---|---|---|
references | Видео по референсам | reference_prompt (обязательно) | reference_image_urls, video_urls, audio_urls - хотя бы один файл |
text | Видео из текста | text_prompt (обязательно) | - |
first_frame | Видео от первого кадра | frame_prompt (обязательно) | first_frame_url |
frames | Видео между первым и конечным кадром | frame_prompt (обязательно) | first_frame_url, last_frame_url |
file | Видео по документу | file_prompt (необязательно) | file_url |
link | Видео по публичной странице | link_prompt (необязательно) | link_url |
Если wan_3_0_generation_type не передать, используется references. Поля чужих сценариев в запросе не учитываются.
{
"tool": "wan-3-0",
"input": {
"...": "..."
}
}
tool - slug нейросети, всегда "wan-3-0".input - параметры запуска. Все поля передаются прямо внутри этого объекта, без дополнительной вложенности.resolution, duration, size, audio. Остальные зависят от сценария, см. таблицу выше.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
wan_3_0_generation_type | enum | Да | Сценарий: references - по референсам, text - из текста, first_frame - от первого кадра, frames - между первым и конечным кадром, file - по документу, link - по публичной странице. |
reference_prompt | string | Да, для references | Задание для сценария references: как использовать референсы в ролике. На материалы можно ссылаться по номеру: «изображение 1», «видео 1», «аудио 1». От 2 до 20 000 символов. |
text_prompt | string | Да, для text | Задание для сценария text: сцена, действие, стиль, движение камеры, атмосфера. От 2 до 20 000 символов. |
frame_prompt | string | Да, для first_frame и frames | Задание для сценариев с кадрами: что происходит в ролике, как двигается камера, как сцена меняется между кадрами. От 2 до 20 000 символов. |
file_prompt | string | Нет | Задание для сценария file. Можно не передавать, тогда видео построится по содержимому документа. До 20 000 символов. |
link_prompt | string | Нет | Задание для сценария link: как использовать содержимое страницы. До 20 000 символов. |
reference_image_urls | string[] (url) | Нет | Только для references. Массив ссылок на изображения, до 10 штук: jpg, jpeg, png (без прозрачности), bmp, webp. Каждое до 20 МБ, стороны от 240 до 8000 px. |
video_urls | string[] (url) | Нет | Только для references. Массив ссылок на видео, до 5 штук: mp4, mov. Каждый клип от 1 до 15 секунд и до 100 МБ, суммарно не больше 15 секунд. |
Все ссылки на файлы - только внешние http/https URL с расширениями из таблицы.
В сценарии references нужен хотя бы один референс: изображение, видео или аудио. Без них API вернёт validation_error.
Персонаж и предмет с двух картинок в одной сцене. В задании на картинки можно ссылаться по номеру: «изображение 1», «изображение 2».
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "wan-3-0",
"input": {
"wan_3_0_generation_type": "references",
"reference_prompt": "Девушка с изображения 1 едет на велосипеде по осенней улице, в корзине у руля лежит букет с изображения 2. Камера движется рядом, мягкий вечерний свет",
"reference_image_urls": [
"https://cdn.example.com/character-1.jpg",
"https://cdn.example.com/bouquet-1.png"
],
"resolution": "480P",
"duration": 5,
"size": "16:9",
"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: 'wan-3-0',
input: {
wan_3_0_generation_type: 'references',
reference_prompt: 'Девушка с изображения 1 едет на велосипеде по осенней улице, в корзине у руля лежит букет с изображения 2. Камера движется рядом, мягкий вечерний свет',
reference_image_urls: [
'https://cdn.example.com/character-1.jpg',
'https://cdn.example.com/bouquet-1.png',
],
resolution: '480P',
duration: 5,
size: '16:9',
audio: true,
},
}),
})
const data = await response.json()
console.log(data.id, data.status, data.cost)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-3-0',
'input': {
'wan_3_0_generation_type': 'references',
'reference_prompt': 'Девушка с изображения 1 едет на велосипеде по осенней улице, в корзине у руля лежит букет с изображения 2. Камера движется рядом, мягкий вечерний свет',
'reference_image_urls': [
'https://cdn.example.com/character-1.jpg',
'https://cdn.example.com/bouquet-1.png',
],
'resolution': '480P',
'duration': 5,
'size': '16:9',
'audio': True,
},
},
timeout=60,
)
print(response.status_code)
print(response.json())
Референсы можно смешивать: взять движение из видео, голос или музыку из аудио и внешность из картинки. Суммарно до 15 секунд видео и до 15 секунд аудио.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "wan-3-0",
"input": {
"wan_3_0_generation_type": "references",
"reference_prompt": "Сохрани видео 1 без изменений, замени только вывеску на стене за мастером на логотип с изображения 1. Звук возьми из аудио 1",
"reference_image_urls": [
"https://cdn.example.com/logo-1.png",
"https://cdn.example.com/logo-2.png"
],
"video_urls": [
"https://cdn.example.com/source-video-1.mp4",
"https://cdn.example.com/source-video-2.mov"
],
"audio_urls": [
"https://cdn.example.com/voice-1.mp3",
"https://cdn.example.com/music-1.wav"
],
"resolution": "720P",
"duration": 10,
"size": "adaptive",
"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: 'wan-3-0',
input: {
wan_3_0_generation_type: 'references',
reference_prompt: 'Сохрани видео 1 без изменений, замени только вывеску на стене за мастером на логотип с изображения 1. Звук возьми из аудио 1',
reference_image_urls: [
'https://cdn.example.com/logo-1.png',
'https://cdn.example.com/logo-2.png',
],
video_urls: [
'https://cdn.example.com/source-video-1.mp4',
'https://cdn.example.com/source-video-2.mov',
],
audio_urls: [
'https://cdn.example.com/voice-1.mp3',
'https://cdn.example.com/music-1.wav',
],
resolution: '720P',
duration: 10,
size: 'adaptive',
audio: true,
},
}),
})
const data = await response.json()
console.log(data.id, data.status, data.cost)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-3-0',
'input': {
'wan_3_0_generation_type': 'references',
'reference_prompt': 'Сохрани видео 1 без изменений, замени только вывеску на стене за мастером на логотип с изображения 1. Звук возьми из аудио 1',
'reference_image_urls': [
'https://cdn.example.com/logo-1.png',
'https://cdn.example.com/logo-2.png',
],
'video_urls': [
'https://cdn.example.com/source-video-1.mp4',
'https://cdn.example.com/source-video-2.mov',
],
'audio_urls': [
'https://cdn.example.com/voice-1.mp3',
'https://cdn.example.com/music-1.wav',
],
'resolution': '720P',
'duration': 10,
'size': 'adaptive',
'audio': True,
},
},
timeout=60,
)
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": "wan-3-0",
"input": {
"wan_3_0_generation_type": "text",
"text_prompt": "Утренняя пекарня, пекарь достаёт из печи противень с круассанами, от выпечки поднимается пар. Камера медленно отъезжает, тёплый свет из окна",
"resolution": "720P",
"duration": 5,
"size": "9:16",
"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: 'wan-3-0',
input: {
wan_3_0_generation_type: 'text',
text_prompt: 'Утренняя пекарня, пекарь достаёт из печи противень с круассанами, от выпечки поднимается пар. Камера медленно отъезжает, тёплый свет из окна',
resolution: '720P',
duration: 5,
size: '9:16',
audio: true,
},
}),
})
const data = await response.json()
console.log(data.id, data.status, data.cost)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-3-0',
'input': {
'wan_3_0_generation_type': 'text',
'text_prompt': 'Утренняя пекарня, пекарь достаёт из печи противень с круассанами, от выпечки поднимается пар. Камера медленно отъезжает, тёплый свет из окна',
'resolution': '720P',
'duration': 5,
'size': '9:16',
'audio': True,
},
},
timeout=60,
)
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": "wan-3-0",
"input": {
"wan_3_0_generation_type": "first_frame",
"frame_prompt": "Девушка опускает письмо в синий почтовый ящик и улыбается, осенние листья медленно падают, камера плавно приближается",
"first_frame_url": "https://cdn.example.com/first-frame-1.jpg",
"resolution": "480P",
"duration": 5,
"size": "adaptive",
"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: 'wan-3-0',
input: {
wan_3_0_generation_type: 'first_frame',
frame_prompt: 'Девушка опускает письмо в синий почтовый ящик и улыбается, осенние листья медленно падают, камера плавно приближается',
first_frame_url: 'https://cdn.example.com/first-frame-1.jpg',
resolution: '480P',
duration: 5,
size: 'adaptive',
audio: true,
},
}),
})
const data = await response.json()
console.log(data.id, data.status, data.cost)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-3-0',
'input': {
'wan_3_0_generation_type': 'first_frame',
'frame_prompt': 'Девушка опускает письмо в синий почтовый ящик и улыбается, осенние листья медленно падают, камера плавно приближается',
'first_frame_url': 'https://cdn.example.com/first-frame-1.jpg',
'resolution': '480P',
'duration': 5,
'size': 'adaptive',
'audio': True,
},
},
timeout=60,
)
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": "wan-3-0",
"input": {
"wan_3_0_generation_type": "frames",
"frame_prompt": "Утро сменяется вечером: солнце садится, в окнах домов загорается свет, камера неподвижна",
"first_frame_url": "https://cdn.example.com/first-frame-1.jpg",
"last_frame_url": "https://cdn.example.com/last-frame-1.webp",
"resolution": "1080P",
"duration": 6,
"size": "adaptive",
"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: 'wan-3-0',
input: {
wan_3_0_generation_type: 'frames',
frame_prompt: 'Утро сменяется вечером: солнце садится, в окнах домов загорается свет, камера неподвижна',
first_frame_url: 'https://cdn.example.com/first-frame-1.jpg',
last_frame_url: 'https://cdn.example.com/last-frame-1.webp',
resolution: '1080P',
duration: 6,
size: 'adaptive',
audio: false,
},
}),
})
const data = await response.json()
console.log(data.id, data.status, data.cost)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-3-0',
'input': {
'wan_3_0_generation_type': 'frames',
'frame_prompt': 'Утро сменяется вечером: солнце садится, в окнах домов загорается свет, камера неподвижна',
'first_frame_url': 'https://cdn.example.com/first-frame-1.jpg',
'last_frame_url': 'https://cdn.example.com/last-frame-1.webp',
'resolution': '1080P',
'duration': 6,
'size': 'adaptive',
'audio': False,
},
},
timeout=60,
)
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": "wan-3-0",
"input": {
"wan_3_0_generation_type": "file",
"file_prompt": "Сделай короткое обучающее видео по главным пунктам инструкции",
"file_url": "https://cdn.example.com/instruction-1.pdf",
"resolution": "720P",
"duration": 15,
"size": "16:9",
"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: 'wan-3-0',
input: {
wan_3_0_generation_type: 'file',
file_prompt: 'Сделай короткое обучающее видео по главным пунктам инструкции',
file_url: 'https://cdn.example.com/instruction-1.pdf',
resolution: '720P',
duration: 15,
size: '16:9',
audio: true,
},
}),
})
const data = await response.json()
console.log(data.id, data.status, data.cost)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-3-0',
'input': {
'wan_3_0_generation_type': 'file',
'file_prompt': 'Сделай короткое обучающее видео по главным пунктам инструкции',
'file_url': 'https://cdn.example.com/instruction-1.pdf',
'resolution': '720P',
'duration': 15,
'size': '16:9',
'audio': True,
},
},
timeout=60,
)
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": "wan-3-0",
"input": {
"wan_3_0_generation_type": "link",
"link_prompt": "Сделай короткий ролик-анонс по этой статье",
"link_url": "https://example.com/blog/article-1",
"resolution": "480P",
"duration": 10,
"size": "9:16",
"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: 'wan-3-0',
input: {
wan_3_0_generation_type: 'link',
link_prompt: 'Сделай короткий ролик-анонс по этой статье',
link_url: 'https://example.com/blog/article-1',
resolution: '480P',
duration: 10,
size: '9:16',
audio: true,
},
}),
})
const data = await response.json()
console.log(data.id, data.status, data.cost)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-3-0',
'input': {
'wan_3_0_generation_type': 'link',
'link_prompt': 'Сделай короткий ролик-анонс по этой статье',
'link_url': 'https://example.com/blog/article-1',
'resolution': '480P',
'duration': 10,
'size': '9:16',
'audio': True,
},
},
timeout=60,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "wan-3-0",
"cost": 25,
"balance_after": 475,
"created_at": "2026-09-30T12:46:04.43779+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "wan-3-0",
"cost": 25,
"created_at": "2026-09-30T12:46:04.43779+00:00",
"completed_at": "2026-09-30T12:50:39.201269+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/wan-3-0/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, 15000))
}
}
Ролик обычно готов за 3-6 минут, длинные видео в высоком разрешении могут занимать больше. Одну операцию можно опрашивать не чаще раза в секунду, разумный интервал - 15 секунд.
После завершения в result приходит одно видео:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/wan-3-0/video-1.mp4"
]
}
type - всегда "video".urls - массив с одной ссылкой на MP4.duration. При audio: true в видео есть звуковая дорожка. Например, 480P с size: "adaptive" по горизонтальной картинке даёт кадр 854x480.Цена считается за секунду ролика и зависит только от разрешения. Сценарий, количество референсов, size и audio на цену не влияют.
| Разрешение | За секунду | 2 сек. | 5 сек. | 10 сек. | 15 сек. | 30 сек. |
|---|---|---|---|---|---|---|
480P | 5 ₽ | 10 ₽ | 25 ₽ | 50 ₽ | 75 ₽ | 150 ₽ |
720P | 10 ₽ | 20 ₽ | 50 ₽ | 100 ₽ | 150 ₽ | 300 ₽ |
1080P | 20 ₽ | 40 ₽ | 100 ₽ | 200 ₽ | 300 ₽ | 600 ₽ |
Итог = ставка за секунду × duration. Самый дешёвый запуск - 2 секунды в 480P за 10 ₽, запрос с настройками по умолчанию (480P, 5 секунд) стоит 25 ₽. Сумма списывается при создании операции и видна в поле cost.
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую платную операцию. Если ответ на создание потерялся, не отправляйте запрос вслепую ещё раз.queued, результат забирайте через GET /api/v1/operations/{id}.link_url - только внешние http/https ссылки. Адреса localhost и внутренних сетей не принимаются, файлы должны открываться без авторизации.references сервер скачивает видео и аудио, чтобы проверить их длину. Если суммарно видео или аудио длиннее 15 секунд, запрос вернёт validation_error, операция не создаётся и деньги не списываются.reference_prompt, что должно остаться без изменений, и какое изображение за что отвечает.link страница должна открываться без входа и без капчи, иначе нейросеть не сможет прочитать её содержимое.audio_urls | string[] (url) | Нет | Только для references. Массив ссылок на аудио, до 5 штук: wav, mp3. Каждый клип от 1 до 15 секунд и до 15 МБ, суммарно не больше 15 секунд. |
first_frame_url | string (url) | Да, для first_frame и frames | Ссылка на изображение первого кадра: jpg, jpeg, png (без прозрачности), bmp, webp. До 20 МБ, стороны от 240 до 8000 px. |
last_frame_url | string (url) | Да, для frames | Ссылка на изображение конечного кадра. Требования те же, что у first_frame_url. |
file_url | string (url) | Да, для file | Ссылка на документ: pdf, txt, md, doc, docx, xls, xlsx, ppt, pptx, key, pages, numbers. До 100 МБ и до 50 страниц. |
link_url | string (url) | Да, для link | Адрес публичной страницы, начинается с http:// или https://. Страница должна открываться без входа в аккаунт. |
resolution | enum | Да | Разрешение: 480P, 720P или 1080P. Если не указать - 480P. От него зависит цена за секунду. |
duration | number | Да | Длительность ролика в секундах, целое число от 2 до 30. Если не указать - 5. |
size | enum | Да | Соотношение сторон: adaptive - подстроиться под входные материалы, либо фиксированное 16:9, 4:3, 1:1, 3:4, 9:16. Если не указать - adaptive. Для сценария text лучше задавать фиксированное соотношение. |
audio | boolean | Нет | Добавить звуковую дорожку в результат. По умолчанию true. На цену не влияет. |