Анимирует загруженное изображение по движению из исходного видео и собирает готовый клип, при желании сохраняя звук. Цена зависит от разрешения: 720p - 5 ₽/сек., 1080p - 9 ₽/сек.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Pruna P-Video Animate переносит движение из готового видео на человека или персонажа с картинки. Вы даёте фото и ролик-образец, а модель собирает новый клип: персонаж с фото повторяет позы, жесты и мимику из исходного видео. Звук исходного ролика можно оставить.
Где это используют:
Исходное видео - от 1 до 20 секунд, результат примерно той же длины. Каждый вызов создаёт асинхронную операцию: сразу приходит id, готовое видео забирается проверкой статуса.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Сценарий один: в image передаётся фото персонажа, в video - ролик с движением. Дополнительно можно выбрать разрешение, частоту кадров, оставить или убрать звук и уточнить результат текстовым заданием.
{
"tool": "pruna-ai-p-video-animate",
"input": {
"image": "https://cdn.example.com/source-image-1.jpg",
"video": "https://cdn.example.com/source-video-1.mp4",
"resolution": "720p"
}
}
tool - slug нейросети, всегда "pruna-ai-p-video-animate".input - параметры запуска. Поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
image | string (url) | Да | Фото персонажа, которого нужно анимировать. Один файл .jpg, .jpeg, .png или .webp. Лучше всего подходит кадр, где человек виден так же, как в видео: если в ролике он в полный рост, дайте фото в полный рост. |
video | string (url) | Да | Видео с движением, которое нужно перенести. Один файл .mp4, .mov или .webm, длительность от 1 до 20 секунд. |
prompt | string | Нет | Уточнение к результату: что делает персонаж, какой фон, свет, настроение. До 5000 символов. Можно не передавать - тогда модель просто переносит движение. |
resolution | enum | Да | Разрешение результата: 720p или 1080p. Если поле не передать, будет 720p. От разрешения зависит цена. |
fps | enum | Да | Частота кадров результата: original - как в исходном видео, 24 - 24 кадра в секунду, 48 - 48 кадров в секунду. Если поле не передать, будет original. На цену не влияет. |
save_audio | boolean | Нет | Оставить звуковую дорожку исходного видео. По умолчанию true. С false результат приходит без звука. На цену не влияет. |
Ссылки в image и video - только внешние http/https URL с указанными расширениями. Файл должен открываться без авторизации и весить не больше 128 МБ.
Самый простой вызов: фото, видео и разрешение. Частота кадров останется как в исходном ролике, звук сохранится.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "pruna-ai-p-video-animate",
"input": {
"image": "https://cdn.example.com/source-image-1.jpg",
"video": "https://cdn.example.com/source-video-1.mp4",
"resolution": "720p",
"fps": "original",
"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-animate',
input: {
image: 'https://cdn.example.com/source-image-1.jpg',
video: 'https://cdn.example.com/source-video-1.mp4',
resolution: '720p',
fps: 'original',
save_audio: true,
},
}),
})
const data = await response.json()
console.log(data.id, data.status, data.cost)
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-animate',
'input': {
'image': 'https://cdn.example.com/source-image-1.jpg',
'video': 'https://cdn.example.com/source-video-1.mp4',
'resolution': '720p',
'fps': 'original',
'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-animate",
"input": {
"prompt": "Женщина с фото танцует на светлой кухне, точно повторяя движения из видео, мягкий дневной свет",
"image": "https://cdn.example.com/source-image-1.png",
"video": "https://cdn.example.com/source-video-1.mov",
"resolution": "1080p",
"fps": "48",
"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-animate',
input: {
prompt:
'Женщина с фото танцует на светлой кухне, точно повторяя движения из видео, мягкий дневной свет',
image: 'https://cdn.example.com/source-image-1.png',
video: 'https://cdn.example.com/source-video-1.mov',
resolution: '1080p',
fps: '48',
save_audio: false,
},
}),
})
const data = await response.json()
console.log(data.id, data.status, data.cost)
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-animate',
'input': {
'prompt': 'Женщина с фото танцует на светлой кухне, точно повторяя движения из видео, мягкий дневной свет',
'image': 'https://cdn.example.com/source-image-1.png',
'video': 'https://cdn.example.com/source-video-1.mov',
'resolution': '1080p',
'fps': '48',
'save_audio': False,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "pruna-ai-p-video-animate",
"cost": 25,
"balance_after": 475,
"created_at": "2026-10-01T09:32:19.045566+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "pruna-ai-p-video-animate",
"cost": 25,
"created_at": "2026-10-01T09:32:19.045566+00:00",
"completed_at": "2026-10-01T09:33:18.681641+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/pruna-ai-p-video-animate/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))
}
}
Пятисекундный ролик в 720p обычно готов примерно за минуту. Опрашивать одну операцию можно не чаще раза в секунду, разумный интервал - 5 секунд.
После завершения в result приходит одно видео:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/pruna-ai-p-video-animate/video-1.mp4"
]
}
type - всегда "video".urls - массив с одной ссылкой на MP4.720p дал ролик 896x1152, хотя исходное видео было горизонтальным.save_audio не выключен.Цена считается за каждую секунду исходного видео и зависит только от разрешения:
| Разрешение | За секунду | 1 сек. | 5 сек. | 10 сек. | 20 сек. (максимум) |
|---|---|---|---|---|---|
720p | 5 ₽ | 5 ₽ | 25 ₽ | 50 ₽ | 100 ₽ |
1080p | 9 ₽ | 9 ₽ | 45 ₽ | 90 ₽ | 180 ₽ |
video и округляет вверх до целой секунды: ролик на 4,2 секунды оплачивается как 5 секунд.cost.POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую платную операцию. Если ответ на создание потерялся, не отправляйте запрос вслепую ещё раз.queued, результат забирайте через GET /api/v1/operations/{id}.image и video принимают только внешние http/https ссылки. Адреса localhost и внутренних сетей не принимаются, файл должен открываться без авторизации.validation_error, операция не создастся и деньги не спишутся. Длинную запись разрежьте на куски до 20 секунд.