Seedance 2.0 API

Integra la generazione di video nel tuo prodotto con la creazione di task asincroni, il polling dello stato, i webhook e la fatturazione basata sui crediti.

URL di base
https://api.seedance2.ai
In questa pagina

Introduzione

L'API ti consente di inviare task di generazione video Seedance 2.0 in modo programmatico. La generazione è asincrona: crei un task, ricevi immediatamente un ID del task, quindi ottieni il video finito interrogando l'endpoint del task o ricevendo un webhook.

Task asincroni

Il polling funziona bene per lo sviluppo e le integrazioni semplici.

Webhook pronto

I webhook sono consigliati per la produzione perché evitano il polling aggressivo e notificano il tuo servizio quando un task raggiunge uno stato terminale.

Consapevole dei crediti

I crediti vengono riservati al momento dell'invio. I task riusciti vengono addebitati da quella prenotazione; i task falliti o scaduti vengono automaticamente rimborsati.

Autenticazione

Crea una chiave API nella dashboard e inviala come token Bearer in ogni richiesta. La chiave completa viene mostrata solo una volta al momento della creazione.

Authorization: Bearer sk_live_xxxxxxxx
sk_live_

Utilizza chiavi sk_live_ per il traffico di produzione.

sk_test_

Utilizza chiavi sk_test_ per il test di integrazione sandbox con lo stesso contratto API.

401

Chiavi mancanti, non valide o revocate restituiscono invalid_api_key con HTTP 401.

Guida rapida

Invia prima un task. Dopo che il task è stato accettato, scegli un metodo di consegna del risultato: interroga l'endpoint del task o ricevi il risultato terminale tramite un webhook.

Invia un task

Crea un task video asincrono e ricevi immediatamente un ID del task.

curl https://api.seedance2.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-0",
    "callback_url": "https://your-domain.com/api/seedance/webhook",
    "input": {
      "prompt": "a cat surfing on a neon wave, cinematic lighting",
      "generation_type": "text-to-video",
      "duration": 5,
      "aspect_ratio": "16:9",
      "resolution": "720p",
      "generate_audio": true,
      "watermark": false,
      "web_search": false,
      "return_last_frame": false,
      "seed": -1
    }
  }'
Opzione risultato: Polling

Recupera l'endpoint dello stato del task quando la tua integrazione preferisce il polling esplicito.

curl https://api.seedance2.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
  -H "Authorization: Bearer sk_live_xxx"
Opzione risultato: Webhook

Passa callback_url durante l'invio del task, quindi ricevi i callback di completamento o fallimento e aggiorna il tuo record del task.

export async function POST(request: Request) {
  const callbackData = await request.json();

  if (callbackData.status === "completed") {
    const videoUrl = callbackData.data.results[0];
    // Save the video URL or update your own task record here.
  }

  if (callbackData.status === "failed") {
    const errorMessage = callbackData.data.failed_reason;
    // Mark your own task record as failed here.
  }

  return new Response(null, { status: 200 });
}

Crea un task video

Crea un task video con POST /v1/videos/generations. Il corpo della richiesta ha un modello di primo livello, un callback_url opzionale e un oggetto di input contenente le impostazioni di prompt e generazione.

POST
/v1/videos/generations
curl https://api.seedance2.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-0",
    "callback_url": "https://your-domain.com/api/seedance/webhook",
    "input": {
      "prompt": "a cat surfing on a neon wave, cinematic lighting",
      "generation_type": "text-to-video",
      "duration": 5,
      "aspect_ratio": "16:9",
      "resolution": "720p",
      "generate_audio": true,
      "watermark": false,
      "web_search": false,
      "return_last_frame": false,
      "seed": -1
    }
  }'

Modalità di generazione

generation_type controlla quali input multimediali sono accettati e come il modello li interpreta.

