Zum Inhalt springen

Seedance 2.0 MiniAPI-Referenz

Alles, was du brauchst, um Seedance 2.0 Mini aus Code aufzurufen: ein Schnellstart in drei Schritten, jedes Feld mit seinen Limits, die Preisformel, Webhooks und Idempotenz. Die MCP-Tools laufen über dieselbe /v1-API; mit einer MCP-Anmeldung verbrauchst du das Kreativguthaben, mit einem API-Schlüssel das Entwickler-API-Guthaben.

EndpunktPOST /v1/videos/generationsModellversiondreamina-seedance-2-0-mini-260615OpenAPIllms.txtFür KI-Agenten
API-Zugang beantragen

Zugang zur Entwickler-API gibt es auf Antrag.

Schnellstartin drei Aufrufen

Setze einen Schlüssel, sende den Auftrag mit einer Preisobergrenze und lies dann das Ergebnis.

  1. 01

    Schlüssel setzen

    Zugang zur Entwickler-API gibt es auf Antrag: Beantrage ihn im Studio unter API-Schlüssel. Der Schlüssel wird einmal angezeigt, also speichere ihn in einer Umgebungsvariable.

    Shell
    export API_KEY="sk_test_…"
  2. 02

    Auftrag senden

    Sende den Clip per POST mit einem Idempotency-Key und der Obergrenze max_credits (oder einer quote_id). Du bekommst sofort 202 und einen Auftrag in der Warteschlange, und die Credits werden reserviert.

    POST /videos/generations
    curl https://api.pershot.app/v1/videos/generations \
      -H "Authorization: Bearer $API_KEY" \
      -H "Idempotency-Key: $(uuidgen)" \
      -H "Content-Type: application/json" \
      -d '{
        "model": "seedance-2.0-mini",
        "prompt": "Creator holds the bottle to camera and explains one benefit, handheld, natural room light.",
        "duration": 10,
        "resolution": "720p",
        "aspect_ratio": "16:9",
        "generate_audio": true,
        "max_credits": 42
      }'
    Das solltest du sehen
    {
      "id": "job_01J9ZK4T8W",
      "object": "job",
      "kind": "video",
      "status": "queued",
      "money_status": "reserved",
      "queue_position": 2,
      "requested_model": "seedance-2.0-mini",
      "credits_quoted": 42,
      "credits_charged": null
    }
  3. 03

    Ergebnis lesen

    Rufe den Auftrag per GET ab, bis sein Status succeeded ist. outputs[].url ist signiert und läuft nach 24 Stunden ab, also lade herunter, was du behalten willst.

    GET /jobs/{id}
    curl https://api.pershot.app/v1/jobs/job_01J9ZK4T8W \
      -H "Authorization: Bearer $API_KEY"

Parameterund Limits

Gelesen aus dem OpenAPI-Dokument, das aus denselben Schemas erzeugt wird, gegen die die API validiert. Unbekannte Felder werden abgelehnt.

Anfragefelder für Seedance 2.0 Mini
FeldTypErlaubtHinweise
modelErforderlichstringseedance-2.0-fast · seedance-2.0-mini · autoDie Modell-ID.
promptErforderlichstring2–2.000 ZeichenWas generiert werden soll: das Motiv, die Kamera und das Licht.
durationStandard 5integer4–15Länge der Ausgabe in ganzen Sekunden, bis 15.
resolutionStandard "720p"string480p · 720pAusgabeauflösung. 480p für Entwürfe, 720p für die Auslieferung; jede ist eine eigene Generierung.
aspect_ratioStandard "16:9"string16:9 · 9:16 · 1:1Bildformat.
generate_audioStandard trueboolean–Natives Audio. Der Preis ist mit und ohne gleich.
image_urlOptionalstringhttps-URLStartbild für Video; das Ausgangsbild für die Bearbeitungsmodelle. Eine öffentliche https-URL oder eine Upload-URL.
reference_image_urlsOptionalstring[]Bis zu 9 · https-URLReferenzbilder für Motiv und Stil. Verweise im Prompt mit @image1, @image2 auf sie.
seedOptionalinteger0–2.147.483.647Wird akzeptiert und ignoriert: Seedance 2.0 nimmt keinen Seed an.
quote_idOptionalstringqt_…Ausführung zu einem Preisangebot von POST /v1/quotes, 10 Minuten gültig.
max_creditsOptionalnumber> 0Das Höchste, was dieser Auftrag kosten darf. Darüber wird der Auftrag abgelehnt, nie berechnet.
webhook_urlOptionalstringhttps-URLEine https-URL, die die Ereignisse des Auftrags empfängt.
end_user_idOptionalstring1–128 ZeichenFür freigegebene Entwicklerkonten (Zugang auf Antrag): deine eigene Nutzer-ID für diese Anfrage, sichtbar in der Nutzung.
project_idOptionalstringprj_…
shot_idOptionalstringsht_…
routing_preferenceOptionalstringstability · speed
enhanceOptionalobject–

