Общая документация Public API · API-ключ можно создать в настройках аккаунта
Pruna P-Video 2 Pro - старшая версия P-Video 2 для роликов со звуком. Она оживляет изображение или снимает сцену с нуля по текстовому описанию. Ролик длится от 5 до 15 секунд, выходит в 480p или 768p, а звук - речь, шумы и музыка - появляется сам по заданию. Для анимации из картинки можно задать ещё и последний кадр, чтобы ролик пришёл к нужной сцене.
Основные сценарии:
generation_type: "image", картинка становится первым кадром, по желанию добавляется конечный кадр.generation_type: "text", сцена строится только по заданию, соотношение сторон выбираете сами.Каждый вызов создаёт асинхронную операцию. После запуска сохраните id и проверяйте статус отдельным запросом.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Сценарий задаёт параметр generation_type:
image - видео из изображения (нужен image, можно добавить last_image);text - видео из текста (можно указать aspect_ratio).{
"tool": "pruna-ai-p-video-2-pro",
"input": {
"...": "..."
}
}
tool - slug нейросети, всегда "pruna-ai-p-video-2-pro".input - параметры запуска. Все поля передаются прямо внутри этого объекта, без дополнительной вложенности.image нужна ссылка на картинку, для text - нет.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
generation_type | enum | Да | Сценарий. image - видео из изображения, text - видео из текста. Если поле не передать, используется image. |
prompt | string | Да | Что происходит в ролике: действие, реплики, движение камеры, звук, настроение. От 3 до 4000 символов. |
image | string (url) | Да, для image | Ссылка на первый кадр ролика. По этой картинке задаются пропорции видео. Один файл: jpg, jpeg, png или webp. |
use_last_image | boolean | Нет | Включите true, чтобы задать последний кадр через last_image. Только в сценарии image, по умолчанию false. |
last_image | string (url) | Да, если use_last_image: true | Ссылка на последний кадр ролика: jpg, jpeg, png или webp. Без use_last_image: true поле не используется. |
aspect_ratio | enum | Нет | Соотношение сторон. Только в сценарии text, если не указано - 16:9. Варианты: 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 1:1. |
duration | number | Да | Длительность ролика в секундах, целое число от 5 до 15. Если не указать, будет 5 секунд. |
resolution | enum | Да | Разрешение: 480p или 768p. Если не указать - 768p. |
mode | enum | Да | Режим генерации. - экономный: дешевле, качество как у , но ждать дольше. - быстрый. - лучшее качество, дороже. Если не указать - . |
Ссылки в image и last_image передавайте как внешние http/https URL с расширением jpg, jpeg, png или webp.
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",
"input": {
"generation_type": "image",
"prompt": "Бариста ставит на стойку чашку капучино, рисует сердце на пене и с улыбкой говорит: \"Ваш кофе готов\". Камера медленно приближается к чашке, тихий шум кофейни",
"image": "https://cdn.example.com/source-image-1.jpg",
"use_last_image": true,
"last_image": "https://cdn.example.com/last-frame-1.jpg",
"duration": 8,
"resolution": "768p",
"mode": "quality",
"prompt_upsampler": "turbo"
}
}'
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',
input: {
generation_type: 'image',
prompt:
'Бариста ставит на стойку чашку капучино, рисует сердце на пене и с улыбкой говорит: "Ваш кофе готов". Камера медленно приближается к чашке, тихий шум кофейни',
image: 'https://cdn.example.com/source-image-1.jpg',
use_last_image: true,
last_image: 'https://cdn.example.com/last-frame-1.jpg',
duration: 8,
resolution: '768p',
mode: 'quality',
prompt_upsampler: 'turbo',
},
}),
})
const data = await response.json()
console.log(data.id, data.status)
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',
'input': {
'generation_type': 'image',
'prompt': 'Бариста ставит на стойку чашку капучино, рисует сердце на пене и с улыбкой говорит: "Ваш кофе готов". Камера медленно приближается к чашке, тихий шум кофейни',
'image': 'https://cdn.example.com/source-image-1.jpg',
'use_last_image': True,
'last_image': 'https://cdn.example.com/last-frame-1.jpg',
'duration': 8,
'resolution': '768p',
'mode': 'quality',
'prompt_upsampler': 'turbo',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Без конечного кадра просто не передавайте use_last_image и last_image: ролик начнётся с image, а дальше пойдёт по заданию.
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",
"input": {
"generation_type": "text",
"prompt": "Утренняя пекарня, пекарь достаёт из печи противень с круассанами, от выпечки поднимается пар, слышно потрескивание печи. Камера плавно отъезжает",
"aspect_ratio": "9:16",
"duration": 10,
"resolution": "480p",
"mode": "cost",
"prompt_upsampler": "max"
}
}'
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',
input: {
generation_type: 'text',
prompt:
'Утренняя пекарня, пекарь достаёт из печи противень с круассанами, от выпечки поднимается пар, слышно потрескивание печи. Камера плавно отъезжает',
aspect_ratio: '9:16',
duration: 10,
resolution: '480p',
mode: 'cost',
prompt_upsampler: 'max',
},
}),
})
const data = await response.json()
console.log(data.id, data.status)
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',
'input': {
'generation_type': 'text',
'prompt': 'Утренняя пекарня, пекарь достаёт из печи противень с круассанами, от выпечки поднимается пар, слышно потрескивание печи. Камера плавно отъезжает',
'aspect_ratio': '9:16',
'duration': 10,
'resolution': '480p',
'mode': 'cost',
'prompt_upsampler': 'max',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "pruna-ai-p-video-2-pro",
"cost": 96,
"balance_after": 404,
"created_at": "2026-10-02T12:46:04.412693+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "pruna-ai-p-video-2-pro",
"cost": 96,
"created_at": "2026-10-02T12:46:04.412693+00:00",
"completed_at": "2026-10-02T12:47:31.479484+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/pruna-ai-p-video-2-pro/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, 5000))
}
}
Опрашивать одну операцию можно не чаще раза в секунду, разумный интервал - 5 секунд. В режиме cost ролик готовится дольше, чем в speed.
После завершения в result приходит одно видео:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/pruna-ai-p-video-2-pro/video-1.mp4"
]
}
type - всегда "video".urls - массив с одной ссылкой на MP4.duration, звуковая дорожка создаётся вместе с видео. Пропорции в сценарии image повторяют исходную картинку, в сценарии text - значение aspect_ratio.Цена считается за секунду ролика: ставка зависит от разрешения и режима mode, затем умножается на duration. Сценарий (image или text), конечный кадр и улучшение задания на цену не влияют.
| Разрешение | mode | За секунду | 5 сек. | 10 сек. | 15 сек. |
|---|---|---|---|---|---|
480p | cost | 2 ₽ | 10 ₽ | 20 ₽ | 30 ₽ |
480p | speed | 4 ₽ | 20 ₽ | 40 ₽ | 60 ₽ |
480p | quality | 7 ₽ | 35 ₽ | 70 ₽ | 105 ₽ |
768p | cost | 5 ₽ | 25 ₽ | 50 ₽ | 75 ₽ |
768p | speed | 7 ₽ | 35 ₽ | 70 ₽ | 105 ₽ |
768p | quality | 12 ₽ | 60 ₽ | 120 ₽ | 180 ₽ |
Самый дешёвый запуск - 5 секунд в 480p в режиме cost за 10 ₽. Полная сумма списывается при создании операции и видна в поле cost.
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую платную операцию. Если ответ на создание потерялся, не отправляйте запрос вслепую ещё раз.queued, результат забирайте через GET /api/v1/operations/{id}.image и last_image принимают только внешние http/https ссылки на jpg, jpeg, png или webp. Адреса localhost и внутренних сетей не принимаются, файл должен открываться без авторизации.aspect_ratio работает только в сценарии text, а image, use_last_image и last_image - только в сценарии image.480p в режиме cost: проверьте движение и звук, затем запустите тот же запрос в 768p и нужном режиме.prompt_upsampler: "off".costspeedspeedqualityspeedprompt_upsampler | enum | Да | Улучшение задания перед генерацией: off - выключено, turbo - быстрое, max - максимальное. Если не указать - turbo. На цену не влияет. |