Videogenerierung
POST /v1/videos · GET /v1/videos/{id} · DELETE /v1/videos/{id}
Erzeugen Sie kurze Videos aus einem Text-Prompt, optional gesteuert über Referenzbilder für den ersten/letzten Frame. Dies ist eine asynchrone Job-API im branchenüblichen create + poll-Format: POST /v1/videos legt eine Aufgabe an, die in ~2 Sekunden antwortet, Sie pollen bis zum Abschluss, und der Header Prefer: wait macht aus schnellen Generierungen einen einzigen synchronen Aufruf. Seedance-Modelle, ein API-Schlüssel, dieselbe Abrechnung wie bei allen anderen Endpunkten.
Die Video-API befindet sich in einer eingeschränkten Preview (Tests auf Einladung). Die Modelle erscheinen im Katalog und in der Preisliste, aber zum Anlegen von Aufgaben muss Ihr Workspace freigeschaltet sein — kontaktieren Sie uns, um ihn zu aktivieren.
Endpunkte & Aufgaben-Lebenszyklus
Eine Aufgaben-Ressource, vier Operationen. Eine Aufgabe durchläuft queued → in_progress → einen Endzustand: completed, failed oder cancelled. Die Create-Antwort enthält fertige status_url- / cancel_url-Links — Sie bauen nie URLs von Hand.
| Endpoint | Beschreibung |
|---|---|
POST /v1/videos | Legt eine Generierungsaufgabe an. Antwortet in ~2 s mit dem Aufgabenobjekt (status queued) und den Poll-Links. |
GET /v1/videos/{id} | Pollt die Aufgabe. Bei completed erhalten Sie data[0].url, usage.completion_tokens und die tatsächlich wirksamen Parameter; bei failed einen strukturierten Fehler mit Code und Meldung des Anbieters. |
DELETE /v1/videos/{id} | Bricht die Aufgabe ab. Nur queued-Aufgaben können abgebrochen werden; abgebrochene Aufgaben werden nie berechnet. |
GET /v1/videos/models | Listet die für Ihren Schlüssel verfügbaren Videomodelle samt Auflösungs-/Längen-Beschränkungen und Preisen je Modell. |
Synchroner Zucker — Prefer: wait
Fügen Sie dem Create-Aufruf einen Prefer: wait- oder Prefer: wait=N-Header hinzu (N begrenzt auf 1..60 Sekunden), und das Gateway hält die Anfrage offen. Wird die Aufgabe innerhalb des Fensters fertig, erhalten Sie direkt das Endobjekt — inklusive Video-URL und Usage, ganz ohne Polling. Wenn nicht, degradiert der Aufruf sauber: Sie bekommen das aktuelle Statusobjekt (kein Fehler, die Aufgabe läuft weiter) und pollen normal weiter.
Anfragetext
| Parameter | Typ | Beschreibung |
|---|---|---|
model* | string | Das zu verwendende Videomodell (z. B. seedance-1-5-pro-251215). Alle verfügbaren Modelle via GET /v1/videos/models. |
prompt* | string | Textbeschreibung des gewünschten Videos. |
image | string | string[] | Image-to-Video-Eingabe: ein Bild = erster Frame, zwei Bilder = erster + letzter Frame. Jeder Eintrag ist ein data URI oder eine https-URL. |
resolution | string | Ausgabeauflösung: 480p, 720p, 1080p oder 4k. Der unterstützte Satz variiert je Modell — siehe Modelltabelle. |
ratio | string | Seitenverhältnis: 16:9, 4:3, 1:1, 3:4, 9:16, 21:9 oder adaptive. |
duration | integer | Cliplänge in Sekunden (modellabhängiger Bereich innerhalb 2..15). Einige Modelle akzeptieren auch -1, dann wählt das Modell die Länge. |
seed | integer | Optionaler Seed für reproduzierbare Ausgaben (sofern unterstützt). |
watermark | boolean | Ob das Anbieter-Wasserzeichen gerendert wird. |
generate_audio | boolean | Tonspur generieren (Standard true). Bei Modellen mit gesplitteten Tarifen ändert das den Preis — siehe Modelltabelle. |
Verfügbare Modelle
Die Modellverfügbarkeit hängt von Ihrem Deployment ab. Die aktuelle, Compliance-bewusste Liste — inklusive Auflösungs-/Längen-Beschränkungen und Preisen je Modell — erhalten Sie via GET /v1/videos/models. Das aktuelle Lineup:
| Modell | Auflösungen | Länge | Preis | Hinweise |
|---|---|---|---|---|
dreamina-seedance-2-0-260128 | 480p · 720p · 1080p · 4k | 4–15 s | 480p/720p $7.0 · 1080p $7.7 · 4k $4.0 | 2.0-Flaggschiff; bis 4K |
dreamina-seedance-2-0-fast-260128 | 480p · 720p | 4–15 s | $5.6 | Schnellere 2.0-Variante |
dreamina-seedance-2-0-mini-260615 | 480p · 720p | 4–15 s | $3.5 | Kleinste 2.0-Variante |
seedance-1-5-pro-251215 | 480p · 720p · 1080p | 4–12 s | $2.4 audio · $1.2 muted | Tarif abhängig von generate_audio |
seedance-1-0-pro-fast-251015 | 480p · 720p · 1080p | 2–12 s | $1.0 | Am günstigsten |
Preis: USD pro 1M Video-Tokens. seedance-1-5-pro-251215 berechnet $2.4 mit aktivierter Tonspur (generate_audio: true, Standard) und $1.2 ohne; die übrigen Modelle haben einen Tarif je Auflösungsstufe.
Video-Tokens & Preise
Video wird nach Video-Tokens abgerechnet, abgeleitet aus der tatsächlichen Ausgabe: tokens ≈ Breite × Höhe × 24 fps × Sekunden / 1024. Die Tarife gelten pro 1M Video-Tokens und folgen den tatsächlich wirksamen Parametern (in der completed-Aufgabe zurückgemeldet) — ratio: "adaptive" und duration: -1 werden also nach dem abgerechnet, was das Modell wirklich produziert hat.
Anhaltspunkte auf seedance-1-5-pro-251215 mit Audio: ein 480p / 16:9 / 4-s-Clip ≈ 40,6K Video-Tokens ≈ $0.10; ein 720p / 5-s-Clip ≈ 108,9K Tokens ≈ $0.26.
Abrechnung
Berechnet wird nur bei Erfolg: die Belastung erfolgt genau einmal, wenn die Aufgabe erstmals completed erreicht, bemessen an der zurückgegebenen Video-Token-Usage. Fehlgeschlagene Aufgaben (inklusive Ablehnungen durch die Inhaltsmoderation) und abgebrochene Aufgaben werden nie berechnet — der Anbieterfehler wird unverändert durchgereicht.
Die zurückgegebene data[0].url ist eine vorsignierte Anbieter-URL und läuft nach ~24 Stunden ab — laden Sie zeitnah herunter und hosten Sie die Datei auf eigenem Speicher, wenn Sie sie langfristig brauchen.
Beispiel — curl, in einem Schritt (Prefer: wait)
curl https://synthorai.io/v1/videos \
-H "Authorization: Bearer $SYNTHORAI_API_KEY" \
-H "Content-Type: application/json" \
-H "Prefer: wait=60" \
-d '{
"model": "seedance-1-0-pro-fast-251015",
"prompt": "A corgi puppy chasing a butterfly across a meadow, cinematic",
"resolution": "480p",
"ratio": "16:9",
"duration": 4
}'
# Finished inside the wait window → the terminal object comes straight back:
{
"id": "vid_6091d8d1af805818b1470488",
"object": "video",
"model": "seedance-1-0-pro-fast-251015",
"status": "completed",
"data": [{ "url": "https://…tos….mp4?…" }],
"usage": { "completion_tokens": 40594, "total_tokens": 40594 },
"resolution": "480p", "ratio": "16:9", "duration": 4, "fps": 24,
"seed": 34142
}
# Not done in time → the current status object is returned instead (no error,
# the task keeps running) — continue polling status_url as usual. Beispiel — curl, create + poll
# 1) Create — returns in ~2 s with a queued task object
curl https://synthorai.io/v1/videos \
-H "Authorization: Bearer $SYNTHORAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-1-5-pro-251215",
"prompt": "A corgi puppy chasing a butterfly across a meadow, cinematic",
"resolution": "720p",
"duration": 5,
"generate_audio": true
}'
{
"id": "vid_6091d8d1af805818b1470488",
"object": "video",
"model": "seedance-1-5-pro-251215",
"status": "queued",
"created_at": 1784619862,
"status_url": "https://synthorai.io/v1/videos/vid_6091d8d1af805818b1470488",
"cancel_url": "https://synthorai.io/v1/videos/vid_6091d8d1af805818b1470488"
}
# 2) Poll until status is terminal (completed | failed | cancelled)
curl https://synthorai.io/v1/videos/vid_6091d8d1af805818b1470488 \
-H "Authorization: Bearer $SYNTHORAI_API_KEY"
{
"id": "vid_6091d8d1af805818b1470488",
"object": "video",
"model": "seedance-1-5-pro-251215",
"status": "completed",
"data": [{ "url": "https://…tos….mp4?…" }],
"usage": { "completion_tokens": 108900, "total_tokens": 108900 },
"resolution": "720p", "ratio": "16:9", "duration": 5, "fps": 24,
"seed": 34142, "generate_audio": true
}
# 3) Download the video — the URL is pre-signed (no auth header) and expires
# in ~24 h: fetch promptly and re-host if you need it long-term.
curl -o out.mp4 "https://…tos….mp4?…" Beispiel — Python (requests)
import time
import requests
BASE = "https://synthorai.io/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
task = requests.post(f"{BASE}/videos", headers=HEADERS, json={
"model": "seedance-1-5-pro-251215",
"prompt": "A corgi puppy chasing a butterfly across a meadow, cinematic",
"resolution": "720p",
"duration": 5,
}).json()
while task["status"] not in ("completed", "failed", "cancelled"):
time.sleep(5)
task = requests.get(task["status_url"], headers=HEADERS).json()
if task["status"] == "completed":
url = task["data"][0]["url"] # pre-signed, valid ~24 h — re-host promptly
with open("out.mp4", "wb") as f:
f.write(requests.get(url).content)
else:
print(task["error"]) # provider code + message, passed through verbatim Beispiel — Node (fetch)
import fs from "node:fs";
const BASE = "https://synthorai.io/v1";
const HEADERS = { Authorization: `Bearer ${process.env.SYNTHORAI_API_KEY}` };
let task = await (await fetch(`${BASE}/videos`, {
method: "POST",
headers: { ...HEADERS, "Content-Type": "application/json" },
body: JSON.stringify({
model: "seedance-1-5-pro-251215",
prompt: "A corgi puppy chasing a butterfly across a meadow, cinematic",
resolution: "720p",
duration: 5,
}),
})).json();
while (!["completed", "failed", "cancelled"].includes(task.status)) {
await new Promise((r) => setTimeout(r, 5000));
task = await (await fetch(task.status_url, { headers: HEADERS })).json();
}
if (task.status === "completed") {
const url = task.data[0].url; // pre-signed, valid ~24 h — re-host promptly
fs.writeFileSync("out.mp4", Buffer.from(await (await fetch(url)).arrayBuffer()));
} else {
console.error(task.error); // provider code + message, passed through verbatim
} Idempotenz
Übergeben Sie einen X-Idempotency-Key Header beim Create-Aufruf, um Retries sicher zu machen: eine Wiederholung mit demselben Schlüssel liefert 409, statt eine zweite Aufgabe anzulegen (und zu berechnen). Videogenerierung ist langsam und Retry-anfällig — das verhindert Doppelbelastungen.