Seedance-API
Integrieren Sie die Videogenerierung mit Seedance 2.5 oder Seedance 2.0, asynchronen Tasks, Webhooks und guthabenbasierter Abrechnung direkt in Ihr Produkt.
https://api.seevio.aiAuf dieser Seite
Einführung
Mit der API können Sie Videogenerierungstasks für Seedance 2.5 und Seedance 2.0 programmatisch starten. Seedance 2.5 ist das empfohlene Modell und unterstützt Text-to-Video, Image-to-Video (mit erstem Frame oder erstem und letztem Frame) sowie multimodales Reference-to-Video. Die Generierung erfolgt asynchron: Sie erstellen einen Task, erhalten sofort eine Task-ID und rufen das fertige Video entweder per Polling über den Task-Endpunkt ab oder lassen es sich per Webhook senden.
Asynchrone Tasks
Polling eignet sich ideal für die Entwicklungsphase und einfache Integrationen.
Webhook-bereit
Webhooks werden für den Produktivbetrieb empfohlen, da sie unnötige Abfragen (Polling) vermeiden und Ihr System sofort benachrichtigen, sobald ein Task einen Endzustand erreicht.
Guthaben-basiert
Das benötigte Guthaben wird beim Absenden des Tasks reserviert. Bei erfolgreichem Abschluss wird die Reservierung abgebucht; fehlgeschlagene Tasks oder Zeitüberschreitungen werden automatisch zurückerstattet.
Authentifizierung
Erstellen Sie im Dashboard einen API-Key und senden Sie diesen bei jeder Anfrage als Bearer-Token mit. Der vollständige Key wird Ihnen nur ein einziges Mal direkt nach der Erstellung angezeigt.
Authorization: Bearer sk_live_xxxxxxxxVerwenden Sie sk_live_ Keys für den echten Produktivbetrieb.
Verwenden Sie sk_test_ Keys für Integrationstests in der Sandbox-Umgebung mit exakt denselben API-Bedingungen.
Fehlende, ungültige oder widerrufene Keys führen zu einem invalid_api_key-Fehler mit dem HTTP-Status 401.
Schnellstart
Senden Sie zuerst einen Task ab. Sobald dieser akzeptiert wurde, wählen Sie eine Methode zur Bereitstellung des Ergebnisses: Fragen Sie den Task-Endpunkt ab (Polling) oder empfangen Sie das finale Ergebnis direkt über einen Webhook.
Erstellen Sie einen asynchronen Videotask und erhalten Sie sofort eine Task-ID zurück.
curl https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-5",
"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
}
}'Fragen Sie den Task-Status-Endpunkt ab, wenn Ihre Integration explizites Polling bevorzugt.
curl https://api.seevio.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Übergeben Sie beim Erstellen des Tasks eine callback_url, um bei Erfolg oder Fehler automatisch benachrichtigt zu werden und Ihre eigenen Datensätze zu aktualisieren.
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 });
}Videotask erstellen
Erstellen Sie einen Videotask mit POST /v1/videos/generations. Der Request-Body enthält das primäre model, eine optionale callback_url sowie ein input-Objekt mit dem Prompt und den Generierungseinstellungen.
/v1/videos/generationscurl https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-5",
"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
}
}'Generierungsmodi
generation_type steuert, welche Medien-Inputs akzeptiert und wie diese vom Modell interpretiert werden.
Setzen Sie model auf seedance-2-5, um Videos in 480p oder 720p mit einer Länge von 4 bis 30 Sekunden zu generieren.
- Text-to-Video mit Seitenverhältnissen wie Adaptive, 16:9, 9:16, 1:1, 4:3, 3:4 oder 21:9
- Image-to-Video basierend auf einem Bild (erster Frame) oder zwei Bildern (erster und letzter Frame); das Seitenverhältnis muss hierbei auf adaptive gesetzt sein
- Reference-to-Video mit bis zu 30 Bildern, 10 Videos und 10 Audiodateien (maximal 50 Referenzmedien insgesamt)
- Jedes Referenzvideo und jedes Audio-Referenzdokument muss zwischen 2 und 30 Sekunden lang sein; die Gesamtlänge aller Videos bzw. aller Audiodateien darf jeweils 30 Sekunden nicht überschreiten
- Reine Audio-Referenzen sowie return_last_frame werden unterstützt; seed wird nicht unterstützt
| 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 sind nicht erforderlich. |
image-to-video | prompt + image_urls-Array (1–2 Bild-URLs) | duration, aspect_ratio, resolution, seed | image_urls muss als Array übergeben werden. Nutzen Sie 1 Bild-URL für den ersten Frame oder 2 Bild-URLs für den ersten und letzten Frame. Video und Audio werden ignoriert. |
reference-to-video | prompt + mindestens ein Bild, Video oder Audio als Referenz | Bilder, Videos und Audio im Rahmen der erlaubten Limits | Seedance 2.5 unterstützt reine Audio-Referenzen. Fügen Sie bei Seedance 2.0 mindestens ein Bild oder Video hinzu, wenn Audio verwendet wird. |
text-to-videoVerwenden Sie Text-to-Video, wenn der Text-Prompt Ihre einzige kreative Eingabe ist.
curl https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-5",
"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
}
}'image-to-videoVerwenden Sie Image-to-Video, wenn input.image_urls ein Array mit 1–2 Bild-URLs enthält: Eine URL definiert den ersten Frame, zwei URLs definieren den ersten und den letzten Frame. Video- und Audio-Referenzen werden in diesem Modus ignoriert.
curl https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-5",
"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-videoNutzen Sie Reference-to-Video für eine präzisere Steuerung mittels Referenzbildern, -videos und -audio. Seedance 2.5 unterstützt reine Audio-Referenzen; Seedance 2.0 erfordert bei der Bereitstellung von Audio mindestens ein zusätzliches Bild oder Video.
Limits für Referenzmedien
- Seedance 2.5: bis zu 30 Referenzbilder
- Seedance 2.5: bis zu 10 Referenzvideos (je 2–30 Sek., Gesamtlänge <= 30 Sek.)
- Seedance 2.5: bis zu 10 Referenzaudios (je 2–30 Sek., Gesamtlänge <= 30 Sek.)
- Seedance 2.5: maximal 50 Referenzmedien insgesamt über alle Typen hinweg
- Seedance 2.0-Varianten behalten ihre bisherigen Limits: 9 Bilder, 3 Videos, 3 Audios und maximal 15 Sekunden pro Video-/Audio-Gruppe
Unterstützte Input-Kombinationen
curl https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-5",
"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": "720p"
}
}'Anfrageparameter
Parameternamen, Enum-Werte, Endpunkt-Pfade und Beispiele sind fester Bestandteil des API-Vertrags. Die folgenden Beschreibungen erläutern die Funktionsweise der einzelnen Felder.
Header
| Header | Erforderlich | Beschreibung | Beispiel |
|---|---|---|---|
Authorization | Ja | Der zur Authentifizierung der Anfrage verwendete Bearer-API-Key. | Bearer sk_live_xxx |
Content-Type | Ja | Alle Schreibanfragen nutzen JSON. | application/json |
Felder auf oberster Ebene
| Feld | Typ | Erforderlich | Standard | Bereich / Enum | Modi | Beispiel |
|---|---|---|---|---|---|---|
modelDie für die Generierung verwendete Modellvariante. Nutzen Sie seedance-2-5 für Seedance 2.5, seedance-2-0 für Seedance 2.0, seedance-2-0-fast für Seedance 2.0 Fast oder seedance-2-0-mini für Seedance 2.0 Mini. | string | Ja | - | seedance-2-5 | seedance-2-0 | seedance-2-0-fast | seedance-2-0-mini | alle | seedance-2-5 |
callback_urlHTTPS-Endpunkt, der Benachrichtigungen bei erfolgreichem oder fehlgeschlagenem Task empfängt. | string | Nein | - | HTTPS-URL, keine privaten Netzwerke | alle | https://your-domain.com/hook |
inputGenerierungseinstellungen und Referenzmedien. | 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-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 Image-to-Video senden Sie 1 Bild für den ersten Frame oder 2 Bilder für den ersten und letzten Frame. Für Reference-to-Video unterstützt Seedance 2.5 bis zu 30 Bilder und Seedance 2.0 bis zu 9 Bilder. | string[] | Bedingt | [] | Image-to-Video: 1 oder 2 Bilder. Reference-to-Video: bis zu 30 für Seedance 2.5; bis zu 9 für Seedance 2.0. | image-to-video / reference-to-video | ["https://.../a.jpg"] |
input.video_urlsÖffentlich erreichbare Referenzvideos (nur für Reference-to-Video). Seedance 2.5 unterstützt bis zu 10 Videos mit einer Länge von je 2–30 Sekunden und einer Gesamtlänge von <= 30 Sekunden. Seedance 2.0 unterstützt bis zu 3 Videos mit einer Gesamtlänge von <= 15 Sekunden. | string[] | Nein | [] | Seedance 2.5: bis zu 10 Videos, je 2–30 Sek., Gesamtlänge <= 30 Sek. Seedance 2.0: bis zu 3, Gesamtlänge <= 15 Sek. | reference-to-video | [] |
input.audio_urlsÖffentlich erreichbare Referenzaudiodateien (nur für Reference-to-Video). Seedance 2.5 unterstützt bis zu 10 Audiodateien mit einer Länge von je 2–30 Sekunden und einer Gesamtlänge von <= 30 Sekunden sowie reine Audio-Referenzen. Seedance 2.0 unterstützt bis zu 3 Audiodateien mit einer Gesamtlänge von <= 15 Sekunden. | string[] | Nein | [] | Seedance 2.5: bis zu 10 Audiodateien, je 2–30 Sek., Gesamtlänge <= 30 Sek. Seedance 2.0: bis zu 3, Gesamtlänge <= 15 Sek. | reference-to-video | [] |
input.durationLänge des fertigen Videos in Sekunden. | int | Nein | 5 | Seedance 2.5: 4–30 Sekunden. Seedance 2.0: 4–15 Sekunden. | alle | 5 |
input.aspect_ratioSeitenverhältnis des Ausgabevideos. Bei adaptive ermittelt das System das optimale Verhältnis. Seedance 2.5 Image-to-Video unterstützt nur adaptive. | string | Nein | adaptive | 16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adaptive | alle | 16:9 |
input.resolutionAuflösungsstufe des Ausgabevideos. | string | Nein | 720p | Seedance 2.5: 480p | 720p. Seedance 2.0: 480p | 720p | 1080p | 4k (je nach Variante). | alle | 720p |
input.generate_audioLegt fest, ob das Modell Audio generieren soll, sofern unterstützt. | boolean | Nein | true | true | false | alle | true |
input.watermarkLegt fest, ob ein Wasserzeichen hinzugefügt werden soll. | boolean | Nein | false | true | false | alle | false |
input.web_searchLegt fest, ob Websuche-Augmentierung erlaubt ist, sofern unterstützt. | boolean | Nein | false | true | false | alle | false |
input.return_last_frameLegt fest, ob die URL des letzten Frames zurückgegeben werden soll, sofern verfügbar. | boolean | Nein | false | true | false | alle | false |
input.seedDeterministischer Seed für Seedance 2.0-Varianten. Wird von Seedance 2.5 nicht unterstützt und sollte weggelassen werden. | int | Nein | -1 | -1 oder 0-4294967295 | alle | -1 |
Die verbrauchten Credits hängen von der Auflösung, der Dauer, dem Modell und der Frage ab, ob bei Reference-to-Video Videos als Referenz verwendet werden. Der in der Create-Antwort zurückgegebene credits-Wert entspricht dem exakt reservierten Betrag für diesen Task.
Preise für Credits ansehenAntwort
Dies ist die Erfolgsantwort von POST /v1/videos/generations. Sie bestätigt, dass der Task akzeptiert und das Guthaben reserviert wurde. Nutzen Sie die zurückgegebene taskId für Polling über GET /v1/tasks/:id oder zum Abgleich mit einem Webhook-Callback.
Erfolgsantwort für POST /v1/videos/generations
{
"taskId": "3f2aK9mR...",
"credits": 100
}Task-Status abrufen
Nutzen Sie GET /v1/tasks/:id, um den aktuellen Task-Status abzurufen. Führen Sie Polling maximal alle 10 Sekunden durch. Für Produktionsumgebungen wird die Nutzung von Webhooks empfohlen.
curl https://api.seevio.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Antwort bei erfolgreichem Task
{
"id": "3f2aK9mR...",
"status": "completed",
"created_at": 1781234567,
"model": "seedance-2-5",
"billing_status": "charged",
"credits": 100,
"failed_reason": null,
"data": {
"results": ["https://cdn.seevio.ai/.../x.mp4"],
"video_expires_at": "2026-06-13T10:00:00Z",
"last_frame_url": null,
"processing_time": 48
}
}Antwort bei fehlgeschlagenem Task
{
"id": "3f2aK9mR...",
"status": "failed",
"created_at": 1781234567,
"model": "seedance-2-5",
"billing_status": "refunded",
"credits": 100,
"failed_reason": "provider_failed"
}| Wert | Bedeutung |
|---|---|
status=queued | Akzeptiert und wartet auf Übermittlung oder Verarbeitung. |
status=generating | Der Provider verarbeitet die Generierung. |
status=completed | Video fertiggestellt; data.results enthält die Ergebnis-URL. |
status=failed | Generierung fehlgeschlagen oder Zeitüberschreitung. |
billing_status=reserved | Guthaben ist reserviert, solange der Task läuft. |
billing_status=charged | Task erfolgreich abgeschlossen und Reservierung verbucht. |
billing_status=refunded | Task fehlgeschlagen oder Zeitüberschreitung – Guthaben wurde zurückerstattet. |
billing_status=refund_failed | Rückerstattung fehlgeschlagen und erfordert manuelle Prüfung. |
Nach Ablauf von video_expires_at ist data.results leer. Laden Sie die Datei herunter und speichern Sie sie, bevor das Gültigkeitsfenster abläuft.
Webhooks
Wenn eine callback_url angegeben ist, ruft Seedance Ihren Endpunkt auf, sobald der Task erfolgreich abgeschlossen wurde oder fehlgeschlagen ist, und sendet JSON-Daten mit dem finalen Ergebnis. Wenn Ihr Endpunkt keinen 2xx-Erfolgscode zurückgibt oder nicht innerhalb von 15 Sekunden antwortet, wird die Zustellung bis zu 5-mal wiederholt. Wiederholungsversuche nutzen dieselbe task id – führen Sie daher eine Duplikatsbereinigung anhand der ID durch. Senden Sie eine 200-Antwort zurück, sobald Sie die Callback-Daten sicher gespeichert haben.
Callback bei erfolgreichem Task
{
"id": "3f2aK9mR...",
"status": "completed",
"created_at": 1781234567,
"model": "seedance-2-5",
"data": {
"results": ["https://cdn.seevio.ai/.../x.mp4"],
"video_expires_at": "2026-06-13T10:00:00Z",
"last_frame_url": null,
"processing_time": 48
}
}Callback bei fehlgeschlagenem Task
{
"id": "3f2aK9mR...",
"status": "failed",
"created_at": 1781234567,
"model": "seedance-2-5",
"data": {
"failed_reason": "provider_failed",
"credits_refunded": 100
}
}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 });
}Validieren Sie die Struktur der Callback-Daten, filtern Sie Duplikate anhand der ID heraus, aktualisieren Sie Ihren eigenen Task-Datensatz und antworten Sie zeitnah.
Die callback_url muss eine HTTPS-Verbindung nutzen und darf nicht auf private IP-Bereiche, Loopbacks oder Link-Local-Netzwerke verweisen.
Fehler
POST /v1/videos/generations und GET /v1/tasks/:id geben diese Fehlerstruktur zurück, wenn die API-Anfrage selbst fehlschlägt (z. B. bei ungültigen Parametern, falschem API-Key, unzureichendem Guthaben, Rate-Limiting oder wenn der Task nicht gefunden wurde). Einige Fehler enthalten je nach Kontext zusätzliche Felder wie required, available oder retry_after.
{
"error": {
"code": "insufficient_credits",
"message": "Not enough credits for this task.",
"required": 100,
"available": 12
}
}| Code | HTTP | Bedeutung | Wiederholen? |
|---|---|---|---|
invalid_request | 400 | Fehlende oder ungültige Parameter. | Nein, korrigieren Sie die Anfrage. |
invalid_api_key | 401 | API-Key fehlt, ist ungültig oder wurde widerrufen. | Nein, nutzen Sie einen gültigen Key. |
insufficient_credits | 402 | Nicht genügend Guthaben. Der Task wird weder akzeptiert noch berechnet. | Nach dem Aufladen des Guthabens. |
forbidden | 403 | Dem API-Key fehlen die erforderlichen Berechtigungen (Scope). | Nein. |
not_found | 404 | Der Task existiert nicht oder gehört nicht zum Inhaber des API-Keys. | Nein. |
rate_limited | 429 | Limit für die Anzahl der Anfragen überschritten. | Ja, beachten Sie den Header Retry-After. |
internal_error | 500 | Interner Serverfehler. | Ja, versuchen Sie es später noch einmal. |
Rate Limits
Rate Limits werden pro API-Key über ein gleitendes Zeitfenster (Sliding Window) angewendet. Die Videogenerierung ist standardmäßig auf 100 Anfragen pro Minute beschränkt; Statusabfragen sind großzügiger geregelt. HTTP-429-Antworten enthalten einen Retry-After-Header.
Generierung
100/Min.
Statusabfragen
Toleranter geregelt
429-Header
Retry-After
Abrechnung & Guthaben
Die API nutzt das Prinzip: Reservierung beim Absenden, Abbuchung bei Erfolg und Rückerstattung bei Fehlern. Im Dashboard finden Sie den API-Guthabenverlauf, Task-Logs und zeitbasierte Nutzungsstatistiken.
Reserviert
Das Guthaben wird geprüft und reserviert, sobald der Task akzeptiert wird.
Abgebucht
Erfolgreich abgeschlossene Tasks verrechnen die bestehende Reservierung endgültig.
Zurückerstattet
Fehlgeschlagene Tasks oder Zeitüberschreitungen geben das reservierte Guthaben automatisch wieder frei.
Nutzung im Dashboard analysieren
Sehen Sie API-Logs, Task-Zeitverläufe, den Guthabenverlauf und zeitbasierte Nutzungsdaten ein.