Vai al contenuto principale

Wan 2.6 Spicy è un endpoint image-to-video senza censura che trasforma un fotogramma iniziale in esattamente 5, 10 o 15 secondi a 720p o 1080p. Una traccia audio facoltativa guida labiale e ritmo, ed esiste un negative prompt dedicato.

Da $0.095/s5% sotto il prezzo di listino Spicy

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-spicy/image-to-video",
  "input": {
    "duration_seconds": 5,
    "image_url": "https://example.com/reference.png",
    "resolution": "720p",
    "shot_type": "single"
  }
}'

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

image_urlstringObbligatorio

Il fotogramma iniziale. Abiti, corpo, scenografia, direzione della luce e le proporzioni della clip arrivano tutti da qui, quindi ritaglialo prima nella forma di consegna. Formati ammessi: JPEG, PNG senza trasparenza, BMP o WEBP, da 240 a 8.000 pixel per lato e al massimo 20 MB.

Predefinito
Non specificato
Vincoli
contentMediaType:["image/jpeg","image/png","image/webp","image/gif"]
enable_prompt_expansionbooleanFacoltativo

Disattivata per impostazione predefinita, quindi il prompt parte così come lo scrivi. Attivala per completare un brief scarno. Con shot_type su multi viene attivata a prescindere da questa impostazione.

Predefinito
false
shot_typestringFacoltativo

Single tiene l'intera clip su una sola ripresa continua. Multi lascia che il modello stacchi tra più inquadrature, il che va bene per una scena breve ma rompe la continuità stretta. Scegliere multi attiva anche enable_prompt_expansion per quella richiesta, perché gli stacchi vengono pianificati mentre il brief viene espanso.

Predefinito
"single"
Valori ammessi
"single""multi"
seedintegerFacoltativo

Da 0 a 2147483647. Tienilo fisso mentre confronti risoluzioni o durate a partire dalla stessa plate.

Predefinito
Non specificato
Vincoli
minimum:0
maximum:2147483647
audio_urlstringFacoltativo

Una traccia audio che la clip deve seguire, guidando sincronizzazione labiale e ritmo. Usala quando una battuta parlata o un attacco musicale devono cadere su un fotogramma preciso. WAV o MP3, da 3 a 30 secondi, al massimo 15 MB.

Predefinito
Non specificato
Vincoli
contentMediaType:["audio/mpeg","audio/wav"]
resolutionstringFacoltativoIncide sul prezzo

720p o 1080p, 720p di default. Sposta sia il prezzo sia il tempo che l'attività impiega a tornare.

Predefinito
"720p"
Valori ammessi
"720p""1080p"
duration_secondsintegerFacoltativoIncide sul prezzo

Esattamente 5, 10 o 15. Qualsiasi altro valore viene rifiutato invece che arrotondato, così la durata che paghi non è mai una sorpresa.

Predefinito
5
Valori ammessi
51015
negative_promptstringFacoltativo

Ciò che non deve comparire: una seconda persona, un oggetto di scena, testo a schermo, un watermark che la plate continua a riprodurre. È l'unico posto per escludere qualcosa. Al massimo 500 caratteri.

Predefinito
Non specificato
Vincoli
maxLength:500
promptstringFacoltativo

Facoltativo. Descrivi che cosa succede dopo il fotogramma: un'azione, un comportamento di camera, una nota sul suono. Ripetere l'abbigliamento invita il modello a ridisegnarlo. Al massimo 1.500 caratteri.

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-spicy/image-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 Spicy · Image 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