Общая документация Public API · API-ключ можно создать в настройках аккаунта
Wan 2.7 Video - видеомодель с пятью режимами в одном инструменте: она оживляет картинку, снимает сцену по тексту, переносит персонажа из референс-видео в новую сцену, редактирует готовый ролик по инструкции и продлевает его. Умеет генерировать звук по описанию, работать с первым и последним кадром и делать вертикальные ролики для сторис. Разрешение 720p или 1080p, длительность до 15 секунд.
Через API доступны все режимы:
image_to_video - видео из изображения (первый кадр, по желанию последний кадр и своя аудиодорожка);text_to_video - видео из текста;reference_to_video - видео по референсам: персонаж и стиль берутся из 1-4 загруженных видео;video_edit - редактирование готового видео по инструкции;video_extend - продление готового видео.Каждый вызов создаёт асинхронную операцию: вы получаете id, а результат забираете отдельным запросом статуса.
POST /api/v1/operationsAuthorization: Bearer brth_...id и стартовый статус queued.Режим выбирается полем generation_type, и от него зависит, какие поля нужны:
image_to_video: image, prompt, image_text_duration; по желанию use_last_image + last_image, audio.text_to_video: prompt, aspect_ratio, image_text_duration; по желанию audio.reference_to_video: reference_videos, prompt, aspect_ratio, reference_duration; по желанию reference_image.video_edit: edit_video, prompt, edit_audio_setting; по желанию edit_images.video_extend: extend_video, prompt, extend_duration; по желанию extend_audio.Во всех режимах можно задать resolution и негативный промпт (use_negative_prompt + negative_prompt).
{
"tool": "wan-2-7-video",
"input": {
"...": "..."
}
}
tool - slug нейросети, здесь всегда "wan-2-7-video".input - параметры конкретного запуска.input, без дополнительного вложенного объекта input.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
generation_type | enum | Нет | Режим: image_to_video (по умолчанию), text_to_video, reference_to_video, video_edit, video_extend. |
prompt | string | Нет | Описание движения, сцены или правки, до 4000 символов. Что должно происходить, как движется камера, какой звук. Для video_edit - что изменить в ролике. |
resolution | enum | Нет | 720p (по умолчанию) или 1080p. Влияет на цену. |
use_negative_prompt | boolean | Нет | Включает негативный промпт. Без true поле negative_prompt игнорируется. |
negative_prompt | string | Нет | Чего не должно быть в кадре, до 4000 символов. |
image_to_video)| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
image | string (url) | Да | Первый кадр: внешний URL изображения, .jpg, .jpeg, .png, .webp. Формат кадра видео берётся из него. |
use_last_image | boolean | Нет | Включает конечный кадр. Без true поле last_image игнорируется. |
last_image | string (url) | Да, если use_last_image: true | Последний кадр: модель сделает плавный переход от image к нему. |
audio | string (url) | Нет | Своя аудиодорожка: .mp3, .wav, .m4a, .aac, .flac, .ogg, .opus. Без неё звук генерируется по описанию в prompt. |
image_text_duration | number | Нет | Длительность в секундах, от 2 до 15. По умолчанию 5. Влияет на цену. |
text_to_video)| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
aspect_ratio | enum | Нет | Формат кадра: 16:9 (по умолчанию), 9:16, 1:1, 4:3, 3:4. |
audio | string (url) | Нет | Своя аудиодорожка, форматы как выше. |
image_text_duration | number | Нет | Длительность в секундах, от 2 до 15. По умолчанию 5. |
reference_to_video)| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
reference_videos | string[] (url) | Да | От 1 до 4 внешних URL видео: .mp4, .mov, .webm. Модель берёт из них персонажа, стиль и манеру движения. |
reference_image | string (url) | Нет | Дополнительный референс-изображение, например внешний вид персонажа или локация. |
aspect_ratio | enum | Нет | Формат кадра: 16:9 (по умолчанию), 9:16, 1:1, 4:3, 3:4. |
reference_duration | number | Нет | Длительность в секундах, от 2 до 10. По умолчанию 5. |
video_edit)| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
edit_video | string (url) | Да | Исходное видео не длиннее 10 секунд: .mp4, .mov, .webm. Длительность результата равна длительности исходника. |
edit_images | string[] (url) | Нет | До 3 референс-изображений: например, новый наряд или предмет, который нужно добавить. |
edit_audio_setting | enum | Нет | auto (по умолчанию) - модель сама решает, генерировать ли новую дорожку по заданию; origin - сохранить звук исходного видео. |
video_extend)| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
extend_video | string (url) | Да | Видео, которое нужно продолжить: .mp4, .mov, .webm. |
extend_audio | string (url) | Нет | Своя аудиодорожка для продолжения. |
extend_duration | number | Нет | На сколько секунд продлить, от 5 до 15. По умолчанию 5. |
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "wan-2-7-video",
"input": {
"generation_type": "image_to_video",
"prompt": "Плавный переход от первого кадра ко второму, камера облетает вокруг, частицы света. Звук: лёгкий волшебный звон",
"image": "https://cdn.example.com/source-image-1.jpg",
"use_last_image": true,
"last_image": "https://cdn.example.com/source-image-2.jpg",
"resolution": "720p",
"image_text_duration": 5
}
}'
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-2-7-video',
input: {
generation_type: 'image_to_video',
prompt:
'Плавный переход от первого кадра ко второму, камера облетает вокруг, частицы света. Звук: лёгкий волшебный звон',
image: 'https://cdn.example.com/source-image-1.jpg',
use_last_image: true,
last_image: 'https://cdn.example.com/source-image-2.jpg',
resolution: '720p',
image_text_duration: 5,
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-2-7-video',
'input': {
'generation_type': 'image_to_video',
'prompt': 'Плавный переход от первого кадра ко второму, камера облетает вокруг, частицы света. Звук: лёгкий волшебный звон',
'image': 'https://cdn.example.com/source-image-1.jpg',
'use_last_image': True,
'last_image': 'https://cdn.example.com/source-image-2.jpg',
'resolution': '720p',
'image_text_duration': 5,
},
},
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": "wan-2-7-video",
"input": {
"generation_type": "text_to_video",
"prompt": "Бариста в кофейне готовит латте: наливает молоко, рисует сердце на пенке, ставит чашку на стойку. Тёплый свет. Звук: шипение пара, звон посуды",
"aspect_ratio": "9:16",
"resolution": "720p",
"image_text_duration": 4
}
}'
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-2-7-video',
input: {
generation_type: 'text_to_video',
prompt:
'Бариста в кофейне готовит латте: наливает молоко, рисует сердце на пенке, ставит чашку на стойку. Тёплый свет. Звук: шипение пара, звон посуды',
aspect_ratio: '9:16',
resolution: '720p',
image_text_duration: 4,
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-2-7-video',
'input': {
'generation_type': 'text_to_video',
'prompt': 'Бариста в кофейне готовит латте: наливает молоко, рисует сердце на пенке, ставит чашку на стойку. Тёплый свет. Звук: шипение пара, звон посуды',
'aspect_ratio': '9:16',
'resolution': '720p',
'image_text_duration': 4,
},
},
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": "wan-2-7-video",
"input": {
"generation_type": "reference_to_video",
"prompt": "Кот-повар из референс-видео готовит пиццу: раскатывает тесто и посыпает сыром, тот же персонаж и стиль. Звук: кухня, тихая музыка",
"reference_videos": [
"https://cdn.example.com/source-video-1.mp4",
"https://cdn.example.com/source-video-2.mp4"
],
"reference_image": "https://cdn.example.com/source-image-1.jpg",
"aspect_ratio": "9:16",
"resolution": "720p",
"reference_duration": 4
}
}'
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-2-7-video',
input: {
generation_type: 'reference_to_video',
prompt:
'Кот-повар из референс-видео готовит пиццу: раскатывает тесто и посыпает сыром, тот же персонаж и стиль. Звук: кухня, тихая музыка',
reference_videos: [
'https://cdn.example.com/source-video-1.mp4',
'https://cdn.example.com/source-video-2.mp4',
],
reference_image: 'https://cdn.example.com/source-image-1.jpg',
aspect_ratio: '9:16',
resolution: '720p',
reference_duration: 4,
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-2-7-video',
'input': {
'generation_type': 'reference_to_video',
'prompt': 'Кот-повар из референс-видео готовит пиццу: раскатывает тесто и посыпает сыром, тот же персонаж и стиль. Звук: кухня, тихая музыка',
'reference_videos': [
'https://cdn.example.com/source-video-1.mp4',
'https://cdn.example.com/source-video-2.mp4',
],
'reference_image': 'https://cdn.example.com/source-image-1.jpg',
'aspect_ratio': '9:16',
'resolution': '720p',
'reference_duration': 4,
},
},
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": "wan-2-7-video",
"input": {
"generation_type": "video_edit",
"prompt": "Замени дождь на густой снегопад, добавь снег на асфальте и тёплые гирлянды на фасадах, движение и героиню сохрани",
"edit_video": "https://cdn.example.com/source-video-1.mp4",
"edit_images": [
"https://cdn.example.com/source-image-1.jpg",
"https://cdn.example.com/source-image-2.jpg"
],
"edit_audio_setting": "auto",
"resolution": "720p"
}
}'
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-2-7-video',
input: {
generation_type: 'video_edit',
prompt:
'Замени дождь на густой снегопад, добавь снег на асфальте и тёплые гирлянды на фасадах, движение и героиню сохрани',
edit_video: 'https://cdn.example.com/source-video-1.mp4',
edit_images: [
'https://cdn.example.com/source-image-1.jpg',
'https://cdn.example.com/source-image-2.jpg',
],
edit_audio_setting: 'auto',
resolution: '720p',
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-2-7-video',
'input': {
'generation_type': 'video_edit',
'prompt': 'Замени дождь на густой снегопад, добавь снег на асфальте и тёплые гирлянды на фасадах, движение и героиню сохрани',
'edit_video': 'https://cdn.example.com/source-video-1.mp4',
'edit_images': [
'https://cdn.example.com/source-image-1.jpg',
'https://cdn.example.com/source-image-2.jpg',
],
'edit_audio_setting': 'auto',
'resolution': '720p',
},
},
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": "wan-2-7-video",
"input": {
"generation_type": "video_extend",
"prompt": "Кот-повар достаёт готовую пиццу из печи, ставит на стол и довольно кивает, тот же стиль и кухня",
"extend_video": "https://cdn.example.com/source-video-1.mp4",
"resolution": "720p",
"extend_duration": 5
}
}'
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-2-7-video',
input: {
generation_type: 'video_extend',
prompt:
'Кот-повар достаёт готовую пиццу из печи, ставит на стол и довольно кивает, тот же стиль и кухня',
extend_video: 'https://cdn.example.com/source-video-1.mp4',
resolution: '720p',
extend_duration: 5,
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-2-7-video',
'input': {
'generation_type': 'video_extend',
'prompt': 'Кот-повар достаёт готовую пиццу из печи, ставит на стол и довольно кивает, тот же стиль и кухня',
'extend_video': 'https://cdn.example.com/source-video-1.mp4',
'resolution': '720p',
'extend_duration': 5,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "wan-2-7-video",
"cost": 90,
"balance_after": 495,
"created_at": "2026-09-17T12:00:00Z"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "wan-2-7-video",
"cost": 90,
"created_at": "2026-09-17T12:00:00Z",
"completed_at": "2026-09-17T12:03:40Z",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/wan-2-7-video/result.mp4"
]
},
"error_message": null
}
{
"id": "op_uuid-123",
"status": "failed",
"tool": "wan-2-7-video",
"cost": 90,
"created_at": "2026-09-17T12:00:00Z",
"completed_at": "2026-09-17T12:00:30Z",
"result": null,
"error_message": "Произошла ошибка, сервис временно недоступен. Попробуйте повторить запрос позже."
}
После создания операции сохраните id и проверяйте её статус запросом:
GET /api/v1/operations/{id}
curl -H "Authorization: Bearer brth_ваш_ключ" \
https://bratuha.ru/api/v1/operations/op_uuid-123
const response = await fetch(
'https://bratuha.ru/api/v1/operations/op_uuid-123',
{
headers: {
Authorization: 'Bearer brth_ваш_ключ',
},
}
)
const data = await response.json()
Пока ролик создаётся, status будет queued или processing. Генерация занимает несколько минут, опрашивайте статус раз в 10-15 секунд.
После успешного завершения result содержит одно видео со звуком:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/wan-2-7-video/result.mp4"
]
}
type всегда равен "video".urls содержит одну ссылку на MP4.Цена считается за каждую секунду результата: 18 ₽/сек в 720p и 26 ₽/сек в 1080p, одинаково для всех режимов.
image_text_duration для видео из изображения и текста, reference_duration для референсов, extend_duration для продления. Например, 5 секунд в 720p - 90 ₽, 4 секунды в 1080p - 104 ₽.video_edit длительность равна длительности исходного видео (не больше 10 секунд): ролик на 8 секунд в 720p стоит 144 ₽.cost ответа. Если операция завершилась с ошибкой, деньги возвращаются на баланс автоматически.POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую операцию и списывает деньги.queued проверяйте статус по id.http/https ссылки, без localhost и приватных адресов. Изображения: .jpg, .jpeg, .png, .webp; видео: .mp4, .mov, .webm; аудио: .mp3, .wav, .m4a, .aac, .flac, .ogg, .opus. HEIC/HEIF принимаются только при загрузке через форму сайта, по URL в API - нет.video_edit должно быть не длиннее 10 секунд, иначе запрос получит validation_error.use_last_image и use_negative_prompt - выключатели: без true соответствующие данные не отправляются модели.prompt отдельным предложением: «Звук: шум прибоя, крики чаек». Если передать свою дорожку в audio, модель подстроит движение под неё.reference_to_video лучше давать короткие ролики с одним персонажем крупным планом и явно писать в prompt, что нужно сохранить: внешность, одежду, стиль.text_to_video и reference_to_video с aspect_ratio: "9:16"; в image_to_video формат задаёт само изображение.