Генерирует короткие видео по тексту, из одного изображения или из набора кадров - с плавными переходами и управлением сценами. Цена зависит от режима и разрешения: 720p - 7-8 ₽/сек., 1080p - 12-16 ₽/сек.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Pika 2.2 делает короткие ролики четырьмя способами. Можно оживить одну картинку, снять сцену только по тексту, собрать ролик из нескольких «ингредиентов» (персонаж, предмет, место) или задать ключевые кадры и описать переходы между ними. Последний режим, Pikaframes, удобен для роликов до 25 секунд с заранее известной раскадровкой: вы сами решаете, сколько длится каждый переход и что в нём происходит.
Основные сценарии:
pika_generation_type: "image_to_video", картинка становится первым кадром ролика.pika_generation_type: "text_to_video", сцена строится только по заданию.pika_generation_type: "scenes", модель собирает одну сцену из 2-5 картинок.pika_generation_type: "pikaframes", ролик проходит через 2-5 ключевых кадров.Каждый вызов создаёт асинхронную операцию. После запуска сохраните id и проверяйте статус отдельным запросом.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Сценарий задаёт параметр pika_generation_type:
image_to_video - видео из одного изображения (prompt, image_url);text_to_video - видео из текста (prompt, aspect_ratio);scenes - сцена из нескольких картинок (prompt, scenes_image_urls, ingredients_mode, aspect_ratio);pikaframes - ролик по ключевым кадрам (keyframes, transitions, pikaframes_duration_seconds).В первых трёх сценариях длительность задаёт duration_seconds_mode (5 или 10 секунд), в Pikaframes - pikaframes_duration_seconds (от 1 до 25 секунд).
{
"tool": "pika",
"input": {
"...": "..."
}
}
tool - slug нейросети, всегда "pika".input - параметры запуска. Все поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
pika_generation_type | enum | Да | Сценарий: image_to_video, text_to_video, pikaframes или scenes. Если поле не передать, используется image_to_video. |
prompt | string | Да, кроме pikaframes | Что происходит в ролике: действие, движение камеры, настроение. От 3 до 4000 символов. В Pikaframes вместо него - prompt_pikaframes и задания переходов. |
prompt_pikaframes | string | Нет | Общее задание для всех переходов Pikaframes. Используется для переходов, у которых нет своего prompt. До 4000 символов. |
image_url | string (url) | Да, для image_to_video | Изображение, из которого делается ролик. Только в image_to_video. Один файл: jpg, jpeg, png или webp. |
scenes_image_urls | string[] (url) | Да, для scenes | Картинки-ингредиенты для Scenes: персонаж, предмет, фон. От 2 до 5 ссылок на jpg, jpeg, png или webp. |
keyframes | object[] | Да, для pikaframes | Ключевые кадры по порядку, от 2 до 5 элементов. Каждый элемент - объект с полем image_url (string (url), обязательное): ссылка на jpg, jpeg, png или webp. |
transitions | object[] | Да, для pikaframes | Переходы между соседними кадрами, их на один меньше, чем кадров (от 1 до 4). Поля элемента: duration (number, обязательное) - длительность перехода в секундах, от 1 до 25; prompt (string, необязательное) - что происходит в этом переходе, до 4000 символов. Сумма всех duration должна равняться pikaframes_duration_seconds. |
aspect_ratio | enum | Нет | Соотношение сторон для text_to_video и scenes: 16:9, 9:16, 1:1, 4:5, 5:4, 3:2 или 2:3. Если не указать - 16:9. В остальных сценариях пропорции берутся из картинок. |
resolution | enum | Да | Разрешение: 720p или 1080p, во всех сценариях. Если не указать - 720p. |
duration_seconds_mode | enum | Да | Длительность для image_to_video, text_to_video и scenes, строкой: "5" или "10". Если не указать - "5". |
pikaframes_duration_seconds | number | Да, для pikaframes | Общая длительность ролика Pikaframes: целое число от 1 до 25 секунд. Должна совпадать с суммой длительностей переходов. Если не указать - 5. |
ingredients_mode | enum | Нет | Как собирать Scenes: precise - точнее сохранять объекты с картинок, creative - больше свободы модели. Если не указать - precise. |
use_negative_prompt | boolean | Нет | Включите, чтобы передать negative_prompt. Без него негативный промпт не используется. По умолчанию false. |
negative_prompt | string | Нет | Чего не должно быть в ролике, например blurry, text, watermark. До 4000 символов. Работает только вместе с use_negative_prompt: true. |
Ссылки на картинки передавайте как внешние http/https URL с расширением jpg, jpeg, png или webp. Файл должен открываться без авторизации. Модель принимает картинки до 8 МБ.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "pika",
"input": {
"pika_generation_type": "image_to_video",
"prompt": "Кот на подоконнике потягивается и зевает, за окном медленно падает снег, камера плавно приближается",
"image_url": "https://cdn.example.com/source-image-1.jpg",
"resolution": "720p",
"duration_seconds_mode": "5"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'pika',
input: {
pika_generation_type: 'image_to_video',
prompt: 'Кот на подоконнике потягивается и зевает, за окном медленно падает снег, камера плавно приближается',
image_url: 'https://cdn.example.com/source-image-1.jpg',
resolution: '720p',
duration_seconds_mode: '5',
},
}),
})
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': 'pika',
'input': {
'pika_generation_type': 'image_to_video',
'prompt': 'Кот на подоконнике потягивается и зевает, за окном медленно падает снег, камера плавно приближается',
'image_url': 'https://cdn.example.com/source-image-1.jpg',
'resolution': '720p',
'duration_seconds_mode': '5',
},
},
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": "pika",
"input": {
"pika_generation_type": "text_to_video",
"prompt": "Бумажный кораблик плывёт по весеннему ручью вдоль тротуара, солнечные блики на воде, съёмка с уровня воды",
"aspect_ratio": "9:16",
"resolution": "1080p",
"duration_seconds_mode": "5",
"use_negative_prompt": true,
"negative_prompt": "blurry, text, watermark, people"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'pika',
input: {
pika_generation_type: 'text_to_video',
prompt: 'Бумажный кораблик плывёт по весеннему ручью вдоль тротуара, солнечные блики на воде, съёмка с уровня воды',
aspect_ratio: '9:16',
resolution: '1080p',
duration_seconds_mode: '5',
use_negative_prompt: true,
negative_prompt: 'blurry, text, watermark, people',
},
}),
})
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': 'pika',
'input': {
'pika_generation_type': 'text_to_video',
'prompt': 'Бумажный кораблик плывёт по весеннему ручью вдоль тротуара, солнечные блики на воде, съёмка с уровня воды',
'aspect_ratio': '9:16',
'resolution': '1080p',
'duration_seconds_mode': '5',
'use_negative_prompt': True,
'negative_prompt': 'blurry, text, watermark, people',
},
},
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": "pika",
"input": {
"pika_generation_type": "scenes",
"prompt": "Девушка в красном пальто гуляет с корги по осеннему парку и бросает ему мяч",
"scenes_image_urls": [
"https://cdn.example.com/character-1.jpg",
"https://cdn.example.com/dog-1.png",
"https://cdn.example.com/park-1.webp"
],
"ingredients_mode": "precise",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration_seconds_mode": "10"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'pika',
input: {
pika_generation_type: 'scenes',
prompt: 'Девушка в красном пальто гуляет с корги по осеннему парку и бросает ему мяч',
scenes_image_urls: [
'https://cdn.example.com/character-1.jpg',
'https://cdn.example.com/dog-1.png',
'https://cdn.example.com/park-1.webp',
],
ingredients_mode: 'precise',
aspect_ratio: '16:9',
resolution: '720p',
duration_seconds_mode: '10',
},
}),
})
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': 'pika',
'input': {
'pika_generation_type': 'scenes',
'prompt': 'Девушка в красном пальто гуляет с корги по осеннему парку и бросает ему мяч',
'scenes_image_urls': [
'https://cdn.example.com/character-1.jpg',
'https://cdn.example.com/dog-1.png',
'https://cdn.example.com/park-1.webp',
],
'ingredients_mode': 'precise',
'aspect_ratio': '16:9',
'resolution': '720p',
'duration_seconds_mode': '10',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
В этом примере три кадра и два перехода: 3 секунды со своим заданием и 4 секунды с общим заданием из prompt_pikaframes. Сумма переходов, 7 секунд, совпадает с pikaframes_duration_seconds.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "pika",
"input": {
"pika_generation_type": "pikaframes",
"prompt_pikaframes": "Плавное кинематографичное движение камеры, тёплый вечерний свет",
"keyframes": [
{
"image_url": "https://cdn.example.com/keyframe-1.jpg"
},
{
"image_url": "https://cdn.example.com/keyframe-2.jpg"
},
{
"image_url": "https://cdn.example.com/keyframe-3.jpg"
}
],
"transitions": [
{
"duration": 3,
"prompt": "Камера пролетает через открытое окно в комнату"
},
{
"duration": 4
}
],
"pikaframes_duration_seconds": 7,
"resolution": "720p"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'pika',
input: {
pika_generation_type: 'pikaframes',
prompt_pikaframes: 'Плавное кинематографичное движение камеры, тёплый вечерний свет',
keyframes: [
{
image_url: 'https://cdn.example.com/keyframe-1.jpg',
},
{
image_url: 'https://cdn.example.com/keyframe-2.jpg',
},
{
image_url: 'https://cdn.example.com/keyframe-3.jpg',
},
],
transitions: [
{
duration: 3,
prompt: 'Камера пролетает через открытое окно в комнату',
},
{
duration: 4,
},
],
pikaframes_duration_seconds: 7,
resolution: '720p',
},
}),
})
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': 'pika',
'input': {
'pika_generation_type': 'pikaframes',
'prompt_pikaframes': 'Плавное кинематографичное движение камеры, тёплый вечерний свет',
'keyframes': [
{
'image_url': 'https://cdn.example.com/keyframe-1.jpg',
},
{
'image_url': 'https://cdn.example.com/keyframe-2.jpg',
},
{
'image_url': 'https://cdn.example.com/keyframe-3.jpg',
},
],
'transitions': [
{
'duration': 3,
'prompt': 'Камера пролетает через открытое окно в комнату',
},
{
'duration': 4,
},
],
'pikaframes_duration_seconds': 7,
'resolution': '720p',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "pika",
"cost": 56,
"balance_after": 944,
"created_at": "2026-09-30T19:51:19.499201+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "pika",
"cost": 56,
"created_at": "2026-09-30T19:51:19.499201+00:00",
"completed_at": "2026-09-30T19:56:30.291124+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/pika/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))
}
}
Pika работает неспешно: ролик Pikaframes на 5 секунд в пробном запуске был готов примерно через 5 минут. Одну операцию можно опрашивать не чаще раза в секунду, разумный интервал - 10 секунд.
После завершения в result приходит одно видео:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/pika/video-1.mp4"
]
}
type - всегда "video".urls - массив с одной ссылкой на MP4.resolution: в пробе 720p с горизонтальными кадрами дал ролик 1280x720.Цена зависит от сценария, разрешения и длительности. Соотношение сторон, режим Scenes и негативный промпт на цену не влияют.
Видео из изображения, из текста и Scenes - фиксированная цена за ролик:
| Длительность | 720p | 1080p |
|---|---|---|
| 5 сек. | 35 ₽ | 70 ₽ |
| 10 сек. | 80 ₽ | 160 ₽ |
Pikaframes - за секунду ролика, но не меньше чем за 5 секунд:
| Разрешение | За секунду | 1-5 сек. | 7 сек. | 10 сек. | 25 сек. |
|---|---|---|---|---|---|
720p | 8 ₽ | 40 ₽ | 56 ₽ | 80 ₽ | 200 ₽ |
1080p | 12 ₽ | 60 ₽ | 84 ₽ | 120 ₽ | 300 ₽ |
Самый дешёвый запуск - 5 секунд в 720p за 35 ₽. Ролик Pikaframes короче 5 секунд стоит как пятисекундный. Полная сумма списывается при создании операции и видна в поле cost.
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую платную операцию. Если ответ на создание потерялся, не отправляйте запрос вслепую ещё раз.queued, результат забирайте через GET /api/v1/operations/{id}.http/https URL на jpg, jpeg, png или webp. Адреса localhost и внутренних сетей не принимаются.failed с сообщением о превышении размера. Перед отправкой уменьшайте тяжёлые фото.duration_seconds_mode передаётся строкой ("5", а не 5), а pikaframes_duration_seconds - целым числом. Неверный тип или дробное значение вернёт 400 validation_error.pikaframes_duration_seconds, иначе API ответит 400 validation_error. Переходов должно быть ровно на один меньше, чем ключевых кадров.ingredients_mode: "precise" модель старается не менять их внешний вид.