Vai al contenuto principale

L’image-to-video Seedance 2.0 Mini di ByteDance parte da un’immagine fissa che fornisci e la anima, con audio nello stesso passaggio. Clip da 4 a 15 secondi a 480p o 720p; un’immagine finale facoltativa fa arrivare la ripresa su un fotogramma stabilito.

Da $0.025/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-mini/image-to-video",
  "input": {
    "aspect_ratio": "adaptive",
    "bitrate_mode": "standard",
    "duration_seconds": 5,
    "enable_web_search": false,
    "generate_audio": true,
    "image_url": "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.

image_urlstringObbligatorio

Link pubblico e scaricabile direttamente al primo fotogramma; obbligatorio. Fissa la composizione, l'aspetto del soggetto, la resa cromatica e il tetto qualitativo: alzare `resolution` non renderà nitida una sorgente morbida. Testi, filigrane e loghi passano nel video, quindi puliscili prima dove puoi. 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"]
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
enable_web_searchbooleanFacoltativoIncide sul prezzo

Disattivato di default. Se lo attivi, il modello può cercare sul web informazioni legate al tuo prompt prima del render. Le richieste con la ricerca web attiva si pagano alla tariffa ricerca web, più alta di quella standard; la stima che vedi prima dell'invio ne tiene già conto.

Predefinito
false
generate_audiobooleanFacoltativo

Decide se viene generata una colonna sonora nativa sincronizzata con le immagini. Attivo per impostazione predefinita; disattivarlo non abbassa la tariffa in questo livello. Spegnilo per i loop muti e per il materiale che sonorizzerai in post.

Predefinito
true
duration_secondsintegerFacoltativoIncide sul prezzo

Durata della clip finita in secondi interi, da 4 a 15, predefinita 5, ed è la quantità addebitata; con -1 sceglie il modello e la stima considera 15 secondi. Un'inquadratura guidata da un solo fotogramma deriva tanto più quanto più dura, quindi verifica il movimento a 4 o 5 secondi prima di pagarne 15.

Predefinito
5
Valori ammessi
-1456789101112131415
resolutionstringFacoltativoIncide sul prezzo

Risoluzione in uscita: 480p, oppure 720p per impostazione predefinita. 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 rendering più lunghi.

Predefinito
"720p"
Valori ammessi
"480p""720p"
aspect_ratiostringFacoltativo

Inquadratura in uscita, adaptive per impostazione predefinita: la clip mantiene le proporzioni del fotogramma iniziale, quindi non viene tagliato nulla. Scegli una delle sei proporzioni fisse, dal 21:9 al 9:16, solo quando la consegna richiede una forma diversa: l'immagine viene allora reinquadrata per adattarsi. Non incide su quanto paghi.

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

Fotogramma di chiusura facoltativo. Decide l'immagine su cui atterra l'inquadratura: una transizione, un prima e dopo o un loop che si apre e si chiude sulla stessa immagine. Tieni stabili macchina e luce tra i due e cambia un solo stato ben chiaro, altrimenti il centro della clip diventa uno stacco. Dagli le stesse proporzioni del fotogramma iniziale: se differiscono, quello di chiusura viene ritagliato per combaciare. 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

Facoltativo, ma conviene scriverlo: di' cosa succede dopo il fotogramma invece di ripetere ciò che si vede già — l'azione, il movimento di macchina, il passare del tempo, il suono. Se lo ometti, il movimento lo decide il modello. Poiché l'immagine fissa già il contenuto, è la strada che regge i brief senza censura: ciò che è nell'inquadratura non va difeso a parole.

Predefinito
Non specificato
Vincoli
minLength:1

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-mini/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.0 Mini · 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