Перейти к основному контенту

P-Video 2 Pro reference-to-video собирает клип 5–15 секунд в 480p или 768p из до 3 референсных видео и 3 аудиофрагментов, которые в промпте называются video 1 и audio 1, плюс необязательные начальный и конечный кадры. Без контент-фильтра.

От $0.018/с

Рабочая область

Отправить запрос

Быстрый старт

Примеры используют публичные параметры выбранного эндпоинта. Замените API-ключ и примеры медиафайлов, затем отправьте запрос со своего сервера.

SDK и интеграции
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

Аутентификация API

Храните API-ключ в серверной переменной окружения SPICY_API_KEY. Используйте Bearer-аутентификацию и Content-Type: application/json для JSON-запросов.

Authorization: Bearer $SPICY_API_KEY
Пример результатаИспользовать пример
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $SPICY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
  -d '{
  "model": "pruna-ai/p-video-2-pro/reference-to-video",
  "input": {
    "aspect_ratio": "auto",
    "duration_seconds": 5,
    "generation_mode": "speed",
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "prompt_optimization_mode": "off",
    "resolution": "768p"
  }
}'

# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Пример построен по входной схеме этой модели — той же, по которой API проверяет каждый запрос.

Входные параметры

Поместите эти поля в объект input тела запроса. Имена и типы соответствуют API. Не предполагайте значение по умолчанию, если оно не задано.

promptstringОбязательно

Укажите, что взять из каждого референса. Пишите video 1, video 2 для референсных видео и audio 1, audio 2 для аудиофрагментов, по порядку загрузки.

По умолчанию
Не задано
Ограничения
minLength:1
seedintegerНеобязательно

Делает запуски сопоставимыми при изменении промпта. Не гарантирует покадрово одинаковый клип.

По умолчанию
Не задано
Ограничения
minimum:0
maximum:2147483647
prompt_optimization_modestringНеобязательно

off (по умолчанию) отправляет ваш промпт дословно; turbo и max позволяют сервису сначала его переписать. Цену не меняет.

По умолчанию
"off"
Допустимые значения
"off""turbo""max"
duration_secondsintegerНеобязательноВлияет на цену

Целые секунды от 5 до 15 (по умолчанию 5). Определяет цену.

По умолчанию
5
Ограничения
minimum:5
maximum:15
keep_reference_audiobooleanНеобязательно

По умолчанию выключено. Если включено, ваш аудиофрагмент используется как звуковая дорожка вместо генерации нового звука; нужен ровно один аудиофрагмент.

По умолчанию
false
generation_modestringНеобязательноВлияет на цену

cost (дешевле, немного медленнее) или speed (по умолчанию, быстрее при том же качестве).

По умолчанию
"speed"
Допустимые значения
"cost""speed"
resolutionstringНеобязательноВлияет на цену

480p или 768p (по умолчанию 768p). 768p стоит дороже за секунду.

По умолчанию
"768p"
Допустимые значения
"480p""768p"
aspect_ratiostringНеобязательно

auto (по умолчанию) подстраивается под референсы; или выберите 16:9, 9:16, 4:3, 3:4, 3:2, 2:3 или 1:1. Цену не меняет.

По умолчанию
"auto"
Допустимые значения
"auto""16:9""9:16""4:3""3:4""3:2""2:3""1:1"
reference_audio_urlsarray<string>НеобязательноВлияет на цену

До 3 аудиофрагментов, всего до 15 секунд, для голоса, диалога или музыки. Также требует начальный кадр или референсное видео. Добавляет фиксированную плату.

По умолчанию
Не задано
Ограничения
minItems:1
maxItems:3
reference_video_urlsarray<string>НеобязательноВлияет на цену

До 3 видео, каждое не короче 2 секунд и всего до 15 секунд, для движения, камеры и темпа. Их секунды оплачиваются плюс одна секунда на округление.

По умолчанию
Не задано
Ограничения
minItems:1
maxItems:3
last_image_urlstringНеобязательноВлияет на цену

Необязательный конечный кадр, на котором заканчивается клип. Добавляет небольшую плату.

По умолчанию
Не задано
Ограничения
format:"uri"
contentMediaType:["image/jpeg","image/png","image/webp","image/gif"]
image_urlstringНеобязательноВлияет на цену

