seedintegerOpcjonalneOd 0 do 2147483647. Trzymaj go na stałe, gdy dobierasz rozdzielczość albo czas trwania, inaczej każde powtórzenie zmienia dwie rzeczy naraz.
- Domyślnie
- Nie określono
- Ograniczenia
- minimum:0maximum:2147483647
alibaba/wan-3.0-pro-prime/reference-to-videoWan 3.0 Pro Prime reference-to-video blokuje twarz, strój, scenografię, ruch lub głos dzięki maks. 10 obrazom, 5 wideo i 5 plikom audio. Renderuje 2–30 sekund w 1080p, 2K lub 4K, a wyższe poziomy są powiększane z 1080p.
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 integracjehttps://api.spicyapi.ai/api/v1/jobs/createTaskKlucz 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# 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": "alibaba/wan-3.0-pro-prime/reference-to-video",
"input": {
"aspect_ratio": "adaptive",
"duration_seconds": 5,
"reference_image_urls": [
"https://example.com/reference.png"
],
"resolution": "1080p"
}
}'
# 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.
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.
Ten model ma zależności między polami. Pola oznaczone jako wymagane warunkowo zależą od innych danych wejściowych; reguły znajdziesz w pełnym JSON Schema poniżej.
seedintegerOpcjonalneOd 0 do 2147483647. Trzymaj go na stałe, gdy dobierasz rozdzielczość albo czas trwania, inaczej każde powtórzenie zmienia dwie rzeczy naraz.
enable_prompt_expansionbooleanOpcjonalneW tej rodzinie domyślnie włączone. Uzupełnia ubogie briefy i przepisuje szczegółowe, więc wyłącz je, gdy prompt jest już precyzyjnym opisem ujęcia. Plik referencyjny lub link do strony wymagają, by było włączone: przy dołączaniu reference_file_url albo reference_link_url zostaw je nieustawione lub ustaw true, bo dokument lub strona są czytane właśnie na tym etapie. Jawne false razem z plikiem lub linkiem zostanie odrzucone.
generate_audiobooleanOpcjonalneDomyślnie włączone. Dźwięk powstaje razem z obrazem i trafia do tego samego pliku. Ustaw false, kiedy muzykę do spotu pisze kompozytor.
duration_secondsintegerOpcjonalneWpływa na cenęDowolna liczba całkowita od 2 do 30, domyślnie 5, albo -1 dla trybu inteligentnego czasu trwania, który rezerwuje maksimum i rozlicza faktycznie dostarczoną długość. Przy wideo referencyjnych ich suma razem z wynikiem musi zmieścić się w 30 sekundach, a oba są rozliczane. Znajdź ujęcie przy 5 sekundach i 1080p, zanim zamówisz długi render w 4K.
-123456789101112131415161718192021222324252627282930aspect_ratiostringOpcjonalne16:9, 4:3, 1:1, 3:4, 9:16 albo adaptive. Domyślnie adaptive, czyli wybór po stronie modelu; podaj konkretne proporcje, kiedy format dostawy jest ustalony.
"16:9""4:3""1:1""3:4""9:16""adaptive"resolutionstringOpcjonalneWpływa na cenę1080p, 2k lub 4k, domyślnie 1080p. Natywny render Wan 3.0 Prime sięga najwyżej 1080p, więc progi powyżej — 2k i 4k — powstają przez powiększenie tego renderu, a nie przez natywne renderowanie w tym rozmiarze: dodatkowe piksele biorą się z powiększenia i nigdy nie są lepsze niż render pod spodem. Nie ma tu progu 480p ani 720p; do tych rozmiarów użyj Wan 3.0 lub Wan 3.0 Prime.
"1080p""2k""4k"reference_link_urlstringWymagane warunkowoJedna publiczna strona internetowa, którą model czyta jako materiał referencyjny, na przykład artykuł, strona produktu albo profil postaci. Musi otwierać się bez logowania. Niektóre serwisy blokują automatyczne czytniki, a strony z bardzo małą ilością tekstu nie da się użyć; w obu przypadkach zadanie kończy się błędem z informacją, że adresu URL nie udało się odczytać, a nieudane zadania nie są płatne. Nie razem z reference_file_url; jeśli enable_prompt_expansion nie jest ustawione, dołączenie linku również włącza rozszerzanie promptu. Linki nie są płatne.
reference_file_urlstringWymagane warunkowoJeden dokument, który model czyta, zanim wyreżyseruje ujęcie: karta postaci, scenariusz, lista ujęć albo brief produktu. PDF, DOCX, DOC, TXT, MD, PPTX, PPT, XLSX, XLS, KEY, PAGES lub NUMBERS, do 100 MB i 50 stron. Działa samodzielnie albo razem z obrazami, wideo i audio referencyjnym, ale nie razem z reference_link_url. Jeśli enable_prompt_expansion nie jest ustawione, dołączenie pliku włącza rozszerzanie promptu dla tego żądania, bo dokument jest czytany właśnie na tym etapie. Pliki nie są płatne.
reference_audio_urlsarray<string>Wymagane warunkowoDo 5 klipów, każdy od 1 do 15 sekund i łącznie 15 sekund – głos, sposób podania kwestii albo ton pomieszczenia, do którego ujęcie ma pasować. Audio referencyjne nie jest rozliczane. WAV lub MP3, do 15 MB na klip. Podobnie jak przy wideo, limity są sprawdzane w trakcie generowania, a nie przy przyjęciu zadania.
reference_video_urlsarray<string>Wymagane warunkowoWpływa na cenęDo 5 klipów, każdy od 1 do 15 sekund i łącznie 15 sekund. Używaj ich do ruchu i stylu kamery, a nie do twarzy. Ich długość jest rozliczana razem z wyjściem, a wideo referencyjne plus wyjście muszą zmieścić się w 30 sekundach. MP4 lub MOV, co najmniej 16 kl./s, od 240 do 4096 px na bok, proporcje nie szersze niż 8:1, do 100 MB na klip. Te limity są sprawdzane w trakcie generowania, a nie przy przyjęciu zadania, więc sprawdź długość klipów przed wysłaniem.
reference_image_urlsarray<string>Wymagane warunkowoOd 1 do 10 obrazów jako plansze tożsamości, garderoby i scenografii. Nazwij każdy w prompcie – postać, ubranie, scenografia – inaczej zostaną uśrednione. Obrazy referencyjne nie są rozliczane. JPEG, PNG bez przezroczystości, BMP lub WEBP; od 240 do 8000 px na bok, proporcje nie szersze niż 8:1, najwyżej 20 MB na plik.
promptstringOpcjonalneOpcjonalny, ale to właśnie tutaj referencje odróżnia się od siebie – która plansza jest którą postacią, po co jest wideo, po co audio – i to tutaj podaje się działanie.
{
"additionalProperties": false,
"anyOf": [
{
"required": [
"reference_image_urls"
]
},
{
"required": [
"reference_video_urls"
]
},
{
"required": [
"reference_audio_urls"
]
},
{
"required": [
"reference_file_url"
]
},
{
"required": [
"reference_link_url"
]
}
],
"properties": {
"aspect_ratio": {
"default": "adaptive",
"description": "Output aspect ratio; adaptive follows the input media and the intent.",
"enum": [
"16:9",
"4:3",
"1:1",
"3:4",
"9:16",
"adaptive"
],
"type": "string",
"x-ui": {
"order": 60,
"widget": "select"
}
},
"duration_seconds": {
"default": 5,
"description": "Output duration in seconds. Pass -1 for smart duration: the model picks the length from the prompt and any input media instead of a fixed number. With reference videos, their total length plus the output length must not exceed 30 seconds, and the reference video seconds are billed together with the output seconds.",
"enum": [
-1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30
],
"type": "integer",
"x-ui": {
"affects_price": true,
"enum_labels": {
"-1": "Smart"
},
"order": 50,
"widget": "slider"
}
},
"enable_prompt_expansion": {
"default": true,
"description": "Expand the prompt before generation.",
"type": "boolean",
"x-ui": {
"order": 30,
"widget": "switch"
}
},
"generate_audio": {
"default": true,
"description": "Include an audio track in the output.",
"type": "boolean",
"x-ui": {
"order": 40,
"widget": "switch"
}
},
"prompt": {
"description": "Describe the subject, motion and camera.",
"maxLength": 20000,
"minLength": 1,
"type": "string",
"x-ui": {
"order": 100,
"reference_tokens": {
"reference_audio_urls": "Audio {index}",
"reference_image_urls": "Image {index}",
"reference_video_urls": "Video {index}"
},
"widget": "textarea"
}
},
"reference_audio_urls": {
"description": "Reference audio, up to 5 clips of 1 to 15 seconds each and 15 seconds in total.",
"items": {
"contentMediaType": [
"audio/mpeg",
"audio/wav"
],
"format": "uri",
"type": "string"
},
"maxItems": 5,
"minItems": 1,
"type": "array",
"x-ui": {
"max_total_duration_seconds": 15,
"order": 86,
"widget": "multi-upload"
}
},
"reference_file_url": {
"contentMediaType": [
"application/pdf",
"application/msword",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"application/vnd.ms-excel",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"application/vnd.ms-powerpoint",
"application/vnd.openxmlformats-officedocument.presentationml.presentation",
"application/vnd.apple.keynote",
"application/vnd.apple.pages",
"application/vnd.apple.numbers",
"text/plain",
"text/markdown"
],
"description": "One reference document (PDF, DOCX, TXT, MD and similar) that the model reads for characters, wardrobe, setting and action.",
"format": "uri",
"type": "string",
"x-ui": {
"order": 76,
"widget": "upload"
}
},
"reference_image_urls": {
"description": "Ordered reference images used to guide the scene.",
"items": {
"contentMediaType": [
"image/jpeg",
"image/png",
"image/webp",
"image/gif"
],
"format": "uri",
"type": "string"
},
"maxItems": 10,
"minItems": 1,
"type": "array",
"x-ui": {
"order": 90,
"primary": true,
"widget": "multi-upload"
}
},
"reference_link_url": {
"description": "One public web page the model reads for reference. It must open without a login.",
"format": "uri",
"type": "string",
"x-ui": {
"order": 74,
"placeholder": "https://",
"widget": "text"
}
},
"reference_video_urls": {
"description": "Reference videos, up to 5 clips of 1 to 15 seconds each and 15 seconds in total.",
"items": {
"contentMediaType": [
"video/mp4",
"video/webm",
"video/quicktime"
],
"format": "uri",
"type": "string"
},
"maxItems": 5,
"minItems": 1,
"type": "array",
"x-ui": {
"affects_price": true,
"max_total_duration_seconds": 15,
"order": 88,
"widget": "multi-upload"
}
},
"resolution": {
"default": "1080p",
"description": "Output resolution tier. A native Wan 3.0 Prime render tops out at 1080p; 2k and 4k are enlarged from that render, not rendered natively.",
"enum": [
"1080p",
"2k",
"4k"
],
"type": "string",
"x-ui": {
"affects_price": true,
"order": 70,
"widget": "radio"
}
},
"seed": {
"description": "Random seed. Omit for a generated seed.",
"maximum": 2147483647,
"minimum": 0,
"type": "integer",
"x-ui": {
"order": 10,
"widget": "number"
}
}
},
"type": "object",
"x-pricing": {
"billingMode": "duration_capped",
"variantFields": [
"resolution"
]
}
}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.
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.
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.
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.
Wynik wykorzystuj dopiero przy stanie succeeded. Przy niepowodzeniu skorzystaj z errorCode, errorMessage i request_id. Przykładowe koszty i stany nie odpowiadają rzeczywistemu rozliczeniu.
{
"code": 200,
"msg": "success",
"request_id": "req_example_record",
"data": {
"taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
"model": "alibaba/wan-3.0-pro-prime/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.
Korzystaj ze SpicyAPI w aplikacji, terminalu, asystencie AI lub wizualnym przepływie pracy. Wybierz instrukcję konfiguracji.
Nie musisz pisać żadnego z powyższych fragmentów kodu. Wystarczy raz podłączyć serwer MCP, a każdy agent obsługujący MCP — Claude Code, Codex, Cursor, Windsurf, VS Code, Gemini CLI, Cline, LibreChat — może uruchomić ten model po nazwie. Można go też wywołać z powłoki jednym poleceniem.
Użyj alibaba/wan-3.0-pro-prime/reference-to-video, żeby zrobić pięciosekundowe ujęcie dachu w neonach o zmierzchu, z powolnym najazdem, i zapisz je do ./out/.
Agent znajduje model w aktualnym katalogu, sam wysyła plik lokalny, a potem pokazuje dokładną wycenę wraz z maksymalną opłatą i czeka na twoje potwierdzenie. Nic nie zostaje naliczone, dopóki nie zgodzisz się wprost.
claude mcp add spicyapi -e SPICY_API_KEY=$SPICY_API_KEY \
-- npx --yes --package=@spicyapi/mcp spicyapi-mcp
npx skills add spicyapi-ai/spicy-skillPierwsza linia daje agentowi narzędzia; druga daje mu Skill, czyli reguły ich używania: najpierw wycena, potem opłata, wysyłanie plików lokalnych zamiast wklejania bajtów i odczyt gotowego adresu materiału zamiast zgadywania. Każdy inny klient podłącza ten sam serwer przez własny plik konfiguracyjny – zobacz centrum dla deweloperów.
npx @spicyapi/cli tasks create --model alibaba/wan-3.0-pro-prime/reference-to-video \
--input-json '{"aspect_ratio":"adaptive","duration_seconds":5,"reference_image_urls":["https://example.com/reference.png"],"resolution":"1080p"}' \
--waitWejściem jest własny schemat tego endpointu, ten sam co w przykładach powyżej. --wait odpytuje aż do zakończenia zadania i wypisuje wynik; dodaj --yes, żeby pominąć pytanie o potwierdzenie w CI. Najpierw ustaw SPICY_API_KEY – jeden klucz działa w API, w CLI i na serwerze MCP.
npx @spicyapi/cli tasks create --model alibaba/wan-3.0-pro-prime/reference-to-video \
--input-json '{…}' --retention 1h --wait
npx @spicyapi/cli tasks get $TASK_ID # read back the retention that applied--retention potrafi wyłącznie skrócić okno – 30m, 1h, 7d albo 0, żeby usunąć zaraz po osiągnięciu przez zadanie stanu końcowego. Obowiązuje najkrótsza z trzech wartości: twojego żądania, ustawień konta i maksimum platformy, więc odczytaj ją z rekordu zadania, zamiast zakładać, że podana liczba zadziałała. Podanie okna dłuższego, niż pozwala konto, nic nie zmienia.
Zainstaluj węzły SpicyAPI przez ComfyUI Manager albo poleceniem poniżej, a potem wyszukaj na płótnie Wan 3.0 Pro Prime · 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-spicyapiOsadzony panel czyta ten sam schemat co ta strona, więc nie może się od API rozjechać. Jeśli twoja dokumentacja potrzebuje treści przeszukiwalnej, pobierz JSON spod /api/embed/models/ i wyrenderuj go samodzielnie.
<iframe src="https://spicyapi.ai/embed/pl/models/wan-3-0-pro-prime/api?model=alibaba%2Fwan-3.0-pro-prime%2Freference-to-video" width="100%" height="560" loading="lazy" title="Przykładowe żądanie" style="border:1px solid rgba(0,0,0,.12)"></iframe>