🎁 Neu Kostenlos registrieren, 10 Aufrufe gratis. Bis zu 1 $, ohne Karte.

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 queuedin_progress → einen Endzustand: completed, failed oder cancelled. Die Create-Antwort enthält fertige status_url- / cancel_url-Links — Sie bauen nie URLs von Hand.

EndpointBeschreibung
POST /v1/videosLegt 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/modelsListet 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

ParameterTypBeschreibung
model*stringDas zu verwendende Videomodell (z. B. seedance-1-5-pro-251215). Alle verfügbaren Modelle via GET /v1/videos/models.
prompt*stringTextbeschreibung des gewünschten Videos.
imagestring | string[]Image-to-Video-Eingabe: ein Bild = erster Frame, zwei Bilder = erster + letzter Frame. Jeder Eintrag ist ein data URI oder eine https-URL.
resolutionstringAusgabeauflösung: 480p, 720p, 1080p oder 4k. Der unterstützte Satz variiert je Modell — siehe Modelltabelle.
ratiostringSeitenverhältnis: 16:9, 4:3, 1:1, 3:4, 9:16, 21:9 oder adaptive.
durationintegerCliplänge in Sekunden (modellabhängiger Bereich innerhalb 2..15). Einige Modelle akzeptieren auch -1, dann wählt das Modell die Länge.
seedintegerOptionaler Seed für reproduzierbare Ausgaben (sofern unterstützt).
watermarkbooleanOb das Anbieter-Wasserzeichen gerendert wird.
generate_audiobooleanTonspur 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:

ModellAuflösungenLängePreisHinweise
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.