Vai al contenuto principale

Il reference-to-video Wan 2.6 di Alibaba inserisce persone, animali o oggetti da una a tre clip di riferimento in una nuova scena descritta dal prompt. Le clip durano da 2 a 10 secondi a 720p o 1080p, in ripresa singola o multi-inquadratura.

Il filtraggio cambia da un endpoint all’altro: Da immagine a video — Senza censura, Da testo a video — Senza censura, Da riferimento a video — Filtrato.

Da $0.065/s

Playground

Invia una richiesta

Guida rapida

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 integrazioni
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

Autenticazione dell’API

Tieni 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
Risultato di esempioUsa questo esempio
# 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-2.6/reference-to-video",
  "input": {
    "aspect_ratio": "16:9",
    "duration_seconds": 5,
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "resolution": "720p",
    "shot_type": "single",
    "reference_video_urls": [
      "https://example.com/reference.mp4"
    ]
  }
}'

# 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.

Parametri di input

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.

promptstringObbligatorio

La scena nuova: di' cosa apporta ciascun clip di riferimento, poi ambiente, azione, macchina e luce. Resta sotto i 1.500 caratteri. Ridescrivere ciò che il girato già mostra consuma budget e a volte entra in concorrenza con i clip.

Predefinito
Non specificato
Vincoli
minLength:1
maxLength:1500
seedintegerFacoltativo

Da 0 a 2147483647. Tienilo fermo mentre cambi un clip di riferimento alla volta, così l'estrazione casuale resta costante e si muove solo ciò che hai cambiato. È uno strumento di confronto, non una garanzia di riesecuzione identica fotogramma per fotogramma.

Predefinito
Non specificato
Vincoli
minimum:0
maximum:2147483647
shot_typestringFacoltativo

single tiene una ripresa continua; multi lascia che il modello stacchi fra inquadrature dentro la stessa scena. Multi conviene quando la scena ha un ritmo; su 2 o 3 secondi c'è raramente spazio per uno stacco.

Predefinito
"single"
Valori ammessi
"single""multi"
duration_secondsintegerFacoltativoIncide sul prezzo

Un numero intero qualsiasi da 2 a 10, predefinito 5. È ciò che muove di più il prezzo ed è anche il punto in cui la somiglianza scivola: controlla l'ultimo secondo di un clip lungo prima di impegnarti su quella durata.

Predefinito
5
Vincoli
minimum:2
maximum:10
resolutionstringFacoltativoIncide sul prezzo

720p o 1080p, predefinito 720p. Fissa la tariffa al secondo e quanto dura il task, ed entrambe le risoluzioni accettano tutti e cinque i formati.

Predefinito
"720p"
Valori ammessi
"720p""1080p"
aspect_ratiostringFacoltativo

16:9, 9:16, 1:1, 4:3 o 3:4, predefinito 16:9, disponibile a entrambe le risoluzioni; le dimensioni in pixel di ogni combinazione sono nelle specifiche. Qui è un parametro e non un'eredità da un fotogramma in ingresso, così uno stesso insieme di riferimenti può essere consegnato in più formati.

Predefinito
"16:9"
Valori ammessi
"16:9""9:16""1:1""4:3""3:4"
reference_image_urlsarray<string>Obbligatorio a certe condizioni

Fino a due immagini fisse di personaggi o oggetti, insieme alle clip o al loro posto; sommate alle clip, una richiesta accetta al massimo cinque riferimenti. Vengono numerate dopo le clip: con due clip la prima immagine è character3, senza clip è character1. Un’immagine fissa porta bene colore e look, ma la forma può tornare meno fedele che da una clip, quindi descrivi la forma nell’istruzione quando conta. Le immagini non vengono addebitate.

Predefinito
Non specificato
Vincoli
minItems:1
maxItems:2
reference_video_urlsarray<string>Obbligatorio a certe condizioniIncide sul prezzo

Fino a tre clip dei personaggi o degli oggetti da mettere in scena. Richiamali nell’istruzione come character1, character2 e character3, nell’ordine di caricamento: Wan riconosce il cast solo da questi nomi, e le immagini fisse di reference_image_urls vengono numerate dopo le clip. Il girato breve in cui il soggetto è grande nell’inquadratura, ben illuminato e visto da più di un’angolazione si trasferisce meglio, e i secondi che mandi sono fatturabili, quindi taglia prima di caricare.

Predefinito
Non specificato
Vincoli
minItems:1
maxItems:3
negative_promptstringFacoltativo

Ciò che non deve comparire: persone in più, scritte, oggetti di scena del clip di riferimento che non vuoi riportare. Ricorrici quando qualcosa torna da un'esecuzione all'altra, invece di scrivere tutte le esclusioni in partenza.

Predefinito
Non specificato
Vincoli
maxLength:1500

Segui l’attività

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.

Risposta di accettazione
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.

Leggi l’attività
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.

Oppure lascia che sia la callback a trovarti
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.

Leggi il risultato

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.

Esempio di risposta completata
{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_record",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "alibaba/wan-2.6/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.

SDK e integrazioni

Usa SpicyAPI nella tua app, nel terminale, con un assistente IA o in un workflow visivo. Scegli una guida di configurazione.

Usalo in ComfyUI

Installa i nodi SpicyAPI da ComfyUI Manager o con il comando qui sotto, poi cerca Wan 2.6 · 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-spicyapi