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