Преобразует ваше видео, сохраняя общий сюжет и добавляя управляемые изменения по текстовому заданию, control-кодам и референс-кадру. Стоимость - от 10 до 16 рублей за секунду в зависимости от выбранного качества.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Wan 2.2 Fun Control оживляет картинку по движению из видео. Вы даёте референсный кадр - персонажа, сцену, стиль - и ролик с нужным движением. Нейросеть берёт из видео позы, жесты и движение камеры, а внешность, одежду, фон и манеру рисовки - с картинки. Получается новое видео: например, нарисованная героиня повторяет танец, снятый на телефон.
Где это используют:
Текстовое задание необязательно, но помогает уточнить, что должно получиться: кто в кадре, какой фон и свет. Вызов создаёт асинхронную операцию: сразу приходит id, готовое видео забирается проверкой статуса. Пятисекундный ролик в 480p обрабатывается около полутора минут.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Режим у нейросети один: референсная картинка плюс видео с движением. Вызовы отличаются заданием и разрешением результата (480p или 720p).
{
"tool": "wan-2-2-fun-control",
"input": {
"prompt": "Девушка с референсного кадра повторяет танец из видео",
"image": "https://cdn.example.com/reference-frame-1.jpg",
"video": "https://cdn.example.com/motion-video-1.mp4",
"resolution": "480p"
}
}
tool - slug нейросети, всегда "wan-2-2-fun-control".input - параметры запуска. Поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
prompt | string | Нет | Описание результата: кто в кадре, что делает, какой фон и свет. Например: «девушка с кадра танцует в пустой студии, мягкий дневной свет». До 2000 символов. Можно не передавать. |
image | string (url) | Да | Ссылка на референсный кадр - от него берутся внешность, одежда, фон и стиль. Один файл .jpg, .jpeg, .png или .webp, до 10 МБ. |
video | string (url) | Да | Ссылка на видео, откуда берётся движение. Один файл .mp4, .mov или .webm, длительность от 1 до 120 секунд, размер до 128 МБ. |
resolution | enum | Да | Разрешение результата: 480p - дешевле, подходит для проверки; 720p - чётче и дороже. Если поле не передать, будет 480p. |
Ссылки в image и video - только внешние http/https URL с указанными расширениями. Файл должен открываться без авторизации.
Героиня с картинки повторяет танец из видео. За ролик на 5 секунд спишется 50 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "wan-2-2-fun-control",
"input": {
"prompt": "Девушка с референсного кадра повторяет танец из видео, фон и свет как на кадре",
"image": "https://cdn.example.com/reference-frame-1.jpg",
"video": "https://cdn.example.com/motion-video-1.mp4",
"resolution": "480p"
}
}'
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-2-fun-control',
input: {
prompt: 'Девушка с референсного кадра повторяет танец из видео, фон и свет как на кадре',
image: 'https://cdn.example.com/reference-frame-1.jpg',
video: 'https://cdn.example.com/motion-video-1.mp4',
resolution: '480p',
},
}),
})
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-2-fun-control',
'input': {
'prompt': 'Девушка с референсного кадра повторяет танец из видео, фон и свет как на кадре',
'image': 'https://cdn.example.com/reference-frame-1.jpg',
'video': 'https://cdn.example.com/motion-video-1.mp4',
'resolution': '480p',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Только картинка и движение: нейросеть сама переносит движение на персонажа с кадра. За ролик на 5 секунд спишется 80 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "wan-2-2-fun-control",
"input": {
"image": "https://cdn.example.com/reference-frame-2.png",
"video": "https://cdn.example.com/motion-video-2.webm",
"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-2-fun-control',
input: {
image: 'https://cdn.example.com/reference-frame-2.png',
video: 'https://cdn.example.com/motion-video-2.webm',
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-2-fun-control',
'input': {
'image': 'https://cdn.example.com/reference-frame-2.png',
'video': 'https://cdn.example.com/motion-video-2.webm',
'resolution': '720p',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Для ролика длиной 5 секунд в 480p:
{
"id": "op_uuid-123",
"status": "queued",
"tool": "wan-2-2-fun-control",
"cost": 50,
"balance_after": 450,
"created_at": "2026-09-30T19:49:58.544949+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "wan-2-2-fun-control",
"cost": 50,
"created_at": "2026-09-30T19:49:58.544949+00:00",
"completed_at": "2026-09-30T19:51:25.81631+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/wan-2-2-fun-control/video-1.mp4"
]
},
"error_message": null
}
Пока видео обрабатывается, status будет queued или processing, а result - null. При ошибке придёт status: "failed", result: null и текст причины в error_message.
Сохраните id из ответа на создание и запрашивайте операцию по нему:
GET /api/v1/operations/{id}
curl -H "Authorization: Bearer brth_ваш_ключ" \
https://bratuha.ru/api/v1/operations/op_uuid-123
Пример ожидания результата на JavaScript / TypeScript:
async function waitForVideo(id: string) {
while (true) {
const res = await fetch(`https://bratuha.ru/api/v1/operations/${id}`, {
headers: { Authorization: 'Bearer brth_ваш_ключ' },
})
const op = await res.json()
if (op.status === 'completed') return op.result.urls[0]
if (op.status === 'failed') throw new Error(op.error_message)
await new Promise((r) => setTimeout(r, 10000))
}
}
Одну операцию можно опрашивать не чаще раза в секунду, иначе придёт 429. Для видео хватит запроса раз в 10-15 секунд.
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/wan-2-2-fun-control/video-1.mp4"
]
}
type - всегда "video".urls - массив из одной ссылки на готовый MP4.Длительность и пропорции результата совпадают с исходным видео, частота - 30 кадров в секунду. Звуковая дорожка исходного видео сохраняется. Например, из вертикального ролика 704×1280 на 5 секунд в 480p получилось видео 470×852 той же длины со звуком оригинала.
Цена считается за каждую секунду исходного видео и зависит от разрешения:
| Разрешение | За секунду | 5 сек. | 30 сек. | 60 сек. | 120 сек. (максимум) |
|---|---|---|---|---|---|
480p | 10 ₽ | 50 ₽ | 300 ₽ | 600 ₽ | 1200 ₽ |
720p | 16 ₽ | 80 ₽ | 480 ₽ | 960 ₽ | 1920 ₽ |
video, в целых секундах.cost. Если нужна только часть движения, обрежьте видео до отправки - так дешевле.POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую платную операцию. Если ответ на создание потерялся, не отправляйте запрос вслепую ещё раз.queued, результат забирайте через GET /api/v1/operations/{id}.image и video принимают только внешние http/https ссылки. Адреса localhost и внутренних сетей не принимаются, файл должен открываться без авторизации.validation_error, операция не создастся и деньги не спишутся.