Seedance 2.0 API
Integrieren Sie Videogenerierung in Ihr Produkt mit asynchroner Aufgabenerstellung, Statusabfrage, Webhooks und guthabenbasierter Abrechnung.
https://api.seedance2.aiAuf dieser Seite
Einführung
Die API ermöglicht es Ihnen, Seedance 2.0 Videogenerierungsaufgaben programmatisch zu übermitteln. Die Generierung ist asynchron: Erstellen Sie eine Aufgabe, erhalten Sie sofort eine Aufgaben-ID, und rufen Sie dann das fertige Video ab, indem Sie den Aufgabenendpunkt abfragen oder einen Webhook empfangen.
Asynchrone Aufgaben
Polling funktioniert gut für die Entwicklung und einfache Integrationen.
Webhook bereit
Webhooks werden für die Produktion empfohlen, da sie aggressives Polling vermeiden und Ihren Dienst benachrichtigen, wenn eine Aufgabe einen Endzustand erreicht.
Credits-bewusst
Credits werden bei der Einreichung reserviert. Erfolgreiche Aufgaben werden von dieser Reservierung abgebucht; fehlgeschlagene oder abgelaufene Aufgaben werden automatisch zurückerstattet.
Authentifizierung
Erstellen Sie im Dashboard einen API-Schlüssel und senden Sie ihn bei jeder Anfrage als Bearer-Token. Der vollständige Schlüssel wird nur einmal zum Zeitpunkt der Erstellung angezeigt.
Authorization: Bearer sk_live_xxxxxxxxVerwenden Sie sk_live_ Schlüssel für den Produktionsverkehr.
Verwenden Sie sk_test_ Schlüssel für Sandbox-Integrationstests mit demselben API-Vertrag.
Fehlende, ungültige oder widerrufene Schlüssel geben invalid_api_key mit HTTP 401 zurück.
Schnellstart
Senden Sie zuerst eine Aufgabe. Nachdem die Aufgabe angenommen wurde, wählen Sie eine Methode zur Ergebnisbereitstellung: Abfragen des Aufgabenendpunkts oder Empfangen des Endergebnisses über einen Webhook.
Erstellen Sie eine asynchrone Videoaufgabe und erhalten Sie sofort eine Aufgaben-ID.
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
}
}'Rufen Sie den Aufgabenstatus-Endpunkt ab, wenn Ihre Integration explizites Polling bevorzugt.
curl https://api.seedance2.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Übergeben Sie callback_url beim Senden der Aufgabe, und empfangen Sie dann Abschluss- oder Fehler-Callbacks und aktualisieren Sie Ihren eigenen Aufgaben-Datensatz.
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 });
}Videoaufgabe erstellen
Erstellen Sie eine Videoaufgabe mit POST /v1/videos/generations. Der Anfragetext enthält ein Top-Level-Modell, eine optionale callback_url und ein Eingabeobjekt mit prompt und Generierungseinstellungen.
/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
}
}'Generierungsmodi
generation_type steuert, welche Medieneingaben akzeptiert werden und wie das Modell sie interpretiert.
| Modus | Erforderliche Medien | Optionale Medien | Hinweise |
|---|---|---|---|
text-to-video | prompt | duration, aspect_ratio, resolution, seed | Nur Text-Prompt. image_urls, video_urls und audio_urls werden nicht benötigt. |
image-to-video | prompt + image_urls Array (1-2 Bild-URLs) | duration, aspect_ratio, resolution, seed | image_urls muss ein Array sein. Geben Sie 1 Bild-URL für den ersten Frame oder 2 Bild-URLs für den ersten und letzten Frame an. Video und Audio werden ignoriert. |
reference-to-video | prompt + mindestens ein Bild oder Video | Bilder, Videos und Audio innerhalb der Materiallimits | Audio kann nicht allein mit Text verwendet werden. Fügen Sie mindestens ein Bild oder Video hinzu, wenn Audio bereitgestellt wird. |
text-to-videoVerwenden Sie Text-zu-Video, wenn der Prompt die einzige kreative Eingabe ist. (text-to-video)
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-videoVerwenden Sie Bild-zu-Video, wenn input.image_urls ein Array mit 1-2 Bild-URLs ist: Eine URL legt den ersten Frame fest, und zwei URLs legen den ersten und letzten Frame fest. Video- und Audioreferenzen werden in diesem Modus ignoriert. (image-to-video)
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-videoVerwenden Sie Referenz-zu-Video für eine reichhaltigere Steuerung mit Referenzbildern, -videos und -audio. Audio kann nicht allein mit Text verwendet werden; fügen Sie mindestens ein Bild oder Video hinzu, wenn Audio bereitgestellt wird. (reference-to-video)
Materiallimits
- Bis zu 9 Referenzbilder
- Bis zu 3 Referenzvideos, Gesamtdauer <= 15 Sekunden
- Bis zu 3 Referenzaudios, Gesamtdauer <= 15 Sekunden
- Maximal 12 Materialien insgesamt über alle Typen hinweg
Unterstützte Eingabekombinationen
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"
}
}'Anfrageparameter
Parameternamen, Enum-Werte, Endpunktpfade und Beispiele sind Teil des API-Vertrags. Die folgenden Beschreibungen erklären, wie sich jedes Feld verhält.
Header
| Header | Erforderlich | Beschreibung | Beispiel |
|---|---|---|---|
Authorization | Ja | Bearer API-Schlüssel zur Authentifizierung der Anfrage. | Bearer sk_live_xxx |
Content-Type | Ja | Alle Schreibanfragen verwenden JSON. | application/json |
Top-Level-Felder
| Feld | Typ | Erforderlich | Standard | Bereich / Enum | Modi | Beispiel |
|---|---|---|---|---|---|---|
modelModellvariante, die für die Generierung verwendet wird. | string | Ja | - | seedance-2-0 | seedance-2-0-fast | alle | seedance-2-0 |
callback_urlHTTPS-Endpunkt, der Callback-Benachrichtigungen bei Aufgabenerfolg oder -fehler empfängt. | string | Nein | - | HTTPS-URL, keine privaten Netzwerke | alle | https://your-domain.com/hook |
inputGenerierungseinstellungen und Medienreferenzen. | object | Ja | - | - | alle | - |
input.* Felder
| Feld | Typ | Erforderlich | Standard | Bereich / Enum | Modi | Beispiel |
|---|---|---|---|---|---|---|
input.promptText-Prompt, der das zu erstellende Video beschreibt. | string | Ja | - | nicht-leerer Text | alle | a cat surfing |
input.generation_typeGenerierungsmodus. Standardwert ist Text-zu-Video. (text-to-video) | string | Nein | text-to-video | text-to-video | image-to-video | reference-to-video | - | image-to-video |
input.image_urlsÖffentlich erreichbare Bild-URLs. Für Bild-zu-Video senden Sie 1 Bild für den ersten Frame oder 2 Bilder für den ersten und letzten Frame. Für Referenz-zu-Video senden Sie bis zu 9 Bilder als visuelle Referenzen. (image-to-video) (reference-to-video) | string[] | Bedingt | [] | Bild-zu-Video: 1 oder 2 Bilder. Referenz-zu-Video: bis zu 9 Bilder. (image-to-video) (reference-to-video) | image-to-video / reference-to-video | ["https://.../a.jpg"] |
input.video_urlsÖffentlich erreichbare Referenzvideos nur für Referenz-zu-Video. Sie können bis zu 3 Videodateien senden, und ihre kombinierte Wiedergabezeit muss 15 Sekunden oder weniger betragen. (reference-to-video) | string[] | Nein | [] | Bis zu 3 Videos. Die kombinierte Videolänge muss 15 Sekunden oder weniger betragen. | reference-to-video | [] |
input.audio_urlsÖffentlich erreichbare Referenzaudiodateien nur für Referenz-zu-Video. Sie können bis zu 3 Audiodateien senden, und ihre kombinierte Wiedergabezeit muss 15 Sekunden oder weniger betragen. (reference-to-video) | string[] | Nein | [] | Bis zu 3 Audiodateien. Die kombinierte Audiolänge muss 15 Sekunden oder weniger betragen. | reference-to-video | [] |
input.durationAusgabevideolänge in Sekunden. | int | Nein | 5 | 4-15 Sekunden | alle | 5 |
input.aspect_ratioAusgabe-Seitenverhältnis. adaptiv lässt den Dienst das beste Verhältnis ableiten. | string | Nein | adaptive | 16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adaptiv | alle | 16:9 |
input.resolutionAusgabeauflösungsstufe. | string | Nein | 720p | 480p | 720p | 1080p | alle | 720p |
input.generate_audioOb das Modell, wenn unterstützt, Audio generieren soll. | boolean | Nein | true | true | false | alle | true |
input.watermarkOb ein Wasserzeichen hinzugefügt werden soll. | boolean | Nein | false | true | false | alle | false |
input.web_searchOb Web-Such-Erweiterung, wenn unterstützt, erlaubt sein soll. | boolean | Nein | false | true | false | alle | false |
input.return_last_frameOb die URL des letzten Frames zurückgegeben werden soll, wenn verfügbar. | boolean | Nein | false | true | false | alle | false |
input.seedDeterministischer Seed. Verwenden Sie -1 für einen zufälligen Seed. | int | Nein | -1 | -1 oder 0-4294967295 | alle | -1 |
Credits variieren je nach Auflösung, Dauer, Modell und ob Referenz-zu-Video Videoreferenzen enthält. Der von der Erstellungsantwort zurückgegebene Kreditwert ist der tatsächlich reservierte Betrag für diese Aufgabe. (reference-to-video)
Credit-Preise anzeigenAntwort
Dies ist die Erfolgsantwort von POST /v1/videos/generations. Es bedeutet, dass die Aufgabe angenommen wurde und Credits reserviert wurden. Verwenden Sie die zurückgegebene taskId, um GET /v1/tasks/:id abzufragen oder einen Abschluss- oder Fehler-Callback abzugleichen.
POST /v1/videos/generations Erfolgsantwort
{
"taskId": "3f2aK9mR...",
"credits": 60
}Aufgabenstatus abrufen
Verwenden Sie GET /v1/tasks/:id, um den aktuellen Aufgabenstatus abzurufen. Fragen Sie nicht öfter als einmal alle 10 Sekunden ab. Für Produktionssysteme bevorzugen Sie Webhooks.
curl https://api.seedance2.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Abgeschlossene Aufgabenantwort
{
"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
}
}Fehlgeschlagene Aufgabenantwort
{
"id": "3f2aK9mR...",
"status": "failed",
"created_at": 1781234567,
"model": "seedance-2-0",
"billing_status": "refunded",
"credits": 60,
"failed_reason": "provider_failed"
}| Wert | Bedeutung |
|---|---|
status=queued | Akzeptiert und wartet auf Übermittlung oder Verarbeitung. |
status=generating | Anbieter verarbeitet die Generierung. |
status=completed | Video abgeschlossen und data.results enthält die Ergebnis-URL. |
status=failed | Generierung fehlgeschlagen oder abgelaufen. |
billing_status=reserved | Credits werden reserviert, während die Aufgabe läuft. |
billing_status=charged | Aufgabe erfolgreich und die Reservierung ist abgerechnet. |
billing_status=refunded | Aufgabe fehlgeschlagen oder abgelaufen und Credits wurden zurückerstattet. |
billing_status=refund_failed | Rückerstattungstransaktion fehlgeschlagen und erfordert manuelle Bearbeitung. |
Nach video_expires_at ist data.results leer. Laden Sie die Datei herunter und speichern Sie sie, bevor das Gültigkeitsfenster endet.
Webhooks
Wenn callback_url vorhanden ist, ruft Seedance Ihren Endpunkt auf, wenn die Aufgabe abgeschlossen oder fehlgeschlagen ist, und sendet JSON-Daten, die das Endergebnis beschreiben. Wenn Ihr Endpunkt eine Nicht-2xx-Antwort zurückgibt oder nicht innerhalb von 15 Sekunden antwortet, wird die Zustellung bis zu 5 Mal wiederholt. Wiederholungsversuche verwenden dieselbe Aufgaben-ID, also deduplizieren Sie nach ID. Geben Sie eine 200-Antwort zurück, sobald Sie die Callback-Daten sicher gespeichert haben.
Callback bei Aufgabenerfolg
{
"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 bei Aufgabenfehler
{
"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 });
}Überprüfen Sie die Form der Callback-Daten, deduplizieren Sie nach ID, aktualisieren Sie Ihren eigenen Aufgaben-Datensatz und antworten Sie schnell.
callback_url muss HTTPS sein und darf nicht auf private, Loopback- oder Link-Local-Netzwerkbereiche zeigen.
Fehler
POST /v1/videos/generations und GET /v1/tasks/:id geben diese Fehlerform zurück, wenn die API-Anfrage selbst fehlschlägt, z. B. ungültige Parameter, ungültiger API-Schlüssel, unzureichende Credits, Ratenbegrenzung oder Aufgabe nicht gefunden. Einige Fehler enthalten zusätzliche Felder wie required, available oder retry_after, je nach Situation.
{
"error": {
"code": "insufficient_credits",
"message": "Not enough credits for this task.",
"required": 60,
"available": 12
}
}| Code | HTTP | Bedeutung | Wiederholen? |
|---|---|---|---|
invalid_request | 400 | Fehlende oder ungültige Parameter. | Nein, beheben Sie die Anfrage. |
invalid_api_key | 401 | API-Schlüssel fehlt, ist ungültig oder widerrufen. | Nein, verwenden Sie einen gültigen Schlüssel. |
insufficient_credits | 402 | Nicht genügend Credits. Die Aufgabe wird nicht angenommen oder berechnet. | Nach dem Aufladen. |
forbidden | 403 | API-Schlüssel besitzt nicht den erforderlichen Geltungsbereich. | Nein. |
not_found | 404 | Aufgabe existiert nicht oder gehört nicht dem Schlüsselbesitzer. | Nein. |
rate_limited | 429 | Anfragerate überschritten. | Ja, folgen Sie Retry-After. |
internal_error | 500 | Serverfehler. | Ja, später erneut versuchen. |
Ratenbegrenzungen
Ratenbegrenzungen werden pro API-Schlüssel mit einem gleitenden Fenster angewendet. Die Generierung ist standardmäßig auf 60 Anfragen pro Minute begrenzt; Statusabfragen sind nachsichtiger. HTTP 429-Antworten enthalten Retry-After.
Generierung
60/min
Statusabfragen
Nachsichtiger
429 Header
Retry-After
Abrechnung & Credits
Die API verwendet: Reservierung bei Einreichung, Abrechnung bei Erfolg und Rückerstattung bei Misserfolg. Die Nutzungsseiten im Dashboard zeigen die API-Guthabenhistorie, Aufgabenprotokolle und zeitbasierte Nutzungsstatistiken.
Reserviert
Credits werden geprüft und reserviert, wenn die Aufgabe angenommen wird.
Abgerechnet
Abgeschlossene Aufgaben verrechnen die bestehende Reservierung.
Zurückerstattet
Fehlgeschlagene oder abgelaufene Aufgaben geben die reservierten Credits automatisch zurück.
Nutzung im Dashboard überprüfen
API-Protokolle, Aufgabentimelines, Kreditverlauf und zeitbasierte Nutzungsstatistiken anzeigen.