Sende genau eins von beiden: quote_id oder max_credits. Dieser Endpunkt lehnt model "auto" ab: Für Videos ruf zuerst POST /v1/auto/plan auf und sende dann das gewählte Modell mit max_credits.

Ratenlimit und Parallelität
Standardmäßig 60 Anfragen pro Minute pro Schlüssel und 3 gleichzeitige Aufträge pro Konto. Mehr Schlüssel bringen keine zusätzliche Parallelität.

Limits

Aus derselben Tabelle gelesen, gegen die die API prüft. Jede Zeile zeigt, wer das Limit prüft und was passiert, wenn es überschritten wird.

  • ErzwungenWir prüfen es und antworten mit 400, bevor ein Preisangebot erstellt oder etwas reserviert wird.
  • Beim LieferantenDer Anbieter prüft es. Ein Auftrag, den er ablehnt, schlägt fehl, und es wird nichts berechnet.
  • EmpfohlenNiemand prüft es. Wenn du darunter bleibst, bekommst du bessere Ergebnisse.
Limits für seedance-2.0-mini
LimitWertEinheitWer prüftBei Überschreitung
Anfrage
Prompt-Längeprompt2 bis 2.000ZeichenErzwungen400 invalid_request bei prompt, vor jedem Preisangebot und jeder Reservierung.
Prompt auf Englischpromptbis 1.000WörterEmpfohlenWird akzeptiert. Einem längeren Prompt folgt das Modell womöglich weniger genau.
Prompt auf Chinesischpromptbis 500chinesische ZeichenEmpfohlenWird akzeptiert. Einem längeren Prompt folgt das Modell womöglich weniger genau.
Dauerduration4 bis 15Standard 5SekundenErzwungen400 invalid_request bei duration. Nur ganze Sekunden.
Auflösungresolution480p, 720pStandard 720p–Erzwungen400 invalid_request bei resolution.
Seitenverhältnisaspect_ratio16:9, 9:16, 1:1Standard 16:9–Erzwungen400 invalid_request bei aspect_ratio.
SeedseedIgnoriert–Beim LieferantenWird akzeptiert, aber nicht gesendet: Seedance 2.0 nimmt keinen Seed an, ein Seed wiederholt also kein Ergebnis.
Länge des Eingabevideosinput_video_seconds2 bis 15SekundenErzwungen400 invalid_request bei POST /v1/quotes. Generierungen über die API nehmen kein Eingabevideo an.
Bilder, die du sendest
Referenzbilderreference_image_urlsbis 9BilderErzwungen400 invalid_request bei reference_image_urls.
Startbild oder Referenzenreference_image_urlsimage_url oder reference_image_urls, nicht beides–Erzwungen400 invalid_request bei reference_image_urls. Seedance 2.0 nutzt pro Auftrag einen der beiden Modi.
Seitenlänge des Bildesimage_urlreference_image_urls300 bis 6.000px pro SeiteErzwungen bei UploadsUploads: 400 invalid_request bei image_url oder reference_image_urls.N, vor jedem Preisangebot und jeder Reservierung. Andere Links: Der Anbieter lehnt den Auftrag ab, und es wird nichts berechnet.
Bildformimage_urlreference_image_urls0,4 bis 2,5Breite ÷ HöheErzwungen bei UploadsUploads: 400 invalid_request bei image_url oder reference_image_urls.N, vor jedem Preisangebot und jeder Reservierung. Andere Links: Der Anbieter lehnt den Auftrag ab, und es wird nichts berechnet.
Upload-Größefilebis 10MBErzwungenPOST /v1/uploads antwortet mit 400 invalid_request bei file.
Upload-FormatefileJPEG, PNG, WebP–ErzwungenWird aus der Datei selbst gelesen, nicht aus ihrem Namen. Alles andere: 400 invalid_request bei file.
Größe verlinkter Bilderimage_urlreference_image_urlsbis 30MBBeim LieferantenFür Bilder, die von anderen Hosts verlinkt sind. Der Anbieter lehnt den Auftrag ab, und es wird nichts berechnet.
Formate verlinkter Bilderimage_urlreference_image_urlsJPEG, PNG, WebP, BMP, TIFF, GIF, HEIC, HEIF–Beim LieferantenFür Bilder, die von anderen Hosts verlinkt sind. Der Anbieter lehnt den Auftrag ab, und es wird nichts berechnet.
Ausgabe
Ausgabepixel480p16:9864×4969:16496×8641:1640×640720p16:91280×7209:16720×12801:1960×960pxBeim LieferantenVom Modell für jede Auflösung und jedes Seitenverhältnis festgelegt.
Bildrate24fpsBeim LieferantenFür jedes Video gleich.
AusgabeformatMP4–Beim LieferantenJedes Video ist ein MP4, mit Ton, wenn generate_audio aktiv ist.
Links
Upload-Link7TageErzwungenDanach antwortet der Link mit 403. Lade die Datei erneut hoch.
Ausgabe-Link24StundenErzwungenDanach antwortet der Link mit 403. Ruf den Auftrag erneut per GET ab, um einen neuen Link zu bekommen. Die Datei selbst wird 12 Monate aufbewahrt (outputs_expire_at des Auftrags nennt das Datum), länger, wenn das Ergebnis in der Mediathek gespeichert oder in einem Projekt verwendet wird.

