Заменяет лицо в видео на лицо с вашего фото, сохраняя движения головы и мимику в кадре. Цена: 3 ₽/сек. видео (до 10 минут).
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Нейросеть ставит в видео лицо с вашего фото. Поворот головы, мимика, взгляд и артикуляция остаются от исходного ролика, меняется только внешность. Причёска, одежда и фон тоже остаются от видео.
Где это используют:
Если в кадре несколько человек, параметр target_index выбирает, чьё лицо заменить. Вызов создаёт асинхронную операцию: сразу приходит id, готовое видео забирается проверкой статуса. Пятисекундный ролик обрабатывается около двух минут.
Используйте только фото и видео людей, которые дали на это согласие.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Режим у нейросети один: видео плюс фото лица. Сценарии отличаются только значением target_index:
target_index: 0;target_index: 1 и дальше. Номер подбирается опытным путём: начните с 1 на коротком фрагменте.{
"tool": "video-face-swap",
"input": {
"video": "https://cdn.example.com/source-video-1.mp4",
"face_image": "https://cdn.example.com/face-image-1.jpg",
"target_index": 0
}
}
tool - slug нейросети, всегда "video-face-swap".input - параметры запуска. Поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
video | string (url) | Да | Ссылка на видео, в котором меняем лицо. Один файл, только внешний http/https URL с расширением .mp4, .mov или .webm. Длительность от 1 секунды до 10 минут (600 секунд), размер файла не больше 128 МиБ. |
face_image | string (url) | Да | Ссылка на фото с новым лицом. Одно изображение, только внешний http/https URL с расширением .jpg, .jpeg, .png или .webp. Лучше всего подходит чёткий портрет анфас, где лицо занимает заметную часть кадра. |
target_index | number | Да | Какое лицо в видео заменить. Число от 0 до 10: 0 - самое крупное лицо в кадре, 1 и дальше - другие лица. Если поле не передать, будет 0. |
Длительность вы не передаёте: сервер сам определяет её по файлу и по ней считает цену.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "video-face-swap",
"input": {
"video": "https://cdn.example.com/source-video-1.mp4",
"face_image": "https://cdn.example.com/face-image-1.jpg",
"target_index": 0
}
}'
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-face-swap',
input: {
video: 'https://cdn.example.com/source-video-1.mp4',
face_image: 'https://cdn.example.com/face-image-1.jpg',
target_index: 0,
},
}),
})
const operation = await response.json()
console.log(operation.id, operation.cost)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'video-face-swap',
'input': {
'video': 'https://cdn.example.com/source-video-1.mp4',
'face_image': 'https://cdn.example.com/face-image-1.jpg',
'target_index': 0,
},
},
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": "video-face-swap",
"input": {
"video": "https://cdn.example.com/group-video-1.mov",
"face_image": "https://cdn.example.com/face-image-2.png",
"target_index": 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: 'video-face-swap',
input: {
video: 'https://cdn.example.com/group-video-1.mov',
face_image: 'https://cdn.example.com/face-image-2.png',
target_index: 1,
},
}),
})
const operation = 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-face-swap',
'input': {
'video': 'https://cdn.example.com/group-video-1.mov',
'face_image': 'https://cdn.example.com/face-image-2.png',
'target_index': 1,
},
},
timeout=60,
)
print(response.json())
Для ролика длиной 5 секунд:
{
"id": "op_uuid-123",
"status": "queued",
"tool": "video-face-swap",
"cost": 15,
"balance_after": 485,
"created_at": "2026-09-30T12:45:18.773984+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "video-face-swap",
"cost": 15,
"created_at": "2026-09-30T12:45:18.773984+00:00",
"completed_at": "2026-09-30T12:47:07.536652+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/video-face-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-face-swap/video-1.mp4"
]
}
type - всегда "video".urls - массив из одной ссылки на готовый MP4.Размер кадра, частота кадров и длительность совпадают с исходным видео.
Цена - 3 ₽ за секунду видео. От target_index и фото цена не зависит. Длительность берётся из самого файла в целых секундах, сумма списывается при создании операции и приходит в поле cost.
| Длительность ролика | Цена |
|---|---|
| 5 секунд | 15 ₽ |
| 30 секунд | 90 ₽ |
| 1 минута | 180 ₽ |
| 10 минут (максимум) | 1 800 ₽ |
POST /api/v1/operations не идемпотентен: повторный запрос создаёт новую операцию и списывает деньги ещё раз. Если ответ на POST потерялся, не повторяйте его вслепую.queued, результат забирайте через GET /api/v1/operations/{id}.video и face_image принимаются только внешние http/https ссылки, доступные без авторизации: для видео .mp4, .mov, .webm, для фото .jpg, .jpeg, .png, .webp. Ссылки на localhost и внутренние адреса отклоняются.validation_error, операция не создастся и деньги не спишутся. target_index вне диапазона 0-10 тоже вернёт validation_error.target_index: 0). Для других лиц сначала проверьте номер на коротком фрагменте, чтобы не платить за весь ролик.