Vai al contenuto principale

Seedance 2.5 Spicy è il modello image-to-video senza censura di ByteDance, che anima un’immagine fissa fornita come primo fotogramma, con audio nello stesso passaggio. Clip da 4 a 30 secondi a 480p, 720p o 1080p nativi, più un livello 4K ingrandito.

Da $0.216/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": "bytedance/seedance-2.5-spicy/image-to-video",
  "input": {
    "duration_seconds": 5,
    "generate_audio": true,
    "image_url": "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.

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

Obbligatorio, ed è l'unico campo che lo sia. Diventa il primo fotogramma, quindi da lì arrivano composizione, somiglianza, guardaroba, colore e il tetto qualitativo: un'immagine nitida e ben illuminata batte qualsiasi rattoppo successivo a colpi di prompt. È anche il motivo per cui questo endpoint gestisce il materiale senza censura in modo affidabile: quello che è già nell'immagine non va rivendicato a parole. Ogni lato deve essere compreso tra 300 e 6000 pixel; sotto questa soglia il controllo in ingresso rifiuta l'immagine prima di qualsiasi addebito.

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

Seed intero; se lo ometti, ogni esecuzione ne estrae uno proprio. Fissalo tenendo costante tutto il resto per giudicare che cosa ha davvero cambiato una modifica al prompt. È uno strumento di confronto, non la promessa di ripetizioni identiche fotogramma per fotogramma.

Predefinito
Non specificato
Vincoli
minimum:0
maximum:2147483647
generate_audiobooleanFacoltativo

Indica se viene generata una colonna sonora nativa sincronizzata con l'immagine. Attiva per impostazione predefinita. Disattivala per i loop muti, per il materiale che musicherai in post e ogni volta che stai solo controllando l'inquadratura.

Predefinito
true
duration_secondsintegerFacoltativoIncide sul prezzo

Durata della clip finita in secondi interi, da 4 a 30, 5 per impostazione predefinita, ed è la quantità fatturata: l'addebito cresce direttamente con lei. Trenta secondi sono tanti da chiedere a un solo fotogramma iniziale: conferma il movimento sul corto e allunga solo ciò che tiene.

Predefinito
5
Vincoli
minimum:4
maximum:30
resolutionstringFacoltativoIncide sul prezzo

Risoluzione di uscita: 480p, 720p per impostazione predefinita, 1080p o 4k. Il Seedance 2.5 di ByteDance renderizza in modo nativo al massimo in 1080p, quindi qui la fascia 4k viene consegnata con una passata di upscaling in più sopra quel render nativo: è output ingrandito, non 4K nativo, e quella passata in più rende l'attività più lenta del 1080p a parità di durata. La risoluzione seleziona una fascia tariffaria e governa solo il formato consegnato: non aggiunge dettaglio che il primo fotogramma non abbia già. Le fasce più alte significano file più grandi e render più lunghi.

Predefinito
"720p"
Valori ammessi
"480p""720p""1080p""4k"
last_image_urlstringFacoltativo

Fotogramma di chiusura opzionale. Decide su quale immagine atterra la ripresa: una transizione, una coppia prima-dopo o un loop che apre e chiude sulla stessa immagine. Tieni ferme camera e luce tra le due e cambia un solo stato chiaro, altrimenti il centro della clip diventa uno stacco. Ogni lato deve essere compreso tra 300 e 6000 pixel; sotto questa soglia il controllo in ingresso rifiuta l'immagine prima di qualsiasi addebito.

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

Qui è opzionale, ed è proprio questo il punto: il fotogramma iniziale fissa già quello che si vede, quindi al prompt tocca solo dirigere il movimento – l'azione, dove va lo sguardo, la deriva della camera, il suono della stanza. I brief non vengono esaminati da parte nostra, ma il livello di Seedance rifiuta una banda ristretta di formulazioni, il bacio più costantemente di tutte. Metti quel momento nel fotogramma invece che nella frase.

Predefinito
Non specificato
Vincoli
maxLength:5000

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": "bytedance/seedance-2.5-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 Seedance 2.5 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