Wir laden nie Bilder von anderen Hosts, daher prüft bei solchen Links der Anbieter die Größe, und ein Auftrag, den er ablehnt, wird nicht berechnet. Dieselben Limits gibt es auch als JSON: GET /v1/models liefert für jedes Modell ein limits-Objekt.

Preiseoffen nachgerechnet

Jeder Auftrag bekommt vor dem Start ein Preisangebot in Credits (1 US$ = 100 Credits). Der Satz pro Sekunde dient der Budgetplanung; POST /v1/quotes liefert den genauen Betrag.

Credits = ceil(BytePlus-Listenpreis × 0,55 × 100), wobei Listenpreis = (Eingabe-s + Ausgabe-s) × Breite × Höhe × 24 ÷ 1024 × Listensatz
Preise für Seedance 2.0 Mini
SpezifikationPro Sekunde (API)5 s10 s15 s
480pOhne Videoeingabe0,020 $Mit Eingabevideo: 0,012 $/s≈ 500 s pro 10 $10 cr≈ 0,10 $20 cr≈ 0,20 $30 cr≈ 0,30 $
720pOhne Videoeingabe0,042 $Mit Eingabevideo: 0,025 $/s≈ 238 s pro 10 $21 cr≈ 0,21 $42 cr≈ 0,42 $63 cr≈ 0,63 $

Abgelehnte oder fehlgeschlagene Aufträge werden nicht berechnet.

Webhooksund Idempotenz

Wiederholte Anfragen werden nie doppelt berechnet, und du musst nicht ständig abfragen.

