Анимирует персонажа с картинки, перенося на него движения из вашего видео. Цена - 10 ₽ за секунду видео.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Wan Motion переносит движение из вашего видео на персонажа с картинки. Вы даёте ролик, где кто-то танцует, говорит или жестикулирует, и фото героя, а модель делает видео, в котором этот герой повторяет те же движения и мимику. Подходит для танцевальных трендов, оживления персонажей и маскотов, «поющих» портретов и роликов с одним и тем же героем в разных сценах.
Сценарий у нейросети один: видео движения плюс картинка персонажа. Задание в prompt необязательно, оно помогает уточнить детали.
Каждый вызов создаёт асинхронную операцию. После запуска сохраните id и проверяйте статус отдельным запросом.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Обязательны два поля: video_url (откуда брать движение) и image_url (кого анимировать). Остальное подставится по умолчанию.
{
"tool": "wan-motion",
"input": {
"...": "..."
}
}
tool - slug нейросети, всегда "wan-motion".input - параметры запуска. Все поля передаются прямо внутри этого объекта, без дополнительной вложенности.video_url и image_url.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
video_url | string (url) | Да | Видео, из которого берётся движение: танец, жесты, мимика. Один файл mp4, mov или webm, длительностью до 10 минут. По его длине считается цена. |
image_url | string (url) | Да | Картинка с персонажем, который будет двигаться. Один файл jpg, jpeg, png или webp. Лучше всего подходит чёткое фото, где герой виден так же, как человек в видео: портрет для мимики, рост целиком для танца. |
prompt | string | Нет | Уточнения: стиль, ракурс, что сохранить без изменений. До 2000 символов. Можно писать по-русски. |
acceleration | enum | Да | Ускорение: regular - обычно быстрее, рекомендуется; none - без ускорения. Если не указать - regular. На цену не влияет. |
adapt_motion | boolean | Нет | Подстроить движение под пропорции персонажа с картинки: полезно, если герой ниже, выше или сложен иначе, чем человек в видео. По умолчанию true. |
enhance_identity | boolean | Нет | Дополнительно подготовить картинку, чтобы точнее сохранить лицо и внешность героя. По умолчанию false. Добавляет к цене 15 ₽ за запуск. |
Ссылки передавайте как внешние http/https URL с подходящим расширением. Файл должен открываться без авторизации, размер - до 128 МБ.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "wan-motion",
"input": {
"video_url": "https://cdn.example.com/dance-motion-1.mp4",
"image_url": "https://cdn.example.com/character-full-body-1.jpg",
"acceleration": "regular",
"adapt_motion": true,
"enhance_identity": 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-motion',
input: {
video_url: 'https://cdn.example.com/dance-motion-1.mp4',
image_url: 'https://cdn.example.com/character-full-body-1.jpg',
acceleration: 'regular',
adapt_motion: true,
enhance_identity: false,
},
}),
})
const data = await response.json()
console.log(data.id, data.status)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-motion',
'input': {
'video_url': 'https://cdn.example.com/dance-motion-1.mp4',
'image_url': 'https://cdn.example.com/character-full-body-1.jpg',
'acceleration': 'regular',
'adapt_motion': True,
'enhance_identity': False,
},
},
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-motion",
"input": {
"video_url": "https://cdn.example.com/talking-person-1.mov",
"image_url": "https://cdn.example.com/portrait-1.png",
"prompt": "Женщина с фото повторяет мимику и движения головы из видео, лицо остаётся прежним",
"acceleration": "regular",
"adapt_motion": true,
"enhance_identity": 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-motion',
input: {
video_url: 'https://cdn.example.com/talking-person-1.mov',
image_url: 'https://cdn.example.com/portrait-1.png',
prompt:
'Женщина с фото повторяет мимику и движения головы из видео, лицо остаётся прежним',
acceleration: 'regular',
adapt_motion: true,
enhance_identity: true,
},
}),
})
const data = await response.json()
console.log(data.id, data.status)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'wan-motion',
'input': {
'video_url': 'https://cdn.example.com/talking-person-1.mov',
'image_url': 'https://cdn.example.com/portrait-1.png',
'prompt': 'Женщина с фото повторяет мимику и движения головы из видео, лицо остаётся прежним',
'acceleration': 'regular',
'adapt_motion': True,
'enhance_identity': True,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "wan-motion",
"cost": 50,
"balance_after": 950,
"created_at": "2026-09-30T21:32:07.958131+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "wan-motion",
"cost": 50,
"created_at": "2026-09-30T21:32:07.958131+00:00",
"completed_at": "2026-09-30T21:39:23.504839+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/wan-motion/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, 30000))
}
}
Генерация идёт дольше, чем у обычных видеомоделей: пятисекундное видео в пробном запуске обработалось за 7 минут, ролики на 10-15 секунд занимают 13-22 минуты, на 30 секунд - около 50 минут. Одну операцию можно опрашивать не чаще раза в секунду, здесь разумный интервал - 30 секунд.
После завершения в result приходит одно видео:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/wan-motion/video-1.mp4"
]
}
type - всегда "video".urls - массив с одной ссылкой на MP4.Цена считается за каждую секунду видео движения: 10 ₽ за секунду, дробная часть округляется вверх до целой секунды. Если включить enhance_identity, к сумме добавляется 15 ₽ за запуск. Картинка, задание, acceleration и adapt_motion на цену не влияют.
| Длина видео движения | Без enhance_identity | С enhance_identity |
|---|---|---|
| 3 сек. | 30 ₽ | 45 ₽ |
| 5 сек. | 50 ₽ | 65 ₽ |
| 10 сек. | 100 ₽ | 115 ₽ |
| 30 сек. | 300 ₽ | 315 ₽ |
| 1 мин. | 600 ₽ | 615 ₽ |
Пример: видео на 5,0 секунды стоит 50 ₽, на 5,2 секунды - уже 6 × 10 = 60 ₽. Сервер сам измеряет длительность видео по ссылке до создания операции, сумма списывается сразу и видна в поле cost. Видео длиннее 10 минут не принимается: запрос получит 400 validation_error, деньги не спишутся. Если операция завершилась ошибкой (failed), деньги возвращаются на баланс.
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую платную операцию. Если ответ на создание потерялся, не отправляйте запрос вслепую ещё раз.queued, результат забирайте через GET /api/v1/operations/{id}.http/https URL: видео mp4, mov, webm, картинка jpg, jpeg, png, webp. Адреса localhost и внутренних сетей не принимаются. Если сервер не смог скачать видео или определить его длительность, операция не создаётся и деньги не списываются.enhance_identity и напишите в задании, что лицо должно остаться прежним.