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.
https://api.seedance2.aiIn 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_xxxxxxxxUtilizza chiavi sk_live_ per il traffico di produzione.
Utilizza chiavi sk_test_ per il test di integrazione sandbox con lo stesso contratto API.
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.
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
}
}'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"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.
/v1/videos/generationscurl 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 richiesti | Media opzionali | Note |
|---|---|---|---|
text-to-video | prompt | duration, aspect_ratio, resolution, seed | Solo prompt testuale. image_urls, video_urls e audio_urls non sono necessari. |
image-to-video | prompt + array image_urls (1-2 URL di immagini) | duration, aspect_ratio, resolution, seed | image_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-video | prompt + almeno un'immagine o un video | immagini, video e audio entro i limiti dei materiali | L'audio non può essere utilizzato da solo con il testo. Aggiungi almeno un'immagine o un video quando viene fornito l'audio. |
text-to-videoUsa 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-videoUsa 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-videoUsa 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
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
| Intestazione | Obbligatorio | Descrizione | Esempio |
|---|---|---|---|
Authorization | Sì | Chiave API Bearer utilizzata per autenticare la richiesta. | Bearer sk_live_xxx |
Content-Type | Sì | Tutte le richieste di scrittura utilizzano JSON. | application/json |
Campi di livello superiore
| Campo | Tipo | Obbligatorio | Predefinito | Intervallo / Enum | Modalità | Esempio |
|---|---|---|---|---|---|---|
modelVariante del modello utilizzata per la generazione. | string | Sì | - | seedance-2-0 | seedance-2-0-fast | tutti | seedance-2-0 |
callback_urlEndpoint HTTPS che riceve i callback di completamento e fallimento del task. | string | No | - | URL HTTPS, nessuna rete privata | tutti | https://your-domain.com/hook |
inputImpostazioni di generazione e riferimenti multimediali. | object | Sì | - | - | tutti | - |
input.* campi
| Campo | Tipo | Obbligatorio | Predefinito | Intervallo / Enum | Modalità | Esempio |
|---|---|---|---|---|---|---|
input.promptPrompt testuale che descrive il video da creare. | string | Sì | - | testo non vuoto | tutti | a cat surfing |
input.generation_typeModalità di generazione. Il valore predefinito è text-to-video. | string | No | text-to-video | text-to-video | image-to-video | reference-to-video | - | image-to-video |
input.image_urlsURL 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_urlsVideo 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_urlsFile 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.durationLunghezza del video di output in secondi. | int | No | 5 | 4-15 secondi | tutti | 5 |
input.aspect_ratioRapporto d'aspetto dell'output. adaptive consente al servizio di inferire il miglior rapporto. | string | No | adaptive | 16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adattivo | tutti | 16:9 |
input.resolutionLivello di risoluzione dell'output. | string | No | 720p | 480p | 720p | 1080p | tutti | 720p |
input.generate_audioSe il modello deve generare audio quando supportato. | boolean | No | true | true | false | tutti | true |
input.watermarkSe aggiungere una filigrana. | boolean | No | false | true | false | tutti | false |
input.web_searchSe consentire l'aumento della ricerca web quando supportato. | boolean | No | false | true | false | tutti | false |
input.return_last_frameSe restituire l'URL dell'ultimo frame quando disponibile. | boolean | No | false | true | false | tutti | false |
input.seedSeed deterministico. Usa -1 per un seed casuale. | int | No | -1 | -1 o 0-4294967295 | tutti | -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 creditiRisposta
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"
}| Valore | Significato |
|---|---|
status=queued | Accettato e in attesa di essere inviato o elaborato. |
status=generating | Il provider sta elaborando la generazione. |
status=completed | Video completato e data.results contiene l'URL del risultato. |
status=failed | Generazione fallita o scaduta. |
billing_status=reserved | I crediti sono riservati mentre il task è in corso. |
billing_status=charged | Il task è riuscito e la prenotazione è saldata. |
billing_status=refunded | Il task è fallito o è scaduto e i crediti sono stati restituiti. |
billing_status=refund_failed | La 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
}
}| Codice | HTTP | Significato | Riprovare? |
|---|---|---|---|
invalid_request | 400 | Parametri mancanti o non validi. | No, correggi la richiesta. |
invalid_api_key | 401 | La chiave API è mancante, non valida o revocata. | No, usa una chiave valida. |
insufficient_credits | 402 | Crediti insufficienti. Il task non viene accettato o addebitato. | Dopo la ricarica. |
forbidden | 403 | Alla chiave API manca lo scope richiesto. | No. |
not_found | 404 | Il task non esiste o non appartiene al proprietario della chiave. | No. |
rate_limited | 429 | Frequenza di richiesta superata. | Sì, segui Retry-After. |
internal_error | 500 | Errore 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.