Przejdź do treści głównej

P-Video 2 Pro wideo z referencji buduje klip 5-15 sekund w 480p lub 768p z do 3 filmów referencyjnych i 3 nagrań audio, nazwanych w prompcie jako video 1 i audio 1, a także z opcjonalnej klatki otwierającej i zamykającej. Bez filtra treści.

Od $0.018/s

Obszar roboczy

Wyślij żądanie

Szybki start

Przykłady korzystają z publicznych definicji parametrów wybranego endpointu. Podmień klucz API i przykładowe media, a potem wyślij żądanie ze swojego serwera.

SDK i integracje
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

Uwierzytelnianie API

Klucz API trzymaj w zmiennej środowiskowej serwera SPICY_API_KEY. Dla żądań JSON używaj uwierzytelniania Bearer i Content-Type: application/json.

Authorization: Bearer $SPICY_API_KEY
Przykładowy wynikUżyj tego przykładu
# 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"

Wygenerowane ze schematu wejścia tego modelu – tego samego, względem którego API waliduje każde żądanie.

Parametry wejściowe

Te pola umieść w obiekcie input w ciele żądania. Nazwy i typy odpowiadają API. Gdy wartości domyślnej nie podano, nie zakładaj żadnej.

promptstringWymagane

Napisz, co wziąć z każdej referencji. Pisz video 1, video 2 dla filmów referencyjnych i audio 1, audio 2 dla nagrań audio, numerując je w kolejności wgrywania.

Domyślnie
Nie określono
Ograniczenia
minLength:1
seedintegerOpcjonalne

Pozwala porównywać przebiegi, gdy zmieniasz prompt. Nie gwarantuje klipu identycznego klatka w klatkę.

Domyślnie
Nie określono
Ograniczenia
minimum:0
maximum:2147483647
prompt_optimization_modestringOpcjonalne

off (domyślnie) wysyła prompt słowo w słowo; turbo i max pozwalają usłudze najpierw go przepisać. Nie zmienia ceny.

Domyślnie
"off"
Dozwolone wartości
"off""turbo""max"
duration_secondsintegerOpcjonalneWpływa na cenę

Pełne sekundy, od 5 do 15 (domyślnie 5). Wpływa na cenę.

Domyślnie
5
Ograniczenia
minimum:5
maximum:15
keep_reference_audiobooleanOpcjonalne

Domyślnie wyłączone. Po włączeniu twoje nagranie staje się ścieżką dźwiękową zamiast generowania nowego dźwięku; wymaga dokładnie jednego nagrania audio.

Domyślnie
false
generation_modestringOpcjonalneWpływa na cenę

cost (tańszy, trochę wolniejszy) albo speed (domyślny, szybszy przy tej samej jakości).

Domyślnie
"speed"
Dozwolone wartości
"cost""speed"
resolutionstringOpcjonalneWpływa na cenę

480p lub 768p (domyślnie 768p). 768p kosztuje więcej za sekundę.

Domyślnie
"768p"
Dozwolone wartości
"480p""768p"
aspect_ratiostringOpcjonalne

auto (domyślnie) dostosowuje się do referencji; możesz też wybrać 16:9, 9:16, 4:3, 3:4, 3:2, 2:3 albo 1:1. Nie zmienia ceny.

Domyślnie
"auto"
Dozwolone wartości
"auto""16:9""9:16""4:3""3:4""3:2""2:3""1:1"
reference_audio_urlsarray<string>OpcjonalneWpływa na cenę

Do 3 nagrań audio, łącznie 15 sekund, na głos, dialog lub muzykę. Wymaga też klatki otwierającej lub wideo referencyjnego. Dolicza stałą opłatę.

Domyślnie
Nie określono
Ograniczenia
minItems:1
maxItems:3
reference_video_urlsarray<string>OpcjonalneWpływa na cenę

Do 3 filmów, każdy co najmniej 2 sekundy i łącznie 15 sekund, na ruch, kamerę i tempo. Ich sekundy są rozliczane, plus jedna sekunda na zaokrąglenie.

Domyślnie
Nie określono
Ograniczenia
minItems:1
maxItems:3
last_image_urlstringOpcjonalneWpływa na cenę

Opcjonalna klatka zamykająca, na której kończy się klip. Dolicza niewielką opłatę.

Domyślnie
Nie określono
Ograniczenia
format:"uri"
contentMediaType:["image/jpeg","image/png","image/webp","image/gif"]
image_urlstringOpcjonalneWpływa na cenę

Opcjonalna klatka otwierająca: kto i gdzie zaczyna się ujęcie. Dolicza niewielką opłatę.

Domyślnie
Nie określono
Ograniczenia
format:"uri"
contentMediaType:["image/jpeg","image/png","image/webp","image/gif"]

Śledź zadanie

HTTP 202 oznacza, że zadanie zostało przyjęte, a nie ukończone. Zapisz zwrócone taskId i odpytuj właśnie to zadanie. Nie twórz kolejnego zadania, czekając na jego wynik.

Odpowiedź o przyjęciu
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"
  }
}

Odpowiedź o przyjęciu zawiera szacunek, dzięki czemu twoja aplikacja pokaże tę samą kwotę w historii zadań i w rozliczeniach.

Odczytaj zadanie
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
  --data-urlencode "taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Zacznij odpytywać mniej więcej co 2 sekundy i stopniowo wydłużaj odstęp. Zatrzymaj się na stanie końcowym. Po zerwaniu połączenia odpytaj pierwotne taskId. Tworzenie ponawiaj wyłącznie z pierwotnym kluczem idempotentności i pierwotnym ciałem żądania.

Albo odbierz wynik przez callback
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);
});

Podaj callBackUrl przy tworzeniu zadania, a gotowy rekord przyjdzie do ciebie metodą POST – bez żadnej pętli odpytywania. Każda dostawa niesie X-Webhook-Timestamp, X-Webhook-Signature i X-Webhook-Payload-Version. Podpis to HMAC-SHA256 w base64 z taskId.timestamp.sha256(body), więc trzeba go sprawdzać na surowych bajtach: sparsowanie JSON-a i ponowne zserializowanie zmienia je i weryfikacja się nie powiedzie. Nieudane dostawy są ponawiane, więc to samo taskId może przyjść dwa razy – zrób obsługę idempotentną. Najpierw odpowiedz kodem 2xx, a pracę wykonaj potem; wolna obsługa jest traktowana jak nieudana dostawa.

Odczytaj wynik

Wynik wykorzystuj dopiero przy stanie succeeded. Przy niepowodzeniu skorzystaj z errorCode, errorMessage i request_id. Przykładowe koszty i stany nie odpowiadają rzeczywistemu rozliczeniu.

Przykład odpowiedzi po zakończeniu
{
  "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"
  }
}

Każdy dostępny materiał otwieraj lub pobieraj bezpośrednio spod assets[].url, bez nagłówka Authorization. Podpisany adres wygasa o expiresAt; odpytaj zadanie ponownie, żeby go odświeżyć, dopóki materiał mieści się w okresie przechowywania. Materiał oczekujący lub niedostępny nie ma adresu. Podpisane adresy traktuj jako prywatne.

SDK i integracje

Korzystaj ze SpicyAPI w aplikacji, terminalu, asystencie AI lub wizualnym przepływie pracy. Wybierz instrukcję konfiguracji.

Użyj w ComfyUI

Zainstaluj węzły SpicyAPI przez ComfyUI Manager albo poleceniem poniżej, a potem wyszukaj na płótnie P-Video 2 Pro · Reference to Video. Węzeł ma te same opcje co ta strona i pokazuje cenę, zanim ruszy.

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