Создаёт видео по текстовому описанию или одному изображению, с выбором длительности, разрешения и режима качества. Цена зависит от разрешения и режима: 720p черновик - 2.5 ₽/сек., 720p - 4 ₽/сек., 1080p черновик - 5 ₽/сек., 1080p - 8 ₽/сек.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Pruna P-Video 2 - быстрая модель для коротких роликов. Она оживляет одно изображение или снимает сцену с нуля по текстовому описанию. Длину ролика можно задать от 1 до 20 секунд, есть 720p и 1080p, а черновой режим позволяет дёшево проверить идею перед чистовым запуском.
Основные сценарии:
pruna_p_video_2_generation_type: "image", картинка становится первым кадром ролика.pruna_p_video_2_generation_type: "text", сцена строится только по заданию, соотношение сторон выбираете сами.Каждый вызов создаёт асинхронную операцию. После запуска сохраните id и проверяйте статус отдельным запросом.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Сценарий задаёт параметр pruna_p_video_2_generation_type:
image - видео из одного изображения (нужен image);text - видео из текста (можно указать aspect_ratio).{
"tool": "pruna-ai-p-video-2",
"input": {
"...": "..."
}
}
tool - slug нейросети, всегда "pruna-ai-p-video-2".input - параметры запуска. Все поля передаются прямо внутри этого объекта, без дополнительной вложенности.image нужна ссылка на картинку, для text - нет.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
pruna_p_video_2_generation_type | enum | Да | Сценарий. image - видео из изображения, text - видео из текста. Если поле не передать, используется image. |
prompt | string | Да | Что должно происходить в ролике: действие, движение камеры, стиль, настроение. От 3 до 4000 символов. |
prompt_upsampling | boolean | Нет | Автоматически расширить и уточнить задание перед генерацией. По умолчанию включено; выключите, если нужен буквальный результат по вашему тексту. |
image | string (url) | Да, для image | Ссылка на изображение, из которого делается ролик. Только в сценарии image. Один файл: jpg, jpeg, png или webp. |
aspect_ratio | enum | Нет | Соотношение сторон ролика. Только в сценарии text, если не указано - 16:9. Варианты: 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 1:1. В сценарии image пропорции берутся из картинки. |
duration | number | Да | Длительность ролика в секундах, целое число от 1 до 20. Если не указать, будет 5 секунд. |
resolution | enum | Да | Разрешение: 720p или 1080p. Если не указать - 720p. |
draft | boolean | Нет | Черновой режим: быстрее и дешевле, но качество ниже. По умолчанию выключен. |
save_audio | boolean | Нет | Сохранить звуковую дорожку в результате. По умолчанию включено; с false ролик приходит без звука. На цену не влияет. |
Ссылку в 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",
"input": {
"pruna_p_video_2_generation_type": "image",
"prompt": "Девушка опускает письмо в синий почтовый ящик, осенние листья падают, камера медленно приближается",
"image": "https://cdn.example.com/source-image-1.jpg",
"duration": 5,
"resolution": "720p",
"draft": false,
"save_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',
input: {
pruna_p_video_2_generation_type: 'image',
prompt:
'Девушка опускает письмо в синий почтовый ящик, осенние листья падают, камера медленно приближается',
image: 'https://cdn.example.com/source-image-1.jpg',
duration: 5,
resolution: '720p',
draft: false,
save_audio: true,
},
}),
})
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',
'input': {
'pruna_p_video_2_generation_type': 'image',
'prompt': 'Девушка опускает письмо в синий почтовый ящик, осенние листья падают, камера медленно приближается',
'image': 'https://cdn.example.com/source-image-1.jpg',
'duration': 5,
'resolution': '720p',
'draft': False,
'save_audio': True,
},
},
timeout=30,
)
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": "pruna-ai-p-video-2",
"input": {
"pruna_p_video_2_generation_type": "text",
"prompt": "Утренняя пекарня, пекарь достаёт из печи противень с круассанами, от выпечки поднимается пар, камера плавно отъезжает",
"prompt_upsampling": true,
"aspect_ratio": "9:16",
"duration": 5,
"resolution": "1080p",
"draft": 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',
input: {
pruna_p_video_2_generation_type: 'text',
prompt:
'Утренняя пекарня, пекарь достаёт из печи противень с круассанами, от выпечки поднимается пар, камера плавно отъезжает',
prompt_upsampling: true,
aspect_ratio: '9:16',
duration: 5,
resolution: '1080p',
draft: true,
},
}),
})
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',
'input': {
'pruna_p_video_2_generation_type': 'text',
'prompt': 'Утренняя пекарня, пекарь достаёт из печи противень с круассанами, от выпечки поднимается пар, камера плавно отъезжает',
'prompt_upsampling': True,
'aspect_ratio': '9:16',
'duration': 5,
'resolution': '1080p',
'draft': True,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "pruna-ai-p-video-2",
"cost": 20,
"balance_after": 480,
"created_at": "2026-09-30T12:46:04.412693+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "pruna-ai-p-video-2",
"cost": 20,
"created_at": "2026-09-30T12:46:04.412693+00:00",
"completed_at": "2026-09-30T12:46:28.479484+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/pruna-ai-p-video-2/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))
}
}
Обычно ролик готов за 30-60 секунд. Опрашивать одну операцию можно не чаще раза в секунду, разумный интервал - 5 секунд.
После завершения в result приходит одно видео:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/pruna-ai-p-video-2/video-1.mp4"
]
}
type - всегда "video".urls - массив с одной ссылкой на MP4.duration, звуковая дорожка есть, если save_audio не выключен. Пропорции в сценарии image повторяют исходную картинку (например, горизонтальный кадр в 720p приходит размером около 1280x704).Цена считается за секунду ролика: ставка зависит от разрешения и чернового режима, затем умножается на duration. Сценарий (image или text), улучшение задания и звук на цену не влияют.
| Разрешение | draft | За секунду | 1 сек. | 5 сек. | 20 сек. |
|---|---|---|---|---|---|
720p | true | 2,5 ₽ | 2,5 ₽ | 12,5 ₽ | 50 ₽ |
720p | false | 4 ₽ | 4 ₽ | 20 ₽ | 80 ₽ |
1080p | true | 5 ₽ | 5 ₽ | 25 ₽ | 100 ₽ |
1080p | false | 8 ₽ | 8 ₽ | 40 ₽ | 160 ₽ |
Самый дешёвый запуск - 1 секунда в 720p черновиком за 2,5 ₽. Стоимость может быть дробной, поле cost в ответе приходит числом, например 2.5. Полная сумма списывается при создании операции и видна в cost.
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую платную операцию. Если ответ на создание потерялся, не отправляйте запрос вслепую ещё раз.queued, результат забирайте через GET /api/v1/operations/{id}.image принимает только внешнюю http/https ссылку на jpg, jpeg, png или webp. Адреса localhost и внутренних сетей не принимаются. Файл должен открываться без авторизации.image передавайте ровно одно изображение: из него получается первый кадр, а пропорции ролика следуют за картинкой.aspect_ratio работает только в сценарии text, в сценарии image это поле игнорируется.draft: true, затем запустите тот же запрос в чистовом качестве.prompt_upsampling.