Необязательный начальный кадр: кто и где начинается сцена. Добавляет небольшую плату.

По умолчанию
Не задано
Ограничения
format:"uri"
contentMediaType:["image/jpeg","image/png","image/webp","image/gif"]

Отследить задачу

HTTP 202 означает принятие задачи, а не завершение генерации. Сохраните полученный taskId и проверяйте эту задачу. Не создавайте новую, пока ждёте результат.

Ответ при приёме задачи
HTTP/1.1 202 Accepted
Location: /api/v1/jobs/recordInfo?taskId=job_01k3m8x9q2z4v7n5p6r8s0t1w3

{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_create",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued",
    "estimatedCost": "0.750000"
  }
}

В ответе о приёме есть оценка стоимости — приложение сможет показать ту же сумму в истории задач и в расчётах.

Получить задачу
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
  --data-urlencode "taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Начните с интервала около 2 секунд и постепенно увеличивайте его. Прекратите опрос при конечном состоянии. После сбоя соединения используйте исходный taskId. Повторно создавать задачу можно только с исходным ключом идемпотентности и исходным телом запроса.

Или пусть вызов придёт сам
import { verifyWebhook } from "@spicyapi/sdk";

// express.raw keeps the bytes we signed; express.json never matches.
app.post("/hooks/spicy", express.raw({ type: "application/json" }), (req, res) => {
  const { payload } = verifyWebhook({
    rawBody: req.body,
    timestamp: req.header("X-Webhook-Timestamp"),
    signature: req.header("X-Webhook-Signature"),
    payloadVersion: Number(req.header("X-Webhook-Payload-Version")),
    secret: process.env.SPICY_WEBHOOK_SECRET,
  });
  res.status(200).end();
  void handleFinishedTask(payload);
});

Передайте callBackUrl при создании задачи — готовая запись придёт к вам POST-запросом, и никакого опроса не понадобится. В каждой доставке есть X-Webhook-Timestamp, X-Webhook-Signature и X-Webhook-Payload-Version. Подпись — это HMAC-SHA256 в base64 от taskId.timestamp.sha256(body), поэтому проверять её нужно по исходным байтам: если разобрать JSON и сериализовать заново, байты изменятся и проверка не пройдёт. Неудачные доставки повторяются, так что один и тот же taskId может прийти дважды — сделайте обработчик идемпотентным. Сначала ответьте 2xx, работу выполняйте после: медленный обработчик считается неудачной доставкой.

Прочитать результат

Обрабатывайте output только при state, равном succeeded. При ошибке проверьте errorCode, errorMessage и request_id. Стоимость и состояния в примерах не являются фактическим счётом.

Пример ответа после завершения
{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_record",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "pruna-ai/p-video-2-pro/reference-to-video",
    "state": "succeeded",
    "output": {
      "assets": [
        {
          "key": "tasks/2026/08/28/job_01k3m8x9q2z4v7n5p6r8s0t1w3/3f7a1c9e5b2d48f0a6c1e3d5b7f9a1c3.mp4",
          "mime": "video/mp4",
          "url": "https://example.r2.cloudflarestorage.com/results/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.mp4?X-Amz-Signature=SIGNATURE_FROM_RESPONSE",
          "expiresAt": "2026-08-28T12:20:08.000Z"
        }
      ]
    },
    "cost": "0.750000",
    "settled": true,
    "createdAt": "2026-08-28T12:00:00Z",
    "completedAt": "2026-08-28T12:00:30Z"
  }
}

Доступные файлы можно открыть или скачать по assets[].url без заголовка API Authorization. Подписанная ссылка действует до expiresAt. Чтобы обновить её, повторно запросите задачу в течение срока хранения файла. У ожидающих или недоступных файлов URL отсутствует. Не передавайте подписанные ссылки посторонним.

SDK и интеграции

Используйте SpicyAPI в приложении, терминале, ИИ-ассистенте или визуальном процессе. Выберите руководство по настройке.

Использование в ComfyUI

Установите узлы SpicyAPI через ComfyUI Manager или командой ниже и найдите на холсте P-Video 2 Pro · Reference to Video. У узла те же параметры, что и на этой странице, а цена показывается до запуска.

cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi