Заменяет голову (лицо, волосы и контур) человека в вашем видео на голову с загруженного фото, сохраняя движения, позу и фон. Цена: 480p - 7 ₽/сек., 720p - 14 ₽/сек.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Нейросеть меняет в готовом ролике голову человека на голову с вашего фото: лицо, форму головы, линию роста волос. Движения, мимика, поза, одежда, свет и фон остаются из исходного видео. В отличие от замены только лица, меняется и причёска, но длинные волосы из исходного ролика могут частично остаться - нейросеть подстраивает голову под то, что видно в кадре.
Где это используют:
На вход нужны два файла: видео и фото головы. Текстовое задание необязательно - в нём можно уточнить, что сохранить (например, очки) или кого заменить, если в кадре несколько людей. Вызов создаёт асинхронную операцию: сразу приходит id, готовое видео забирается проверкой статуса. Пятисекундный ролик в 480p обрабатывается около двух-трёх минут.
Используйте только фото и видео людей, которые дали на это согласие.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Режим у нейросети один: видео плюс фото головы. Вызовы отличаются только заданием и разрешением результата (480p или 720p).
{
"tool": "video-head-swap",
"input": {
"video": "https://cdn.example.com/source-video-1.mp4",
"face_image": "https://cdn.example.com/head-photo-1.jpg",
"resolution": "480p"
}
}
tool - slug нейросети, всегда "video-head-swap".input - параметры запуска. Поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
prompt | string | Нет | Уточнение к замене: что сохранить, кого заменить, если людей несколько. Например: «замени голову мужчины в синей куртке, очки оставь». До 2000 символов. Можно не передавать. |
video | string (url) | Да | Ссылка на исходное видео. Один файл .mp4, .mov или .webm, длительность от 1 до 120 секунд, размер до 128 МБ. |
face_image | string (url) | Да | Ссылка на фото головы, которую нужно поставить в видео. Один файл .jpg, .jpeg, .png или .webp. Лучше всего подходит чёткий портрет, где видны лицо и причёска целиком. |
resolution | enum | Да | Разрешение результата: 480p - дешевле, подходит для проверки и соцсетей; 720p - чётче, стоит вдвое дороже. Если поле не передать, будет 480p. |
Ссылки в video и face_image - только внешние http/https URL с указанными расширениями. Файл должен открываться без авторизации.
Самый простой вызов: видео, фото и разрешение. За ролик на 5 секунд спишется 35 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "video-head-swap",
"input": {
"video": "https://cdn.example.com/source-video-1.mp4",
"face_image": "https://cdn.example.com/head-photo-1.jpg",
"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: 'video-head-swap',
input: {
video: 'https://cdn.example.com/source-video-1.mp4',
face_image: 'https://cdn.example.com/head-photo-1.jpg',
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': 'video-head-swap',
'input': {
'video': 'https://cdn.example.com/source-video-1.mp4',
'face_image': 'https://cdn.example.com/head-photo-1.jpg',
'resolution': '480p',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Задание уточняет, что оставить от исходного видео. За ролик на 5 секунд спишется 70 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "video-head-swap",
"input": {
"prompt": "Замени голову мужчины на голову с фото, очки оставь, фон и движения не меняй",
"video": "https://cdn.example.com/source-video-2.mov",
"face_image": "https://cdn.example.com/head-photo-2.png",
"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: 'video-head-swap',
input: {
prompt: 'Замени голову мужчины на голову с фото, очки оставь, фон и движения не меняй',
video: 'https://cdn.example.com/source-video-2.mov',
face_image: 'https://cdn.example.com/head-photo-2.png',
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': 'video-head-swap',
'input': {
'prompt': 'Замени голову мужчины на голову с фото, очки оставь, фон и движения не меняй',
'video': 'https://cdn.example.com/source-video-2.mov',
'face_image': 'https://cdn.example.com/head-photo-2.png',
'resolution': '720p',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Для ролика длиной 5 секунд в 480p:
{
"id": "op_uuid-123",
"status": "queued",
"tool": "video-head-swap",
"cost": 35,
"balance_after": 465,
"created_at": "2026-09-30T19:49:58.448889+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "video-head-swap",
"cost": 35,
"created_at": "2026-09-30T19:49:58.448889+00:00",
"completed_at": "2026-09-30T19:52:31.77272+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/video-head-swap/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/video-head-swap/video-1.mp4"
]
}
type - всегда "video".urls - массив из одной ссылки на готовый MP4.Пропорции результата совпадают с исходным видео, частота - 30 кадров в секунду. Размер кадра зависит от resolution: из горизонтального ролика 1310×720 в 480p получилось видео 848×464.
Результат может быть немного короче исходника. В проверке из ролика на 5 секунд получилось видео на 4,3 секунды, а цена считается по длине исходного файла. Если важна точная длина, проверьте её у готового файла и при необходимости подгоните монтажом.
Цена считается за каждую секунду исходного видео и зависит от разрешения:
| Разрешение | За секунду | 5 сек. | 30 сек. | 60 сек. | 120 сек. (максимум) |
|---|---|---|---|---|---|
480p | 7 ₽ | 35 ₽ | 210 ₽ | 420 ₽ | 840 ₽ |
720p | 14 ₽ | 70 ₽ | 420 ₽ | 840 ₽ | 1680 ₽ |
video, в целых секундах.cost. Если нужна только часть ролика, обрежьте его до отправки - так дешевле.POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую платную операцию. Если ответ на создание потерялся, не отправляйте запрос вслепую ещё раз.queued, результат забирайте через GET /api/v1/operations/{id}.video и face_image принимают только внешние http/https ссылки. Адреса localhost и внутренних сетей не принимаются, файл должен открываться без авторизации.validation_error, операция не создастся и деньги не спишутся.prompt, кого заменить - по одежде или положению в кадре. Сначала проверьте результат на коротком фрагменте, чтобы не платить за весь ролик.