Die Seedance 2.0 API bietet programmatischen Zugang zu ByteDances KI-Videogenerierungsmodell. Dieser Leitfaden behandelt alles, was Entwickler für die Integration von Seedance in Anwendungen und Produktions-Workflows benötigen, von der Authentifizierung über asynchrones Polling bis hin zu Webhook-gesteuerten Architekturen.
API-Überblick
Die Seedance 2.0 REST API stellt Endpunkte für Text-zu-Video-Generierung, Bild-zu-Video-Generierung, Status-Polling und Ergebnisabruf bereit. Alle Generierungen sind asynchron: Sie senden eine Anfrage, erhalten eine Task-ID und pollen oder warten auf einen Webhook, um das Ergebnis zu erhalten.
| Funktion | Endpunkt | Methode |
|---|---|---|
| Text-zu-Video | /v2/generate/text | POST |
| Bild-zu-Video | /v2/generate/image | POST |
| Statusprüfung | /v2/tasks/{task_id} | GET |
| Ergebnis-Download | /v2/tasks/{task_id}/result | GET |
| Webhook-Konfiguration | /v2/webhooks | POST |
| Kontoinformationen | /v2/account | GET |
Basis-URL: https://api.seedance.ai
Antwortformat: Alle Endpunkte liefern JSON mit einer konsistenten Struktur, die status-, data- und error-Felder enthält.
Schnellstart (5 Minuten)
Kommen Sie in drei Schritten von Null zu Ihrem ersten generierten Video.
Schritt 1: API-Schlüssel erhalten. Erstellen Sie ein Konto im Dreamina-Entwicklerportal und navigieren Sie zu Einstellungen > API-Schlüssel, um einen Schlüssel zu generieren.
Schritt 2: Generierungsanfrage senden.
curl -X POST https://api.seedance.ai/v2/generate/text \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.0",
"prompt": "A golden retriever running through a field of sunflowers at sunset, slow motion, cinematic lighting",
"aspect_ratio": "16:9",
"duration": 4
}'Schritt 3: Ergebnis abfragen.
curl https://api.seedance.ai/v2/tasks/TASK_ID \
-H "Authorization: Bearer YOUR_API_KEY"Wenn status den Wert "completed" zurückgibt, enthält die Antwort ein video_url-Feld mit einem signierten Download-Link, der 24 Stunden gültig ist.
Authentifizierung
Alle API-Anfragen erfordern ein Bearer-Token im Authorization-Header. Ihr API-Schlüssel ist mit Ihrem Konto und Abrechnungsplan verknüpft.
JavaScript
const SEEDANCE_API_KEY = process.env.SEEDANCE_API_KEY
const headers = {
'Authorization': `Bearer ${SEEDANCE_API_KEY}`,
'Content-Type': 'application/json',
}Python
import os
import requests
SEEDANCE_API_KEY = os.environ["SEEDANCE_API_KEY"]
headers = {
"Authorization": f"Bearer {SEEDANCE_API_KEY}",
"Content-Type": "application/json",
}cURL
curl -H "Authorization: Bearer $SEEDANCE_API_KEY" \
-H "Content-Type: application/json" \
https://api.seedance.ai/v2/accountSicherheits-Best-Practices:
- API-Schlüssel in Umgebungsvariablen speichern, niemals im Quellcode
- Schlüssel regelmäßig über das Entwickler-Dashboard rotieren
- Separate Schlüssel für Entwicklungs- und Produktionsumgebungen verwenden
- Nutzung über das Konto-Dashboard überwachen, um unbefugte Verwendung zu erkennen
Text-zu-Video-Endpunkt
Generieren Sie Videos aus Textbeschreibungen. Dies ist der primäre Endpunkt für die meisten Anwendungsfälle.
Anfrageparameter:
| Parameter | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
model | string | Ja | — | Modellversion (seedance-2.0) |
prompt | string | Ja | — | Videobeschreibung (30-500 Zeichen) |
negative_prompt | string | Nein | — | Auszuschließende Elemente |
aspect_ratio | string | Nein | 16:9 | 16:9, 9:16 oder 1:1 |
duration | integer | Nein | 4 | 4 oder 8 Sekunden |
seed | integer | Nein | zufällig | Reproduzierbarkeits-Seed |
webhook_url | string | Nein | — | URL für Abschlussbenachrichtigung |
JavaScript-Beispiel
async function generateTextToVideo(prompt) {
const response = await fetch('https://api.seedance.ai/v2/generate/text', {
method: 'POST',
headers,
body: JSON.stringify({
model: 'seedance-2.0',
prompt,
aspect_ratio: '16:9',
duration: 4,
}),
})
const data = await response.json()
if (!data.data?.task_id) {
throw new Error(`Generation failed: ${data.error?.message ?? 'Unknown error'}`)
}
return data.data.task_id
}Python-Beispiel
def generate_text_to_video(prompt: str) -> str:
response = requests.post(
"https://api.seedance.ai/v2/generate/text",
headers=headers,
json={
"model": "seedance-2.0",
"prompt": prompt,
"aspect_ratio": "16:9",
"duration": 4,
},
)
response.raise_for_status()
data = response.json()
task_id = data.get("data", {}).get("task_id")
if not task_id:
raise ValueError(f"Generation failed: {data.get('error', {}).get('message', 'Unknown')}")
return task_idFür effektive Prompts siehe unseren Seedance-Prompt-Leitfaden mit über 50 sofort verwendbaren Vorlagen.
Bild-zu-Video-Endpunkt
Animieren Sie statische Bilder mit Bewegungs-Prompts. Das Bild liefert den visuellen Ausgangspunkt, und der Bewegungs-Prompt beschreibt, wie sich die Szene bewegen soll.
Anfrageparameter:
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
model | string | Ja | seedance-2.0 |
image | file/URL | Ja | Quellbild (JPEG/PNG, max. 10 MB) |
motion_prompt | string | Ja | Beschreibung der gewünschten Bewegung |
duration | integer | Nein | 4 oder 8 Sekunden |
seed | integer | Nein | Reproduzierbarkeits-Seed |
webhook_url | string | Nein | URL für Abschlussbenachrichtigung |
JavaScript-Beispiel (Datei-Upload)
async function generateImageToVideo(imagePath, motionPrompt) {
const imageBuffer = await fs.promises.readFile(imagePath)
const blob = new Blob([imageBuffer], { type: 'image/png' })
const formData = new FormData()
formData.append('model', 'seedance-2.0')
formData.append('image', blob, 'input.png')
formData.append('motion_prompt', motionPrompt)
formData.append('duration', '4')
const response = await fetch('https://api.seedance.ai/v2/generate/image', {
method: 'POST',
headers: { 'Authorization': `Bearer ${SEEDANCE_API_KEY}` },
body: formData,
})
const data = await response.json()
return data.data.task_id
}JavaScript-Beispiel (URL-Referenz)
async function generateImageToVideoFromUrl(imageUrl, motionPrompt) {
const response = await fetch('https://api.seedance.ai/v2/generate/image', {
method: 'POST',
headers,
body: JSON.stringify({
model: 'seedance-2.0',
image_url: imageUrl,
motion_prompt: motionPrompt,
duration: 4,
}),
})
const data = await response.json()
return data.data.task_id
}Python-Beispiel
def generate_image_to_video(image_path: str, motion_prompt: str) -> str:
with open(image_path, "rb") as f:
files = {"image": ("input.png", f, "image/png")}
data = {
"model": "seedance-2.0",
"motion_prompt": motion_prompt,
"duration": "4",
}
response = requests.post(
"https://api.seedance.ai/v2/generate/image",
headers={"Authorization": f"Bearer {SEEDANCE_API_KEY}"},
files=files,
data=data,
)
response.raise_for_status()
return response.json()["data"]["task_id"]Asynchrone Generierung und Status-Polling
Alle Seedance API-Generierungen sind asynchron. Nach dem Senden einer Anfrage erhalten Sie eine task_id und müssen den Abschluss abfragen. Die typische Generierungszeit beträgt 30-120 Sekunden, abhängig von Dauer und Serverauslastung.
Task-Statuswerte:
| Status | Beschreibung |
|---|---|
pending | Anfrage empfangen, zur Verarbeitung eingereiht |
processing | Generierung läuft |
completed | Video zum Download bereit |
failed | Generierung fehlgeschlagen (siehe error-Feld) |
JavaScript Polling-Implementierung
async function pollForResult(taskId, maxAttempts = 60, intervalMs = 3000) {
for (let attempt = 0; attempt < maxAttempts; attempt++) {
const response = await fetch(
`https://api.seedance.ai/v2/tasks/${taskId}`,
{ headers }
)
const data = await response.json()
const status = data.data?.status
if (status === 'completed') {
return data.data.video_url
}
if (status === 'failed') {
throw new Error(`Generation failed: ${data.data?.error ?? 'Unknown error'}`)
}
await new Promise((resolve) => setTimeout(resolve, intervalMs))
}
throw new Error('Generation timed out after maximum polling attempts')
}Python Polling-Implementierung
import time
def poll_for_result(task_id: str, max_attempts: int = 60, interval: float = 3.0) -> str:
for _ in range(max_attempts):
response = requests.get(
f"https://api.seedance.ai/v2/tasks/{task_id}",
headers=headers,
)
response.raise_for_status()
data = response.json()["data"]
if data["status"] == "completed":
return data["video_url"]
if data["status"] == "failed":
raise RuntimeError(f"Generation failed: {data.get('error', 'Unknown')}")
time.sleep(interval)
raise TimeoutError("Generation timed out")Polling-Best-Practices:
- In den ersten 30 Sekunden mit 3-Sekunden-Intervallen beginnen
- Nach 30 Sekunden auf 5-Sekunden-Intervalle erhöhen
- Ein maximales Timeout von 3-5 Minuten festlegen
- Exponentielles Backoff für Rate-Limited-Antworten implementieren
Webhook-Integration
Webhooks eliminieren die Notwendigkeit des Pollings, indem sie eine Benachrichtigung an Ihren Server senden, wenn die Generierung abgeschlossen ist. Dies ist der empfohlene Ansatz für Produktionssysteme.
Webhook-Einrichtung
// Webhook-Endpunkt registrieren
async function registerWebhook(url) {
const response = await fetch('https://api.seedance.ai/v2/webhooks', {
method: 'POST',
headers,
body: JSON.stringify({
url,
events: ['generation.completed', 'generation.failed'],
}),
})
return response.json()
}Webhook-Payload
Wenn die Generierung abgeschlossen ist, sendet Seedance eine POST-Anfrage an Ihre Webhook-URL:
{
"event": "generation.completed",
"task_id": "task_abc123",
"status": "completed",
"video_url": "https://cdn.seedance.ai/results/...",
"duration": 4,
"created_at": "2026-02-11T10:30:00Z",
"completed_at": "2026-02-11T10:31:15Z"
}Express.js Webhook-Handler
app.post('/webhooks/seedance', express.json(), (req, res) => {
const { event, task_id, video_url, status } = req.body
if (event === 'generation.completed') {
// Abgeschlossenes Video verarbeiten
processCompletedVideo(task_id, video_url)
}
if (event === 'generation.failed') {
// Fehler behandeln
handleGenerationFailure(task_id)
}
res.status(200).json({ received: true })
})Webhook-Sicherheit:
- Webhook-Signatur-Header überprüfen, um zu bestätigen, dass Anfragen von Seedance stammen
- Nur HTTPS-Endpunkte verwenden
- Innerhalb von 5 Sekunden mit Status 200 antworten, um Wiederholungen zu vermeiden
- Idempotente Verarbeitung implementieren, um doppelte Zustellungen zu handhaben
Fehlerbehandlung
Die Seedance API verwendet Standard-HTTP-Statuscodes mit strukturierten Fehlerantworten. Ordnungsgemäße Fehlerbehandlung ist entscheidend für die Produktionszuverlässigkeit.
Fehlerantwortformat:
{
"status": "error",
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Retry after 30 seconds.",
"retry_after": 30
}
}Häufige Fehlercodes:
| HTTP-Status | Fehlercode | Beschreibung | Maßnahme |
|---|---|---|---|
| 400 | INVALID_PARAMS | Ungültige Anfrageparameter | Anfragebody korrigieren |
| 401 | UNAUTHORIZED | Ungültiger oder abgelaufener API-Schlüssel | Schlüssel prüfen/rotieren |
| 403 | FORBIDDEN | Plan erlaubt diese Aktion nicht | Plan upgraden |
| 429 | RATE_LIMITED | Zu viele gleichzeitige Anfragen | Warten und erneut versuchen |
| 500 | INTERNAL_ERROR | Serverseitiger Fehler | Mit Backoff erneut versuchen |
| 503 | SERVICE_UNAVAILABLE | Vorübergehende Wartung | Nach Verzögerung erneut versuchen |
JavaScript Fehlerbehandlung mit Retry
async function apiRequestWithRetry(url, options, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const response = await fetch(url, options)
if (response.ok) {
return response.json()
}
if (response.status === 429) {
const data = await response.json()
const retryAfter = data.error?.retry_after ?? 30
await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000))
continue
}
if (response.status >= 500) {
const backoffMs = Math.pow(2, attempt) * 1000
await new Promise((resolve) => setTimeout(resolve, backoffMs))
continue
}
const errorData = await response.json()
throw new Error(`API error ${response.status}: ${errorData.error?.message ?? 'Unknown'}`)
}
throw new Error('Maximum retries exceeded')
}Python Fehlerbehandlung mit Retry
def api_request_with_retry(method: str, url: str, max_retries: int = 3, **kwargs) -> dict:
for attempt in range(max_retries):
response = requests.request(method, url, headers=headers, **kwargs)
if response.ok:
return response.json()
if response.status_code == 429:
retry_after = response.json().get("error", {}).get("retry_after", 30)
time.sleep(retry_after)
continue
if response.status_code >= 500:
time.sleep(2 ** attempt)
continue
response.raise_for_status()
raise RuntimeError("Maximum retries exceeded")Ratenlimits und Kontingente
Ratenlimits variieren je nach Plan und gelten für gleichzeitige Anfragen, nicht für das tägliche Gesamtvolumen.
| Plan | Gleichzeitige Anfragen | Anfragen/Minute | Tageslimit |
|---|---|---|---|
| Kostenlos | 2 | 10 | 5 Generierungen |
| Pro | 10 | 60 | 100 Generierungen |
| Business | 50+ | Individuell | Unbegrenzt |
Ratenlimit-Header: Jede API-Antwort enthält Ratenlimit-Informationen:
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 7
X-RateLimit-Reset: 1707654321Überwachen Sie diese Header, um Ihre Anfragerate proaktiv zu verwalten und Limits während Spitzennutzung zu vermeiden.
Produktions-Workflows aufbauen
Für Produktionssysteme, die Video in großem Maßstab generieren, implementieren Sie warteschlangenbasierte Verarbeitung, um die Parallelität zu verwalten, Fehler elegant zu behandeln und den Durchsatz zu optimieren.
Batch-Verarbeitungsmuster
async function processBatch(prompts) {
const concurrencyLimit = 5
const results = []
for (let i = 0; i < prompts.length; i += concurrencyLimit) {
const batch = prompts.slice(i, i + concurrencyLimit)
const batchResults = await Promise.allSettled(
batch.map(async (prompt) => {
const taskId = await generateTextToVideo(prompt)
const videoUrl = await pollForResult(taskId)
return { prompt, videoUrl }
})
)
const settled = batchResults.map((result) =>
result.status === 'fulfilled'
? result.value
: { error: result.reason.message }
)
results.push(...settled)
}
return results
}Warteschlangenbasierte Architektur
Für Anwendungen mit hohem Volumen verwenden Sie eine Nachrichtenwarteschlange, um Übermittlung von Verarbeitung zu entkoppeln:
Client → API Gateway → Nachrichtenwarteschlange → Worker Pool → Seedance API
↓
Status Store → Webhook / PollingEmpfohlene Warteschlangendienste: Bull (Redis), AWS SQS, Google Cloud Tasks oder RabbitMQ.
Kostenüberwachung
Verfolgen Sie API-Ausgaben programmatisch über den Account-Endpunkt:
async function checkUsage() {
const response = await fetch('https://api.seedance.ai/v2/account', {
headers,
})
const data = await response.json()
return {
plan: data.data.plan,
usedToday: data.data.generations_today,
limitToday: data.data.generations_limit,
billingCycleSpend: data.data.current_spend,
}
}Für detaillierte Preisinformationen einschließlich Mengenrabatten siehe unseren Seedance-Preisleitfaden.
FAQ
Wie erhalte ich einen Seedance API-Schlüssel?
Erstellen Sie ein Konto im Seedance-Entwicklerportal (Dreamina-Plattform), navigieren Sie zu Ihrem Dashboard und generieren Sie einen API-Schlüssel. API-Zugang über die kostenlose Stufe ist verfügbar.
Welche Programmiersprachen unterstützt die Seedance API?
Die Seedance API ist eine REST API, die mit jeder Sprache funktioniert, die HTTP-Anfragen stellen kann. Offizielle Beispiele werden in JavaScript, Python und cURL bereitgestellt.
Wie lange dauert die Seedance API-Generierung?
Die Generierung dauert typischerweise 30-120 Sekunden, abhängig von Auflösungs- und Dauereinstellungen. Die API verwendet asynchrones Polling zur Statusprüfung der Generierung.
Was ist das Seedance API-Ratenlimit?
Ratenlimits hängen von Ihrem Plan ab. Die kostenlose Stufe erlaubt ungefähr 2 gleichzeitige Anfragen, Pro erlaubt bis zu 10 und Business-Pläne haben individuelle Limits.
Unterstützt die Seedance API Webhooks?
Ja. Sie können eine Webhook-URL konfigurieren, um Benachrichtigungen zu erhalten, wenn die Videogenerierung abgeschlossen ist, wodurch das Status-Polling entfällt.
Kann ich die Seedance API für kommerzielle Projekte nutzen?
Ja. Die API-Nutzung im Pro- und Business-Plan umfasst kommerzielle Lizenzierung. Prüfen Sie die Nutzungsbedingungen für spezifische Nutzungsrechte.
Verwandte Artikel
- Seedance 2.0 Tutorial — Vollständiger Einsteiger-Leitfaden zu Seedance
- Seedance Prompt-Leitfaden — Über 50 Prompt-Vorlagen für bessere API-Ergebnisse
- Seedance Preise — API-Preisstufen und Mengenrabatte
- Seedance vs Sora 2026 — API-Vergleich mit OpenAI Sora

