Vai al contenuto principale

Seedance 1.5 Pro Spicy è il modello image-to-video senza censura di ByteDance che anima un’immagine fissa da te fornita come primo fotogramma. Clip da 4 a 12 secondi a 480p, 720p o 1080p, con blocco camera facoltativo e fotogramma finale.

Da $0.012/s14% 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": "bytedance/seedance-1.5-pro-spicy/image-to-video",
  "input": {
    "aspect_ratio": "adaptive",
    "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 obbligatorio. Diventa il primo fotogramma, quindi inquadratura, somiglianza, abbigliamento, esposizione e tetto di qualità vengono tutti da lì – e con camera_fixed attivo, l’inquadratura che componi qui è l’inquadratura di tutto il clip. Un fermo immagine nitido e ben esposto batte qualunque rattoppo nel prompt fatto dopo. 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
camera_fixedbooleanFacoltativo

Disattivato per impostazione predefinita. Attivandolo, la macchina da presa resta ferma e si muove solo il soggetto: è un modo più affidabile di ottenere un’inquadratura fissa rispetto a chiederla nel prompt. Lascialo disattivato ogni volta che la ripresa richiede una carrellata, una panoramica o un’inclinazione. Nessun effetto su quanto ti viene addebitato.

Predefinito
false
generate_audiobooleanFacoltativoIncide sul prezzo

Indica se generare una colonna sonora nativa sincronizzata con l’immagine. Attivo per impostazione predefinita, sposta la richiesta in una fascia tariffaria più alta. Disattivalo per i loop muti, per il materiale che musicherai in post e ogni volta che stai solo verificando l’inquadratura.

Predefinito
true
resolutionstringFacoltativoIncide sul prezzo

Risoluzione in uscita: 480p, 720p per impostazione predefinita, oppure 1080p. Sceglie una fascia tariffaria e governa solo il formato consegnato: non aggiunge dettagli che il primo fotogramma non abbia già. Lavora in bozza a 480p finché stai ancora provando il movimento.

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

Durata del clip finito in secondi interi, da 4 a 12, 5 per impostazione predefinita, ed è la quantità fatturata. Una ripresa guidata da un solo fotogramma deriva tanto più quanto più dura, quindi conferma il movimento a 4 o 5 secondi prima di pagarne 12.

Predefinito
5
Vincoli
minimum:4
maximum:12
aspect_ratiostringFacoltativo

Inquadratura in uscita, adaptive per impostazione predefinita: segue le proporzioni del fotogramma che hai fornito e ti risparmia un ritaglio preventivo. Scegli una proporzione precisa tra 21:9 e 9:16 solo quando il formato di consegna è già fissato. Nessun effetto su quanto ti viene addebitato.

Predefinito
"adaptive"
Valori ammessi
"21:9""16:9""4:3""1:1""3:4""9:16""adaptive"
last_image_urlstringFacoltativo

Ultimo fotogramma facoltativo. Decide l’immagine su cui la ripresa atterra: una transizione, una coppia prima-e-dopo o un loop che si apre e si chiude sullo stesso fermo immagine. Tieni ferme macchina da presa e luce tra i due e cambia un solo stato ben definito, altrimenti il centro del 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 è facoltativo e, con camera_fixed attivo, dovrebbe descrivere solo il movimento dentro l’inquadratura: un respiro, una mano, una caviglia che si sposta, uno sguardo trattenuto. Un’istruzione di macchina e una macchina bloccata tirano in direzioni opposte. I brief non vengono esaminati da noi, ma il livello proprio di Seedance rifiuta una fascia ristretta di formulazioni, il bacio in modo più costante di tutte. Metti quel momento nell’inquadratura invece che nella frase.

Predefinito
Non specificato

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-1.5-pro-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 1.5 Pro 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