Vai al contenuto principale

Il reference-to-video Seedance 2.0 di ByteDance costruisce una ripresa dal tuo materiale: fino a 9 immagini, 3 clip video e 3 tracce audio, senza primo fotogramma. Output da 4 a 15 secondi a 480p, 720p, 1080p o 4K, con audio nativo.

Da $0.043/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.0/reference-to-video",
  "input": {
    "aspect_ratio": "adaptive",
    "bitrate_mode": "standard",
    "duration_seconds": 5,
    "generate_audio": true,
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "resolution": "720p",
    "reference_image_urls": [
      "https://example.com/reference.png"
    ]
  }
}'

# 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

Obbligatorio, e qui fa anche il casting. I riferimenti vengono citati nell'ordine in cui li invii, quindi indica quale immagine è quale personaggio, che cosa aggiunge ogni clip e a che cosa serve l'audio. I brief non vengono revisionati da parte nostra; dove il livello interno di Seedance rifiuta la formulazione, un primo fotogramma su image-to-video è la via che arriva comunque.

Predefinito
Non specificato
watermarkbooleanFacoltativo

Aggiunge al video la filigrana visibile «AI generated» del modello. Disattivata per impostazione predefinita; attivala quando la piattaforma su cui pubblichi chiede di etichettare i video generati con l’IA. Nessun effetto sul prezzo.

Predefinito
false
bitrate_modestringFacoltativo

Bitrate del file consegnato: `standard` (predefinito) o `high`. `high` mantiene più nitidi le texture fini e i movimenti rapidi a parità di risoluzione e produce un file molto più pesante; risoluzione, frame rate e durata restano uguali. Nessun effetto sul prezzo.

Predefinito
"standard"
Valori ammessi
"standard""high"
return_last_framebooleanFacoltativo

Restituisce anche l’ultimo fotogramma della clip come immagine separata, accanto al video. Mandalo a image-to-video come nuovo fotogramma iniziale per concatenare le inquadrature senza esportare tu un fermo immagine. Disattivato per impostazione predefinita; nessun effetto sul prezzo.

Predefinito
false
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

Attivo per impostazione predefinita. Produce una colonna sonora nativa sincronizzata con le immagini. Anche fornendo `reference_audio_urls`, disattivarlo significa che nessuna colonna sonora viene resa: l'audio di riferimento modella ritmo e interpretazione, non è la traccia in uscita. Disattivalo quando il montaggio verrà musicato in post.

Predefinito
true
duration_secondsintegerFacoltativoIncide sul prezzo

Da 4 a 15 secondi, 5 per impostazione predefinita; con -1 è il modello a scegliere la durata (la stima usa il massimo di 15 secondi, l'addebito la durata consegnata). Quindici secondi sono il tetto di questa generazione; per un'inquadratura singola più lunga, passa all'endpoint 2.5. Nota che questo e la lunghezza delle tue clip di riferimento sono due contributi indipendenti alla quantità fatturata, quindi portarli entrambi al massimo è il punto in cui una sola richiesta diventa cara.

Predefinito
5
Valori ammessi
-1456789101112131415
resolutionstringFacoltativoIncide sul prezzo

480p, 720p, 1080p o 4k, 720p per impostazione predefinita, e alimenta direttamente la quantità fatturata. Imposta soltanto la fascia in uscita e non renderà nitidi riferimenti a bassa risoluzione. Prova se i riferimenti si combinano a una fascia bassa, poi alzala per la ripresa finale. Qui non esiste alcuna fascia di upscaling o miglioramento.

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

Predefinito `adaptive`: il modello trova un'inquadratura che accoglie ogni soggetto referenziato, cosa che conta soprattutto quando gli asset di riferimento non condividono la stessa forma. Fissa proporzioni precise solo per un vincolo di consegna rigido – `9:16` per un feed verticale, per esempio – e controlla che nessuna persona o prodotto referenziato risulti tagliato. Nessun effetto sulla fatturazione.

Predefinito
"adaptive"
Valori ammessi
"21:9""16:9""4:3""1:1""3:4""9:16""adaptive"
reference_audio_urlsarray<string>Facoltativo

Fino a 3 file audio di riferimento, ciascuno da 2 a 15 secondi e per una lunghezza complessiva non superiore a 15 secondi, che danno al modello un ancoraggio sonoro – interpretazione, tempo, una frase musicale – su cui allineare movimento e punti di stacco. Diverso da `generate_audio`: questo è un input, mentre se la clip finita porta una colonna sonora lo decide comunque `generate_audio`.

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

Fino a 3 clip di riferimento, ciascuna da 2 a 15 secondi e per una lunghezza complessiva non superiore a 15 secondi, che forniscono movimento, ritmo o linguaggio di macchina. La lunghezza di una clip di riferimento conta nella quantità fatturata – non come cambio di fascia, ma come moltiplicatore lineare dello stesso tipo di `duration_seconds` – quindi taglia ai secondi che vuoi davvero citare.

Predefinito
Non specificato
Vincoli
maxItems:3
reference_image_urlsarray<string>Obbligatorio a certe condizioni

Fino a 9 immagini di riferimento, usate per tenere un personaggio, uno stile o un set. Due o tre angolazioni dello stesso personaggio di solito funzionano meglio di una pila di fotogrammi quasi identici. Questo endpoint non ha alcun parametro per primo o ultimo fotogramma: modalità a riferimenti e modalità a fotogrammi si escludono a vicenda, quindi passa a image-to-video quando il fotogramma iniziale deve essere esatto. Il controllo in ingresso di Seedance può rifiutare una foto o una clip di riferimento in cui si vede il volto di una persona reale e riconoscibile. 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
maxItems:9

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

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