Заменяет персонажа в вашем видео на другого - по референсному изображению и текстовому заданию. Цена зависит от разрешения: 480p - 7 ₽/сек., 720p - 14 ₽/сек.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Wan 2.1 MoCha меняет человека в готовом видео на другого персонажа с вашей фотографии. Движения, мимика, ракурс, свет и фон остаются из исходного ролика, меняется только внешность героя. Так делают перенос движения на своего персонажа, примерку образа на танец или сцену, замену актёра в коротком ролике без пересъёмки.
На вход нужны два файла: видео с движением и референсное изображение персонажа. Текстовое задание необязательно, но помогает указать, кого именно заменить, если в кадре несколько людей.
Каждый вызов создаёт асинхронную операцию. После запуска сохраните id и проверяйте статус отдельным запросом.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Сценарий у нейросети один - замена персонажа в видео. Отличаются только наличие задания и разрешение.
{
"tool": "wan-2-1-mocha",
"input": {
"...": "..."
}
}
tool - slug нейросети, всегда "wan-2-1-mocha".input - параметры запуска. Все поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
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-1-mocha",
"input": {
"prompt": "Замени человека в видео на женщину с референсного фото, сохрани движения, мимику и фон",
"image": "https://cdn.example.com/character-1.png",
"video": "https://cdn.example.com/source-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-1-mocha',
input: {
prompt:
'Замени человека в видео на женщину с референсного фото, сохрани движения, мимику и фон',
image: 'https://cdn.example.com/character-1.png',
video: 'https://cdn.example.com/source-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-1-mocha',
'input': {
'prompt': 'Замени человека в видео на женщину с референсного фото, сохрани движения, мимику и фон',
'image': 'https://cdn.example.com/character-1.png',
'video': 'https://cdn.example.com/source-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-1-mocha",
"input": {
"image": "https://cdn.example.com/character-2.jpg",
"video": "https://cdn.example.com/dance-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-1-mocha',
input: {
image: 'https://cdn.example.com/character-2.jpg',
video: 'https://cdn.example.com/dance-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-1-mocha',
'input': {
'image': 'https://cdn.example.com/character-2.jpg',
'video': 'https://cdn.example.com/dance-video-1.mov',
'resolution': '720p',
},
},
timeout=60,
)
print(response.status_code)
print(response.json())
Создание операции может занять несколько секунд: сервер сначала скачивает видео, чтобы узнать его длительность и посчитать цену. Поэтому таймаут клиента лучше ставить не меньше 60 секунд.
Для видео длиной 5 секунд в 480p:
{
"id": "op_uuid-123",
"status": "queued",
"tool": "wan-2-1-mocha",
"cost": 35,
"balance_after": 465,
"created_at": "2026-09-30T12:46:04.556247+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "wan-2-1-mocha",
"cost": 35,
"created_at": "2026-09-30T12:46:04.556247+00:00",
"completed_at": "2026-09-30T12:48:36.57376+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/wan-2-1-mocha/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))
}
}
Обработка идёт дольше генерации коротких роликов: обычно 3-7 минут, для длинных видео - больше. Одну операцию можно опрашивать не чаще раза в секунду, разумный интервал - 15 секунд.
После завершения в result приходит одно видео:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/wan-2-1-mocha/video-1.mp4"
]
}
type - всегда "video".urls - массив с одной ссылкой на MP4.480p приходит размером около 848x464.Цена считается за каждую секунду исходного видео и зависит от разрешения:
| Разрешение | За секунду | 5 сек. | 10 сек. | 60 сек. | 120 сек. |
|---|---|---|---|---|---|
480p | 7 ₽ | 35 ₽ | 70 ₽ | 420 ₽ | 840 ₽ |
720p | 14 ₽ | 70 ₽ | 140 ₽ | 840 ₽ | 1680 ₽ |
video и округляет вверх до целой секунды. Например, за ролик на 5 секунд в 480p спишется 35 ₽, а ролик на 5,5 секунды считается как 6 секунд - 42 ₽.cost. Чтобы заранее знать цену, обрежьте видео до нужной длины перед отправкой.POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую платную операцию. Если ответ на создание потерялся, не отправляйте запрос вслепую ещё раз.queued, результат забирайте через GET /api/v1/operations/{id}.image и video принимают только внешние http/https ссылки. Адреса localhost и внутренних сетей не принимаются, файл должен открываться без авторизации.prompt опишите, кого именно заменить (по одежде, положению в кадре), и что должно остаться без изменений.