ModalitàMedia richiestiMedia opzionaliNote
text-to-videopromptduration, aspect_ratio, resolution, seedSolo prompt testuale. image_urls, video_urls e audio_urls non sono necessari.
image-to-videoprompt + array image_urls (1-2 URL di immagini)duration, aspect_ratio, resolution, seedimage_urls deve essere un array. Fornisci 1 URL di immagine per il primo frame o 2 URL di immagini per il primo e l'ultimo frame. Video e audio vengono ignorati.
reference-to-videoprompt + almeno un'immagine o un videoimmagini, video e audio entro i limiti dei materialiL'audio non può essere utilizzato da solo con il testo. Aggiungi almeno un'immagine o un video quando viene fornito l'audio.
text-to-video

Usa text-to-video quando il prompt è l'unico input creativo.

curl https://api.seedance2.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-0",
    "callback_url": "https://your-domain.com/api/seedance/webhook",
    "input": {
      "prompt": "a cinematic drone shot over a futuristic coastal city at sunrise",
      "generation_type": "text-to-video",
      "duration": 5,
      "aspect_ratio": "16:9",
      "resolution": "720p",
      "generate_audio": true,
      "watermark": false,
      "web_search": false,
      "return_last_frame": false,
      "seed": -1
    }
  }'
image-to-video

Usa image-to-video quando input.image_urls è un array con 1-2 URL di immagini: un URL imposta il primo frame e due URL impostano il primo e l'ultimo frame. I riferimenti video e audio vengono ignorati in questa modalità.

curl https://api.seedance2.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-0",
    "input": {
      "prompt": "the subject turns toward camera, soft studio motion",
      "generation_type": "image-to-video",
      "image_urls": ["https://your.cdn.com/first-frame.jpg"],
      "duration": 5,
      "resolution": "720p"
    }
  }'
reference-to-video

Usa reference-to-video per una direzione più ricca con immagini, video e audio di riferimento. L'audio non può essere utilizzato da solo con il testo; includi almeno un'immagine o un video quando viene fornito l'audio.

Limiti dei materiali

  • Fino a 9 immagini di riferimento
  • Fino a 3 video di riferimento, durata totale <= 15 secondi
  • Fino a 3 audio di riferimento, durata totale <= 15 secondi
  • Massimo 12 materiali in totale tra tutti i tipi

Combinazioni di input supportate

Testo + Immagine
Testo + Video
Testo + Immagine + Video
Testo + Immagine + Audio
Testo + Video + Audio
Testo + Immagine + Video + Audio
curl https://api.seedance2.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-0",
    "input": {
      "prompt": "use the product from image 1 and the camera motion from the reference video",
      "generation_type": "reference-to-video",
      "image_urls": ["https://your.cdn.com/product.jpg"],
      "video_urls": ["https://your.cdn.com/camera-motion.mp4"],
      "audio_urls": [],
      "duration": 8,
      "resolution": "1080p"
    }
  }'

Parametri di richiesta

I nomi dei parametri, i valori delle enumerazioni, i percorsi degli endpoint e gli esempi fanno parte del contratto API. Le descrizioni seguenti spiegano come si comporta ogni campo.

Intestazioni

IntestazioneObbligatorioDescrizioneEsempio
AuthorizationChiave API Bearer utilizzata per autenticare la richiesta.Bearer sk_live_xxx
Content-TypeTutte le richieste di scrittura utilizzano JSON.application/json

Campi di livello superiore

CampoTipoObbligatorioPredefinitoIntervallo / EnumModalitàEsempio
model

Variante del modello utilizzata per la generazione.

string-seedance-2-0 | seedance-2-0-fasttuttiseedance-2-0
callback_url

Endpoint HTTPS che riceve i callback di completamento e fallimento del task.

stringNo-URL HTTPS, nessuna rete privatatuttihttps://your-domain.com/hook
input

Impostazioni di generazione e riferimenti multimediali.

object--tutti-

input.* campi

CampoTipoObbligatorioPredefinitoIntervallo / EnumModalitàEsempio
input.prompt

Prompt testuale che descrive il video da creare.

string-testo non vuototuttia cat surfing
input.generation_type

Modalità di generazione. Il valore predefinito è text-to-video.

stringNotext-to-videotext-to-video | image-to-video | reference-to-video-image-to-video
input.image_urls