Idempotenz
Jeder Generierungs-POST braucht einen Idempotency-Key (1 bis 255 sichtbare ASCII-Zeichen). Derselbe Schlüssel innerhalb von 24 Stunden liefert denselben Auftrag mit HTTP 200, also erzeugt oder berechnet eine Wiederholung nach einem Timeout nie einen zweiten Auftrag.
Abgelehnte Prompts
Ein Prompt, den die Vorprüfung ablehnt (422 content_rejected), erzeugt nichts, also kannst du denselben Schlüssel mit einem neuen Prompt wieder verwenden.
Ereignisse
job.queuedjob.processingjob.succeededjob.failedjob.cancelled
Signatur
X-Signature enthält t, die Unix-Zeit, und v1, einen HMAC-SHA256 über t, einen Punkt und den Rohbody, mit deinem whsec_-Secret als Schlüssel. Lehne Zeitstempel ab, die älter als fünf Minuten sind, und entferne Duplikate anhand von X-Event-Id.
Zustellung
Ein 2xx innerhalb von 10 Sekunden gilt als zugestellt. Fehlgeschlagene Zustellungen werden nach 1 min, 5 min, 30 min, 2 h und 6 h wiederholt. Weiterleitungen werden nicht verfolgt.
Webhook-Body
{
  "id": "evt_01J9ZKB1QX",
  "type": "job.succeeded",
  "created_at": "2026-09-29T14:02:31Z",
  "data": {
    "job": {
      "id": "job_01J9ZK4T8W",
      "object": "job",
      "kind": "video",
      "status": "succeeded",
      "money_status": "settled",
      "requested_model": "seedance-2.0-mini",
      "credits_charged": 42,
      "outputs": [
        {
          "kind": "video",
          "url": "https://…/job_01J9ZK4T8W.mp4?sig=…"
        }
      ]
    }
  }
}
X-Signature prüfen
import { createHmac, timingSafeEqual } from "node:crypto";

// rawBody: the request body exactly as received, before any JSON parsing.
export function verifyWebhook(header, rawBody, secret, toleranceSec = 300) {
  let t = null;
  const signatures = [];
  for (const item of (header ?? "").split(",")) {
    const [key, value] = item.split("=", 2);
    if (key === "t") t = Number(value);
    if (key === "v1") signatures.push(Buffer.from(value, "hex"));
  }
  if (!t || Math.abs(Date.now() / 1000 - t) > toleranceSec) return false;
  const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest();
  return signatures.some((s) => s.length === expected.length && timingSafeEqual(s, expected));
}

// verifyWebhook(req.headers["x-signature"], rawBody, process.env.WEBHOOK_SECRET)
// Answer 2xx quickly, and skip an X-Event-Id you have already handled.

Fehlerund was zu tun ist

Jeder Fehler hat dieselbe Form: ein error-Objekt mit code, message, param und request_id. Die, auf die du am ehesten triffst:

CodeHTTPWas tun
invalid_request400Korrigiere das Feld, das in param genannt wird.
unauthorized401Prüfe den Schlüssel und den Bearer-Header.
insufficient_credits402Lade auf und versuch es dann mit demselben Idempotency-Key erneut.
forbidden_model403Füge das Modell oder Tool im Studio zu den erlaubten Modellen und Tools des Schlüssels hinzu, oder nutze einen anderen Schlüssel. Tools wie „Verbessern“ brauchen einen eigenen Eintrag.
quote_expired409Hol ein neues Preisangebot ein; Preisangebote gelten 10 Minuten.
price_changed409Der Preis ist über deine Obergrenze gestiegen. Hol ein neues Preisangebot ein oder erhöhe max_credits.
content_rejected422Es wurde nichts berechnet. Ändere den Prompt oder die Bilder.
rate_limited429Warte die Zeit aus Retry-After ab und versuch es dann erneut.
upstream_unavailable503Das Modell ist nicht verfügbar. Versuch es später erneut; ein Auftrag, der nie startet, wird nicht berechnet.