Заменяет одного или двух людей в вашем видео на людей с фото: движения, камера и звук остаются прежними, а губы следуют за исходной речью. Цена зависит от разрешения: 480p — 8 ₽/сек., 768p — 16 ₽/сек., 1080p — 20 ₽/сек., 2K — 23 ₽/сек., 4K — 30 ₽/сек.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Pruna P-Video 2 Pro Replace берёт готовое видео до 2 минут и заменяет в нём одного или двух людей на людей с фото. Движения, камера и звук остаются как в исходнике, а губы нового человека следуют за речью из ролика. Так делают рекламу с другим героем без пересъёмки, пробуют разных актёров в одном дубле, снимают ролик с собой в чужой сцене.
Результат приходит в разрешении от 480p до 4K, а платите за секунды исходного видео: ставка зависит от разрешения. Вызов создаёт асинхронную операцию: сначала приходит id, затем вы проверяете статус, пока не будет готово видео.
POST /api/v1/operationsAuthorization: Bearer brth_...id и стартовый статус queued.Режим один, но вызывать его удобно тремя способами:
| Сценарий | Что передать | Что получится |
|---|---|---|
| Один человек | video и одно фото в images | Человек в кадре заменяется на человека с фото, звук и движение губ по речи сохраняются |
| Двое в кадре | video, два фото в images и prompt | Замена идёт так, как написано в задании. Без задания выбор людей остаётся за нейросетью |
| Без подгонки губ или без звука | ignore_audio: true и/или save_audio: false | Губы не следуют за исходной речью, дорожка остаётся или убирается по save_audio |
{
"tool": "pruna-ai-p-video-2-pro-replace",
"input": {
"video": "https://cdn.example.com/source-video-1.mp4",
"images": ["https://cdn.example.com/person-1.jpg"],
"resolution": "768p"
}
}
tool - slug нейросети, всегда "pruna-ai-p-video-2-pro-replace".input - параметры запуска: ссылка на видео, фото людей и настройки.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
prompt | string | Нет | Кого на кого заменить, если в кадре несколько людей: «мужчину в синей куртке замени на человека с первого фото». До 2000 символов. Без него выбор людей остаётся за нейросетью, поэтому при нескольких людях в кадре prompt лучше передавать. |
video | string (url) | Да | Ссылка на исходное видео от 1 до 120 секунд с расширением .mp4, .mov или .webm, соотношение сторон от 1:4 до 4:1. По длине ролика считается цена. |
images | string[] (url) | Да | Массив из 1 или 2 ссылок на фото: .jpg, .jpeg, .png или .webp. По одному фото на каждого человека, которого нужно заменить. |
resolution | enum | Да | Разрешение результата: 480p, 768p, 1080p, 2k или 4k. Если не передать, будет 768p. 1080p, 2k и 4k получаются увеличением ролика 768p. От разрешения зависит ставка за секунду. |
save_audio | boolean | Нет | Оставить в результате звук исходного видео. По умолчанию true. |
ignore_audio | boolean | Нет | true - нейросеть не слушает звук исходника, и губы не следуют за речью. При save_audio: true дорожка всё равно останется в результате. По умолчанию false. |
В ролике 6 секунд один человек, меняем его на человека с фото. Звук остаётся, губы следуют за речью. 768p, стоимость - 96 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "pruna-ai-p-video-2-pro-replace",
"input": {
"video": "https://cdn.example.com/source-video-1.mp4",
"images": [
"https://cdn.example.com/person-1.jpg"
],
"resolution": "768p"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'pruna-ai-p-video-2-pro-replace',
input: {
video: 'https://cdn.example.com/source-video-1.mp4',
images: ['https://cdn.example.com/person-1.jpg'],
resolution: '768p',
},
}),
})
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': 'pruna-ai-p-video-2-pro-replace',
'input': {
'video': 'https://cdn.example.com/source-video-1.mp4',
'images': ['https://cdn.example.com/person-1.jpg'],
'resolution': '768p',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
В 10-секундном ролике за столиком сидят двое. В prompt пишем, кого на кого заменить, порядок фото совпадает с порядком в задании. 1080p, стоимость - 200 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "pruna-ai-p-video-2-pro-replace",
"input": {
"prompt": "Мужчину в синей куртке замени на человека с первого фото, женщину в красном платье - на человека со второго.",
"video": "https://cdn.example.com/source-video-2.mp4",
"images": [
"https://cdn.example.com/person-1.jpg",
"https://cdn.example.com/person-2.jpg"
],
"resolution": "1080p"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'pruna-ai-p-video-2-pro-replace',
input: {
prompt: 'Мужчину в синей куртке замени на человека с первого фото, женщину в красном платье - на человека со второго.',
video: 'https://cdn.example.com/source-video-2.mp4',
images: [
'https://cdn.example.com/person-1.jpg',
'https://cdn.example.com/person-2.jpg',
],
resolution: '1080p',
},
}),
})
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': 'pruna-ai-p-video-2-pro-replace',
'input': {
'prompt': 'Мужчину в синей куртке замени на человека с первого фото, женщину в красном платье - на человека со второго.',
'video': 'https://cdn.example.com/source-video-2.mp4',
'images': [
'https://cdn.example.com/person-1.jpg',
'https://cdn.example.com/person-2.jpg',
],
'resolution': '1080p',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Ролик на 5 секунд, где человек молчит, а на дорожке шум: звук в результате не нужен, а губы не должны под него подстраиваться. 480p, стоимость - 40 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "pruna-ai-p-video-2-pro-replace",
"input": {
"video": "https://cdn.example.com/source-video-3.mp4",
"images": [
"https://cdn.example.com/person-1.jpg"
],
"resolution": "480p",
"save_audio": false,
"ignore_audio": 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: 'pruna-ai-p-video-2-pro-replace',
input: {
video: 'https://cdn.example.com/source-video-3.mp4',
images: ['https://cdn.example.com/person-1.jpg'],
resolution: '480p',
save_audio: false,
ignore_audio: true,
},
}),
})
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': 'pruna-ai-p-video-2-pro-replace',
'input': {
'video': 'https://cdn.example.com/source-video-3.mp4',
'images': ['https://cdn.example.com/person-1.jpg'],
'resolution': '480p',
'save_audio': False,
'ignore_audio': True,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "pruna-ai-p-video-2-pro-replace",
"cost": 96,
"balance_after": 904,
"created_at": "2026-11-06T10:15:02Z"
}
cost - сколько списано за операцию, в рублях.balance_after - баланс после списания.{
"id": "op_uuid-123",
"status": "completed",
"tool": "pruna-ai-p-video-2-pro-replace",
"cost": 96,
"created_at": "2026-11-06T10:15:02Z",
"completed_at": "2026-11-06T10:18:40Z",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/pruna-ai-p-video-2-pro-replace/video-1.mp4"
]
},
"error_message": null
}
{
"id": "op_uuid-123",
"status": "failed",
"tool": "pruna-ai-p-video-2-pro-replace",
"cost": 96,
"created_at": "2026-11-06T10:15:02Z",
"completed_at": "2026-11-06T10:17:12Z",
"result": null,
"error_message": "Ваш запрос не прошел модерацию. Запрещено: nsfw."
}
Деньги за операцию со статусом failed возвращаются на баланс.
Сохраните id из ответа на создание и запрашивайте статус операции по нему:
GET /api/v1/operations/{id}
curl -H "Authorization: Bearer brth_ваш_ключ" \
https://bratuha.ru/api/v1/operations/op_uuid-123
async function waitForResult(id) {
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))
}
}
Статус операции:
queued - операция создана и ждёт запуска;processing - видео обрабатывается;completed - готово, ссылка лежит в result;failed - не получилось, причина в error_message.В наших запусках ролики на 4-10 секунд в разрешениях от 480p до 4K были готовы за полторы-три минуты, длиннее 10 секунд мы не запускали. Опрашивать статус раз в 10-15 секунд достаточно, чаще раза в секунду нельзя - придёт 429.
Результат - одно видео MP4:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/pruna-ai-p-video-2-pro-replace/video-1.mp4"
]
}
type - всегда "video".urls - массив из одной ссылки на готовый файл.Длина и пропорции кадра совпадают с исходником, частота кадров в наших запусках - 24 в секунду. Вертикальные ролики вернулись как 480×832 в 480p, 768×1344 в 768p, 1088×1904 в 1080p и 1450×2536 в 2k, горизонтальный - как 3808×2176 в 4k. С save_audio: false в файле нет звуковой дорожки.
Цена - за каждую секунду исходного видео, ставка зависит только от resolution:
resolution | За секунду | 10 с | 60 с | 120 с |
|---|---|---|---|---|
480p | 8 ₽ | 80 ₽ | 480 ₽ | 960 ₽ |
768p | 16 ₽ | 160 ₽ | 960 ₽ | 1920 ₽ |
1080p | 20 ₽ | 200 ₽ | 1200 ₽ | 2400 ₽ |
2k | 23 ₽ | 230 ₽ | 1380 ₽ | 2760 ₽ |
4k | 30 ₽ | 300 ₽ | 1800 ₽ | 3600 ₽ |
Длительность сервер сам определяет по файлу и округляет вверх до целой секунды: ролик 6,2 секунды считается как 7 секунд. Максимум - 120 секунд.
Число фото, задание и настройки звука на цену не влияют. Точная сумма приходит в поле cost ответа на создание операции и сразу списывается с баланса. Ставки могут меняться - перед массовыми запусками сверяйтесь с cost или передавайте max_price.
POST /api/v1/operations не идемпотентен: каждый запрос создаёт новую операцию и списывает деньги. Чтобы безопасно повторять запрос при обрыве связи, передайте UUID в заголовке Idempotency-Key: повтор в течение 24 часов вернёт исходную операцию без нового списания.max_price в теле запроса, если хотите, чтобы сервер отклонил запуск дороже согласованной суммы ещё до списания. Полезно для 4K: 2 минуты стоят 3600 ₽.queued, результат нужно забирать запросом статуса по id.http/https URL, которые открываются без авторизации. Видео - .mp4, .mov или .webm, фото - .jpg, .jpeg, .png, .webp.400, операция не создастся и деньги не спишутся. Длинный ролик обрежьте заранее.1080p, 2k и 4k - это увеличенный ролик 768p: мелкие детали он не добавляет, а стоит дороже.prompt, кого на кого заменить, по приметам, которые видно в кадре: одежда, волосы, место в кадре. Русский язык нейросеть поняла в нашей пробе. Без prompt в пробе с шестью людьми первое фото заняло место крайнего слева, а второе - крайнего справа.