URL di immagini pubblicamente raggiungibili. Per l'immagine-a-video, invia 1 immagine per il primo frame o 2 immagini per il primo e l'ultimo frame. Per il riferimento-a-video, invia fino a 9 immagini come riferimenti visivi. (image-to-video) (reference-to-video)

string[]Condizionale[]Immagine-a-video: 1 o 2 immagini. Riferimento-a-video: fino a 9 immagini. (image-to-video) (reference-to-video)image-to-video / reference-to-video["https://.../a.jpg"]
input.video_urls

Video di riferimento pubblicamente raggiungibili solo per reference-to-video. Puoi inviare fino a 3 file video e il loro tempo di riproduzione combinato deve essere di 15 secondi o meno.

string[]No[]Fino a 3 video. La lunghezza combinata del video deve essere di 15 secondi o meno.reference-to-video[]
input.audio_urls

File audio di riferimento pubblicamente raggiungibili solo per reference-to-video. Puoi inviare fino a 3 file audio e il loro tempo di riproduzione combinato deve essere di 15 secondi o meno.

string[]No[]Fino a 3 file audio. La lunghezza combinata dell'audio deve essere di 15 secondi o meno.reference-to-video[]
input.duration

Lunghezza del video di output in secondi.

intNo54-15 seconditutti5
input.aspect_ratio

Rapporto d'aspetto dell'output. adaptive consente al servizio di inferire il miglior rapporto.

stringNoadaptive16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adattivotutti16:9
input.resolution

Livello di risoluzione dell'output.

stringNo720p480p | 720p | 1080ptutti720p
input.generate_audio

Se il modello deve generare audio quando supportato.

booleanNotruetrue | falsetuttitrue
input.watermark

Se aggiungere una filigrana.

booleanNofalsetrue | falsetuttifalse
input.web_search

Se consentire l'aumento della ricerca web quando supportato.

booleanNofalsetrue | falsetuttifalse
input.return_last_frame

Se restituire l'URL dell'ultimo frame quando disponibile.

booleanNofalsetrue | falsetuttifalse
input.seed

Seed deterministico. Usa -1 per un seed casuale.

intNo-1-1 o 0-4294967295tutti-1

I crediti variano in base alla risoluzione, alla durata, al modello e se il riferimento al video include riferimenti video. Il valore dei crediti restituito dalla risposta di creazione è l'importo effettivo riservato per quel task. (reference-to-video)

Visualizza prezzi dei crediti

Risposta

Questa è la risposta di successo da POST /v1/videos/generations. Significa che il task è stato accettato e i crediti sono stati riservati. Usa il taskId restituito per interrogare GET /v1/tasks/:id o per associare un callback di completamento o fallimento.

Risposta di successo POST /v1/videos/generations

{
  "taskId": "3f2aK9mR...",
  "credits": 60
}

Ottieni stato del task

Usa GET /v1/tasks/:id per recuperare lo stato corrente del task. Non effettuare polling più di una volta ogni 10 secondi. Per i sistemi di produzione, preferisci i webhook.

curl https://api.seedance2.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
  -H "Authorization: Bearer sk_live_xxx"

Risposta del task completato

{
  "id": "3f2aK9mR...",
  "status": "completed",
  "created_at": 1781234567,
  "model": "seedance-2-0",
  "billing_status": "charged",
  "credits": 60,
  "failed_reason": null,
  "data": {
    "results": ["https://cdn.seedance2.ai/.../x.mp4"],
    "video_expires_at": "2026-06-13T10:00:00Z",
    "last_frame_url": null,
    "processing_time": 48
  }
}

Risposta del task fallito

{
  "id": "3f2aK9mR...",
  "status": "failed",
  "created_at": 1781234567,
  "model": "seedance-2-0",
  "billing_status": "refunded",
  "credits": 60,
  "failed_reason": "provider_failed"
}
ValoreSignificato
status=queuedAccettato e in attesa di essere inviato o elaborato.
status=generatingIl provider sta elaborando la generazione.
status=completedVideo completato e data.results contiene l'URL del risultato.
status=failedGenerazione fallita o scaduta.
billing_status=reservedI crediti sono riservati mentre il task è in corso.
billing_status=chargedIl task è riuscito e la prenotazione è saldata.
billing_status=refundedIl task è fallito o è scaduto e i crediti sono stati restituiti.
billing_status=refund_failedLa transazione di rimborso è fallita e richiede una gestione manuale.

