Редактирует загруженное видео по текстовому заданию и при необходимости использует картинки-референсы, чтобы точнее изменить объект, цвет, окружение или отдельные детали. Цена зависит от качества: черновик - 5 ₽/сек., полное - 8 ₽/сек.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Pruna P-Video Edit правит готовое видео по текстовому заданию. Движение, композиция и камера остаются из исходного ролика, а меняется то, что вы описали: погода, время суток, цвет одежды, предмет в руках, окружение. К заданию можно приложить до четырёх картинок-референсов - например, узор ткани или конкретный товар, который должен появиться в кадре.
Где это используют:
Для проверки идеи есть черновое качество - оно дешевле. Вызов создаёт асинхронную операцию: сразу приходит id, готовое видео забирается проверкой статуса. Пятисекундный ролик в черновом качестве обрабатывается около трёх минут.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Сценарии:
prompt и video;images, от одной до четырёх картинок.В обоих сценариях можно выбрать качество (draft или full), сохранить или убрать звук и отключить автоматическое улучшение задания.
{
"tool": "pruna-ai-p-video-edit",
"input": {
"prompt": "Замени дождь на снегопад, всё остальное оставь как есть",
"video": "https://cdn.example.com/source-video-1.mp4",
"quality": "draft"
}
}
tool - slug нейросети, всегда "pruna-ai-p-video-edit".input - параметры запуска. Поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
prompt | string | Да | Что изменить в видео и что оставить без изменений. От 3 до 4000 символов. Если есть референсы, укажите, какой за что отвечает: «цвет куртки как на первом референсе». |
prompt_upsampling | boolean | Нет | Автоматически расширить и уточнить задание перед обработкой. По умолчанию true. Передайте false, если нужен максимально буквальный результат. |
video | string (url) | Да | Ссылка на видео, которое нужно изменить. Один файл .mp4, .mov или .webm, длительность от 1 до 15 секунд. |
images | string[] (url) | Нет | Картинки-референсы: предмет, цвет, узор, окружение. До 4 ссылок .jpg, .jpeg, .png или .webp. Можно не передавать. |
quality | enum | Да | Качество обработки: full - полное, для финального результата; draft - черновик, дешевле, для быстрых проверок. Если поле не передать, будет full. |
save_audio | boolean | Нет | Оставить звуковую дорожку исходного видео. По умолчанию true. С false результат будет без звука. |
Ссылки в video и images - только внешние http/https URL с указанными расширениями. Файл должен открываться без авторизации.
Меняем погоду в ролике и убираем звук. За ролик на 5 секунд в черновом качестве спишется 25 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "pruna-ai-p-video-edit",
"input": {
"prompt": "Замени дождь на снегопад: на асфальте и крышах лежит свежий снег, всё остальное оставь как есть",
"video": "https://cdn.example.com/source-video-1.mp4",
"quality": "draft",
"save_audio": 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: 'pruna-ai-p-video-edit',
input: {
prompt: 'Замени дождь на снегопад: на асфальте и крышах лежит свежий снег, всё остальное оставь как есть',
video: 'https://cdn.example.com/source-video-1.mp4',
quality: 'draft',
save_audio: false,
},
}),
})
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-edit',
'input': {
'prompt': 'Замени дождь на снегопад: на асфальте и крышах лежит свежий снег, всё остальное оставь как есть',
'video': 'https://cdn.example.com/source-video-1.mp4',
'quality': 'draft',
'save_audio': False,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Две картинки-референса: узор для куртки и предмет, который должен появиться в руке. Задание используется буквально, звук сохраняется. За ролик на 5 секунд в полном качестве спишется 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-edit",
"input": {
"prompt": "Перекрась куртку девушки в цвет и узор с первого референса, а кружку в её руке замени на термос со второго",
"video": "https://cdn.example.com/source-video-2.mp4",
"images": [
"https://cdn.example.com/reference-1.jpg",
"https://cdn.example.com/reference-2.png"
],
"quality": "full",
"save_audio": true,
"prompt_upsampling": 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: 'pruna-ai-p-video-edit',
input: {
prompt: 'Перекрась куртку девушки в цвет и узор с первого референса, а кружку в её руке замени на термос со второго',
video: 'https://cdn.example.com/source-video-2.mp4',
images: [
'https://cdn.example.com/reference-1.jpg',
'https://cdn.example.com/reference-2.png',
],
quality: 'full',
save_audio: true,
prompt_upsampling: false,
},
}),
})
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-edit',
'input': {
'prompt': 'Перекрась куртку девушки в цвет и узор с первого референса, а кружку в её руке замени на термос со второго',
'video': 'https://cdn.example.com/source-video-2.mp4',
'images': [
'https://cdn.example.com/reference-1.jpg',
'https://cdn.example.com/reference-2.png',
],
'quality': 'full',
'save_audio': True,
'prompt_upsampling': False,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Для ролика длиной 5 секунд в черновом качестве:
{
"id": "op_uuid-123",
"status": "queued",
"tool": "pruna-ai-p-video-edit",
"cost": 25,
"balance_after": 475,
"created_at": "2026-09-30T19:49:58.485447+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "pruna-ai-p-video-edit",
"cost": 25,
"created_at": "2026-09-30T19:49:58.485447+00:00",
"completed_at": "2026-09-30T19:52:53.677197+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/pruna-ai-p-video-edit/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/pruna-ai-p-video-edit/video-1.mp4"
]
}
type - всегда "video".urls - массив из одной ссылки на готовый MP4.Длительность и пропорции результата совпадают с исходным видео. В проверке ролик 864×496 на 5 секунд в черновом качестве превратился в видео 848×480, 25 кадров в секунду, той же длины.
Цена считается за каждую секунду исходного видео и зависит от качества:
| Качество | За секунду | 5 сек. | 10 сек. | 15 сек. (максимум) |
|---|---|---|---|---|
draft | 5 ₽ | 25 ₽ | 50 ₽ | 75 ₽ |
full | 8 ₽ | 40 ₽ | 80 ₽ | 120 ₽ |
video, в целых секундах.prompt_upsampling на цену не влияют.cost.Удобная схема работы: подобрать задание в draft, а финальный вариант запустить в full.
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую платную операцию. Если ответ на создание потерялся, не отправляйте запрос вслепую ещё раз.queued, результат забирайте через GET /api/v1/operations/{id}.video и images принимают только внешние http/https ссылки. Адреса localhost и внутренних сетей не принимаются, файл должен открываться без авторизации.validation_error, операция не создастся и деньги не спишутся. Длинное видео разрежьте на куски до 15 секунд.images - не больше четырёх ссылок, иначе API вернёт validation_error.