Анимирует персонажа из картинки по движениям из вашего видео или заменяет персонажа в ролике на героя с изображения. Стоимость от 8 до 16 рублей за 1 секунду видео в зависимости от выбранного качества.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Wan 2.2 Animate работает с парой «картинка + видео» и умеет две вещи. В режиме анимации она оживляет персонажа с картинки: он повторяет движения, позу и мимику человека из вашего ролика. В режиме замены всё наоборот - сцена, свет и движение камеры остаются из видео, а человек в кадре меняется на героя с картинки.
Так делают танцующих персонажей и маскотов по готовой хореографии, говорящие портреты по записи с телефона, замену актёра в коротком ролике без пересъёмки.
Каждый вызов создаёт асинхронную операцию. После запуска сохраните id и проверяйте статус отдельным запросом.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Режим выбирается полем mode:
animate - анимация персонажа с картинки движениями из видео. Фон и внешность берутся с картинки.replace - замена человека в видео на персонажа с картинки. Фон, свет и движение камеры берутся из видео.{
"tool": "wan-2-2-animate",
"input": {
"...": "..."
}
}
tool - slug нейросети, всегда "wan-2-2-animate".input - параметры запуска. Все поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
mode | enum | Да | Режим: animate - оживить персонажа с картинки движениями из видео, replace - заменить человека в видео на персонажа с картинки. Если не указать - animate. |
prompt | string | Нет | Уточнение к результату: характер движений, мимика, свет, кого именно заменить. Например: «естественная мимика, плавные движения». До 2000 символов. |
image | string (url) | Да | Ссылка на картинку с персонажем. Лучше всего подходит чёткое изображение, где персонаж виден целиком или по пояс. Один файл: jpg, jpeg, png или webp. |
video | string (url) | Да | Ссылка на видео с движением. Один файл: mp4, mov или webm, длительность от 1 до 120 секунд. |
resolution | enum | Да | Разрешение результата: 480p или 720p. Если не указать - 480p. |
Ссылки в image и video - только внешние http/https URL с указанными расширениями. Файл должен открываться без авторизации.
Персонаж с картинки повторит движения человека из видео. Фон останется тем, что на картинке.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "wan-2-2-animate",
"input": {
"mode": "animate",
"prompt": "Естественная мимика, плавные движения, мягкий дневной свет",
"image": "https://cdn.example.com/character-1.png",
"video": "https://cdn.example.com/dance-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-animate',
input: {
mode: 'animate',
prompt: 'Естественная мимика, плавные движения, мягкий дневной свет',
image: 'https://cdn.example.com/character-1.png',
video: 'https://cdn.example.com/dance-video-1.mp4',
resolution: '480p',
},
}),
})
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-2-2-animate',
'input': {
'mode': 'animate',
'prompt': 'Естественная мимика, плавные движения, мягкий дневной свет',
'image': 'https://cdn.example.com/character-1.png',
'video': 'https://cdn.example.com/dance-video-1.mp4',
'resolution': '480p',
},
},
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-2-2-animate",
"input": {
"mode": "replace",
"prompt": "Замени женщину в сером свитере на человека с картинки, фон и свет оставь как в видео",
"image": "https://cdn.example.com/character-2.jpg",
"video": "https://cdn.example.com/source-video-1.mov",
"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-animate',
input: {
mode: 'replace',
prompt:
'Замени женщину в сером свитере на человека с картинки, фон и свет оставь как в видео',
image: 'https://cdn.example.com/character-2.jpg',
video: 'https://cdn.example.com/source-video-1.mov',
resolution: '720p',
},
}),
})
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-2-2-animate',
'input': {
'mode': 'replace',
'prompt': 'Замени женщину в сером свитере на человека с картинки, фон и свет оставь как в видео',
'image': 'https://cdn.example.com/character-2.jpg',
'video': 'https://cdn.example.com/source-video-1.mov',
'resolution': '720p',
},
},
timeout=60,
)
print(response.status_code)
print(response.json())
Создание операции может занять несколько секунд: сервер сначала скачивает видео, чтобы узнать его длительность и посчитать цену. Поэтому таймаут клиента лучше ставить не меньше 60 секунд.
Для видео длиной 5 секунд в режиме replace и 480p:
{
"id": "op_uuid-123",
"status": "queued",
"tool": "wan-2-2-animate",
"cost": 40,
"balance_after": 460,
"created_at": "2026-09-30T19:50:11.097718+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "wan-2-2-animate",
"cost": 40,
"created_at": "2026-09-30T19:50:11.097718+00:00",
"completed_at": "2026-09-30T19:52:07.77842+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/wan-2-2-animate/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))
}
}
Видео на 5 секунд в 480p обрабатывается около двух минут, длинные ролики и 720p - дольше. Одну операцию можно опрашивать не чаще раза в секунду, разумный интервал - 15 секунд.
После завершения в result приходит одно видео:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/wan-2-2-animate/video-1.mp4"
]
}
type - всегда "video".urls - массив с одной ссылкой на MP4.480p приходит размером 848x464 и длиной около 5 секунд.Цена считается за каждую секунду исходного видео и зависит от разрешения. Режим на цену не влияет:
| Разрешение | За секунду | 5 сек. | 10 сек. | 60 сек. | 120 сек. |
|---|---|---|---|---|---|
480p | 8 ₽ | 40 ₽ | 80 ₽ | 480 ₽ | 960 ₽ |
720p | 16 ₽ | 80 ₽ | 160 ₽ | 960 ₽ | 1920 ₽ |
video и округляет вверх до целой секунды: ролик на 5,5 секунды считается как 6 секунд.cost. Чтобы заплатить меньше, обрежьте видео до нужного фрагмента перед отправкой.POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую платную операцию. Если ответ на создание потерялся, не отправляйте запрос вслепую ещё раз.queued, результат забирайте через GET /api/v1/operations/{id}.image и video принимают только внешние http/https ссылки. Адреса localhost и внутренних сетей не принимаются, файл должен открываться без авторизации.animate, фон из видео - replace.