Dopo video_expires_at, data.results è vuoto. Scarica e memorizza il file prima che scada la finestra di validità.

Webhook

Quando callback_url è presente, Seedance chiama il tuo endpoint quando il task è completato o fallito, e invia dati JSON che descrivono il risultato finale. Se il tuo endpoint restituisce una risposta non 2xx o non risponde entro 15 secondi, la consegna viene ritentata fino a 5 volte. I tentativi riutilizzano lo stesso ID del task, quindi deduplica per ID. Restituisci una risposta 200 non appena hai registrato in modo sicuro i dati del callback.

Callback di completamento task

{
  "id": "3f2aK9mR...",
  "status": "completed",
  "created_at": 1781234567,
  "model": "seedance-2-0",
  "data": {
    "results": ["https://cdn.seedance2.ai/.../x.mp4"],
    "video_expires_at": "2026-06-13T10:00:00Z",
    "last_frame_url": null,
    "processing_time": 48
  }
}

Callback di fallimento task

{
  "id": "3f2aK9mR...",
  "status": "failed",
  "created_at": 1781234567,
  "model": "seedance-2-0",
  "data": {
    "failed_reason": "provider_failed",
    "credits_refunded": 60
  }
}
export async function POST(request: Request) {
  const callbackData = await request.json();

  if (callbackData.status === "completed") {
    const videoUrl = callbackData.data.results[0];
    // Save the video URL or update your own task record here.
  }

  if (callbackData.status === "failed") {
    const errorMessage = callbackData.data.failed_reason;
    // Mark your own task record as failed here.
  }

  return new Response(null, { status: 200 });
}

Convalida la forma dei dati del callback, deduplica per ID, aggiorna il tuo record del task e rispondi rapidamente.

callback_url deve essere HTTPS e non deve puntare a intervalli di rete privati, loopback o link-local.

Errori

POST /v1/videos/generations e GET /v1/tasks/:id restituiscono questa forma di errore quando la richiesta API stessa fallisce, ad esempio parametri non validi, chiave API non valida, crediti insufficienti, limitazione della frequenza o task non trovato. Alcuni errori includono campi extra come required, available o retry_after a seconda della situazione.

{
  "error": {
    "code": "insufficient_credits",
    "message": "Not enough credits for this task.",
    "required": 60,
    "available": 12
  }
}
CodiceHTTPSignificatoRiprovare?
invalid_request400Parametri mancanti o non validi.No, correggi la richiesta.
invalid_api_key401La chiave API è mancante, non valida o revocata.No, usa una chiave valida.
insufficient_credits402Crediti insufficienti. Il task non viene accettato o addebitato.Dopo la ricarica.
forbidden403Alla chiave API manca lo scope richiesto.No.
not_found404Il task non esiste o non appartiene al proprietario della chiave.No.
rate_limited429Frequenza di richiesta superata.Sì, segui Retry-After.
internal_error500Errore del server.Sì, riprova più tardi.

Limiti di frequenza

I limiti di frequenza vengono applicati per chiave API con una finestra scorrevole. La generazione di default è 60 richieste al minuto; le query di stato sono più permissive. Le risposte HTTP 429 includono Retry-After.

Generazione

60/min

Query di stato

Più permissivo

Intestazione 429

Retry-After

Fatturazione e crediti

L'API utilizza la prenotazione all'invio, l'addebito al successo e il rimborso al fallimento. Le pagine di utilizzo della dashboard mostrano la cronologia dei crediti API, i log dei task e le statistiche di utilizzo basate sul tempo.

Riservato

I crediti vengono verificati e riservati quando il task è accettato.

Addebitato

I task completati saldano la prenotazione esistente.

Rimborsato

I task falliti o scaduti restituiscono automaticamente i crediti riservati.

Controlla l'utilizzo nella dashboard

Visualizza i log API, le timeline dei task, la cronologia dei crediti e le metriche di utilizzo basate sul tempo.

Log API