seedintegerFacoltativoDa 0 a 2147483647. Tienilo fisso per confrontare un campo modificato alla volta; toglilo quando vuoi varietà.
- Predefinito
- Non specificato
- Vincoli
- minimum:0maximum:2147483647
alibaba/wan-3.0/reference-to-videoIl reference-to-video Wan 3.0 di Alibaba mantiene coerenti identità, abiti, luogo o voce con fino a 10 immagini, 5 video e 5 file audio. Restituisce 2–30 secondi da 480p a 1080p e il prompt è facoltativo.
Gli esempi usano le definizioni pubbliche dei parametri dell’endpoint selezionato. Sostituisci la chiave API e i media di esempio, poi invia la richiesta dal tuo server.
SDK e integrazionihttps://api.spicyapi.ai/api/v1/jobs/createTaskTieni la chiave API nella variabile d’ambiente del server SPICY_API_KEY. Per le richieste JSON usa l’autenticazione Bearer e 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/reference-to-video",
"input": {
"aspect_ratio": "16:9",
"duration_seconds": 5,
"prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
"reference_image_urls": [
"https://example.com/reference.png"
],
"resolution": "720p"
}
}'
# 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"Generato dallo schema di input di questo modello, lo stesso su cui l’API valida ogni richiesta.
Metti questi campi dentro l’oggetto input del corpo della richiesta. Nomi e tipi corrispondono all’API. Quando un valore predefinito non è indicato, non darlo per scontato.
Questo modello ha dipendenze tra i campi. I campi segnati come obbligatori a certe condizioni dipendono da altri input; le regole sono nel JSON Schema completo qui sotto.
seedintegerFacoltativoDa 0 a 2147483647. Tienilo fisso per confrontare un campo modificato alla volta; toglilo quando vuoi varietà.
enable_prompt_expansionbooleanFacoltativoDisattivato per impostazione predefinita. Quando è attivo, il prompt viene riscritto prima della generazione: aiuta i brief scarni e ti ostacola su quelli dettagliati. Se non lo imposti e alleghi reference_file_url o reference_link_url, si attiva per quella richiesta, perché il documento o la pagina vengono letti in questo passaggio. Se lo imposti esplicitamente a false, il file o la pagina vengono letti lo stesso, senza riscrivere il prompt.
generate_audiobooleanFacoltativoAttivo per impostazione predefinita. Il clip torna con il suono già agganciato all'immagine. Imposta false quando musichi l'inquadratura per conto tuo.
duration_secondsintegerFacoltativoIncide sul prezzoQualsiasi numero intero da 2 a 30, oppure -1 per la durata intelligente. Il valore predefinito è 5. Con i video di riferimento, la loro durata complessiva più questo valore deve restare entro 30 secondi, e quei secondi vengono fatturati in aggiunta all'output. Metti a punto l'estetica a 5 secondi prima di allungare.
-123456789101112131415161718192021222324252627282930resolutionstringFacoltativoIncide sul prezzo480p, 720p o 1080p. Il valore predefinito è 720p. La risoluzione cambia sia il prezzo sia il tempo che l'attività impiega a tornare.
"480p""720p""1080p"enable_thinkingbooleanFacoltativoFa ragionare il modello sulla richiesta e sul materiale di riferimento prima di generare. Aiuta con documenti corposi, pagine web e immagini di riferimento complesse, e rende l’esecuzione più lenta. Disattivato per impostazione predefinita; si attiva da solo quando passi un file o un link di riferimento. Non cambia il prezzo.
aspect_ratiostringFacoltativo16:9, 9:16, 1:1, 4:3, 3:4 oppure adaptive, che lascia scegliere al modello. Il valore predefinito è 16:9.
"16:9""9:16""1:1""4:3""3:4""adaptive"reference_link_urlstringObbligatorio a certe condizioniUna pagina web pubblica che il modello legge come riferimento, per esempio un articolo, una pagina prodotto o un profilo del personaggio. Deve aprirsi senza login. Alcuni siti bloccano i lettori automatici e una pagina con troppo poco testo non si può usare; in entrambi i casi il task fallisce con un messaggio che dice che l’URL non è leggibile, e i task falliti non si pagano. Non insieme a reference_file_url; se non imposti enable_prompt_expansion, anche allegare un link attiva l’espansione del prompt. I link non si pagano.
reference_file_urlstringObbligatorio a certe condizioniUn documento che il modello legge prima di dirigere l’inquadratura: una scheda personaggio, una sceneggiatura, una lista di inquadrature o un brief di prodotto. PDF, DOCX, DOC, TXT, MD, PPTX, PPT, XLSX, XLS, KEY, PAGES o NUMBERS, fino a 100 MB e 50 pagine. Funziona da solo o insieme a immagini, video e audio di riferimento, ma non insieme a reference_link_url. Se non imposti enable_prompt_expansion, allegare un file attiva l’espansione del prompt per quella richiesta, perché il documento viene letto in quel passaggio. I file non si pagano.
reference_audio_urlsarray<string>Obbligatorio a certe condizioniFino a 5 clip, ciascuno da 1 a 15 secondi e 15 secondi in totale: una voce, una battuta recitata o il tono d'ambiente a cui l'inquadratura deve adeguarsi. L'audio di riferimento non viene fatturato. WAV o MP3, 15 MB per clip. Come per i video, questi limiti vengono verificati durante la generazione e non quando il task viene accettato.
reference_video_urlsarray<string>Obbligatorio a certe condizioniIncide sul prezzoFino a 5 clip, ciascuno da 1 a 15 secondi e 15 secondi in totale. Usali per il movimento e lo stile di camera, non per un volto. La loro durata viene fatturata insieme all'output, e video di riferimento più output devono restare entro i 30 secondi. MP4 o MOV, almeno 16 fps, da 240 a 4096 px per lato, rapporto d'aspetto non oltre 8:1, 100 MB per clip. Questi limiti vengono verificati durante la generazione e non quando il task viene accettato, quindi controlla la durata dei clip prima dell'invio.
reference_image_urlsarray<string>Obbligatorio a certe condizioniDa 1 a 10 immagini come tavole di riferimento per identità, guardaroba e set. Indica ciascuna nel prompt – personaggio, capo, set – altrimenti vengono mediate tra loro. Le immagini di riferimento non vengono fatturate. JPEG, PNG senza trasparenza, BMP o WEBP; da 240 a 8000 px per lato, rapporto d'aspetto non oltre 8:1, al massimo 20 MB ciascuna. Il controllo dei volti di questo modello rifiuta spesso le foto di persone reali, e il task fallisce con «The input content is suspected to include real human faces.». Usa invece personaggi illustrati o renderizzati in 3D; i task rifiutati non vengono fatturati.
promptstringFacoltativoOpzionale. Quando lo scrivi, dichiara che cosa controlla ogni riferimento, poi descrivi l'inquadratura: soggetto, un'azione, un movimento di camera, luce e suono. Una sola azione chiara sposta il risultato più di un lungo elenco di aggettivi.
{
"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": "16:9",
"description": "Output aspect ratio; adaptive follows the input media and the intent.",
"enum": [
"16:9",
"9:16",
"1:1",
"4:3",
"3:4",
"adaptive"
],
"type": "string",
"x-ui": {
"order": 70,
"widget": "select"
}
},
"duration_seconds": {
"default": 5,
"description": "Requested output length 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": {
"advanced": false,
"affects_price": true,
"enum_labels": {
"-1": "Smart"
},
"order": 50,
"unit": "s",
"widget": "slider"
}
},
"enable_prompt_expansion": {
"description": "Allow the service to expand the submitted creative brief before generation.",
"type": "boolean",
"x-ui": {
"order": 30,
"widget": "switch"
}
},
"enable_thinking": {
"default": false,
"description": "Let the model reason about the brief and the reference material before generating. Helps with complex references; slower. Switches on by itself when a reference file or link is given.",
"type": "boolean",
"x-ui": {
"order": 66,
"widget": "switch"
}
},
"generate_audio": {
"default": true,
"description": "Request generated audio with the video.",
"type": "boolean",
"x-ui": {
"order": 40,
"widget": "switch"
}
},
"prompt": {
"description": "Describe the subject, action, camera, light, pacing, and boundaries for the shot.",
"minLength": 1,
"type": "string",
"x-ui": {
"order": 110,
"primary": true,
"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 items and 15 seconds in total.",
"items": {
"contentMediaType": [
"audio/mpeg",
"audio/wav"
],
"type": "string"
},
"maxItems": 5,
"minItems": 1,
"type": "array",
"x-ui": {
"max_total_duration_seconds": 15,
"order": 80,
"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": "Reference images, up to 10 items.",
"items": {
"contentMediaType": [
"image/jpeg",
"image/png",
"image/webp",
"image/gif"
],
"type": "string"
},
"maxItems": 10,
"minItems": 1,
"type": "array",
"x-ui": {
"order": 100,
"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 items and 15 seconds in total.",
"items": {
"contentMediaType": [
"video/mp4",
"video/webm",
"video/quicktime"
],
"type": "string"
},
"maxItems": 5,
"minItems": 1,
"type": "array",
"x-ui": {
"affects_price": true,
"max_duration_seconds": 15,
"max_total_duration_seconds": 15,
"order": 90,
"widget": "multi-upload"
}
},
"resolution": {
"default": "720p",
"description": "Output resolution.",
"enum": [
"480p",
"720p",
"1080p"
],
"type": "string",
"x-ui": {
"advanced": false,
"affects_price": true,
"order": 60,
"widget": "radio"
}
},
"seed": {
"description": "Random seed. Keep it fixed only for controlled comparisons, not as a frame-identical guarantee.",
"maximum": 2147483647,
"minimum": 0,
"type": "integer",
"x-ui": {
"order": 10,
"widget": "number"
}
}
},
"type": "object",
"x-pricing": {
"billingMode": "duration_capped",
"variantFields": [
"resolution"
]
}
}HTTP 202 significa che l’attività è stata accettata, non che sia finita. Salva il taskId restituito e interroga quell’attività. Non crearne un’altra mentre aspetti il risultato.
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"
}
}La risposta di accettazione include la stima, così la tua applicazione può mostrare lo stesso importo nella cronologia delle attività e nella fatturazione.
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
--data-urlencode "taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"Comincia a interrogare ogni 2 secondi circa e allunga l’intervallo man mano. Fermati a uno stato terminale. Dopo una caduta di connessione, interroga il taskId originale. Ripeti la creazione solo con la chiave di idempotenza e il corpo originali.
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);
});Passa callBackUrl quando crei l’attività e il record finito ti arriva via POST: nessun ciclo di polling. Ogni consegna porta X-Webhook-Timestamp, X-Webhook-Signature e X-Webhook-Payload-Version. La firma è un HMAC-SHA256 in base64 su taskId.timestamp.sha256(body), quindi va verificata sui byte grezzi: se analizzi il JSON e lo riserializzi i byte cambiano e la verifica fallisce. Le consegne fallite vengono ritentate, quindi lo stesso taskId può arrivare due volte: rendi idempotente il gestore. Rispondi prima con un 2xx e fai il lavoro dopo; un gestore lento viene trattato come una consegna fallita.
Usa l’output solo quando lo stato è succeeded. In caso di fallimento, indaga con errorCode, errorMessage e request_id. Costi e stati degli esempi non rappresentano un addebito reale.
{
"code": 200,
"msg": "success",
"request_id": "req_example_record",
"data": {
"taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
"model": "alibaba/wan-3.0/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"
}
}Per ogni asset disponibile, apri o scarica assets[].url direttamente, senza l’header Authorization dell’API. L’URL firmato scade a expiresAt; interroga di nuovo l’attività per rinnovarlo finché l’asset resta entro il periodo di conservazione. Un asset in attesa o non disponibile non ha URL. Tratta gli URL firmati come privati.
Usa SpicyAPI nella tua app, nel terminale, con un assistente IA o in un workflow visivo. Scegli una guida di configurazione.
Altre integrazioni
Non sei obbligato a scrivere niente del codice qui sopra. Collega una volta il server MCP e qualsiasi agente che parla MCP – Claude Code, Codex, Cursor, Windsurf, VS Code, Gemini CLI, Cline, LibreChat – può eseguire questo modello chiamandolo per nome, oppure lo esegui dalla shell con un solo comando.
Usa alibaba/wan-3.0/reference-to-video per fare un’inquadratura di cinque secondi di un tetto al neon all’imbrunire, con carrellata lenta in avanti, e salvala in ./out/.
L’agente cerca il modello nel catalogo in tempo reale, carica per te il file locale, poi mostra il preventivo esatto con l’addebito massimo e aspetta la tua conferma. Niente viene addebitato finché non dici di sì.
claude mcp add spicyapi -e SPICY_API_KEY=$SPICY_API_KEY \
-- npx --yes --package=@spicyapi/mcp spicyapi-mcp
npx skills add spicyapi-ai/spicy-skillLa prima riga dà gli strumenti all’agente; la seconda gli dà la Skill, cioè le regole con cui usarli: preventivare prima di addebitare, caricare i file locali invece di incollarne i byte, leggere l’URL dell’asset finito invece di indovinarlo. Tutti gli altri client prendono lo stesso server dal proprio file di configurazione: vedi l’area sviluppatori.
npx @spicyapi/cli tasks create --model alibaba/wan-3.0/reference-to-video \
--input-json '{"aspect_ratio":"16:9","duration_seconds":5,"prompt":"A slow aerial shot drifting over a misty pine forest at sunrise","reference_image_urls":["https://example.com/reference.png"],"resolution":"720p"}' \
--waitL’input è lo schema di questo endpoint, lo stesso degli esempi qui sopra. --wait interroga finché l’attività non è finita e poi la stampa; aggiungi --yes per saltare la richiesta di conferma in CI. Imposta prima SPICY_API_KEY: una sola chiave vale per l’API, per la CLI e per il server MCP.
npx @spicyapi/cli tasks create --model alibaba/wan-3.0/reference-to-video \
--input-json '{…}' --retention 1h --wait
npx @spicyapi/cli tasks get $TASK_ID # read back the retention that applied--retention può solo accorciare la finestra: 30m, 1h, 7d, oppure 0 per cancellare appena l’attività raggiunge uno stato terminale. Il valore che vale davvero è il più corto fra la tua richiesta, le impostazioni del tuo account e il massimo di piattaforma, quindi rileggilo dal record dell’attività invece di dare per scontato il numero che hai chiesto. Passare una finestra più lunga di quanto consente il tuo account non ha nessun effetto.
Installa i nodi SpicyAPI da ComfyUI Manager o con il comando qui sotto, poi cerca Wan 3.0 · Reference to Video sulla tela. Il nodo ha le stesse opzioni di questa pagina e mostra il prezzo prima dell’esecuzione.
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapiIl pannello incorporato legge lo stesso schema di questa pagina, quindi non può discostarsi dall’API. Se nella tua documentazione i contenuti devono essere ricercabili, leggi il JSON sotto /api/embed/models/ e renderizzalo per conto tuo.
<iframe src="https://spicyapi.ai/embed/it/models/wan-3-0/api?model=alibaba%2Fwan-3.0%2Freference-to-video" width="100%" height="560" loading="lazy" title="Esempio di richiesta" style="border:1px solid rgba(0,0,0,.12)"></iframe>