Seite wird vorbereitet…
▥ Seedance 2.5 ist da! ›
PreiseDocsUpdatesKonto
AnleitungenÜbersichtBild-APIVideo-API
Auf dieser SeiteSchnellstartAuthentifizierungEndpunkteRouting-ModusAbrechnungTasks und PollingUploadsWebhooksFehler
RessourcenModellkatalogPreiseAPI-SchlüsselWebhook-EndpunkteOpenAPI-SpezifikationServicestatusProdukt-Updates
ÜbersichtBild-APIVideo-API
Dokumentation

MLMux API

Ein API-Schlüssel und ein Anfrageformat für Bild- und Videogenerierungsmodelle. Bilder werden direkt in der Antwort zurückgegeben; Videos laufen als Tasks, die Sie per Polling abfragen oder per Webhook empfangen.

Schnellstart

  1. 01

    API-Schlüssel erstellen

    Erstellen Sie einen Schlüssel unter Konsole → API-Schlüssel. Der vollständige Schlüssel wird nur einmal angezeigt; speichern Sie ihn daher sofort, beispielsweise als MLMUX_API_KEY.

  2. 02

    Anfrage senden

    Rufen Sie einen Bild- oder Video-Endpunkt mit einer Modell-ID und einem Prompt auf. Die Nutzung wird dem Konto des Schlüsselinhabers berechnet.

  3. 03

    Ergebnis abrufen

    Bildanfragen geben URLs in der Antwort zurück. Videoanfragen geben einen Task zurück: Rufen Sie dessen poll_url regelmäßig ab oder abonnieren Sie einen Webhook.

Authentifizierung

Senden Sie Ihren Schlüssel im Header Authorization: Bearer bei jeder Anfrage an https://api.mlmux.com. Schlüssel beginnen mit sk-. Die API akzeptiert keine Schlüssel in anderen Headern oder im Query-String.

Um zu prüfen, ob ein Schlüssel funktioniert, listen Sie die aufrufbaren Modelle auf:

GEThttps://api.mlmux.com/v1/models
curl https://api.mlmux.com/v1/models \
  -H "Authorization: Bearer $MLMUX_API_KEY"
Antwort
{
  "object": "list",
  "data": [
    { "id": "nano-banana-2", "object": "model", "owned_by": "platform" },
    { "id": "model/seedance-2.5-max", "object": "model", "owned_by": "platform" }
  ]
}

Endpunkte

Alle Endpunkte befinden sich unter https://api.mlmux.com. Sofern nicht anders angegeben, sind Request- und Response-Bodys im JSON-Format.

MethodePfadBeschreibung
GET/v1/modelsVerfügbare Modell-IDs auflisten.
POST/v1/images/generationsBilder aus einem Prompt generieren.
POST/v1/images/editsEingabebilder bearbeiten oder kombinieren. Akzeptiert JSON oder multipart.
GET/v1/images/generations/{task_id}Asynchronen Bild-Task abrufen. Bildbearbeitungen verwenden /v1/images/edits/{task_id}.
POST/v1/videos/generationsVideo-Task erstellen.
GET/v1/videos/generations/{task_id}Video-Task abrufen.
GET/v1/tasks/{task_id}Beliebigen Task anhand der ID abrufen.
POST/v1/tasks/{task_id}/cancelNoch nicht abgeschlossenen Task abbrechen.
POST/v1/uploadsReferenzdatei hochladen und eine URL erhalten.
GET/v1/account/balanceGuthaben abrufen.

Routing-Modus

Legen Sie route_mode im Request-Body fest, um das Upstream-Tier auszuwählen. Eine Anfrage verbleibt in ihrem Tier und wechselt nie stillschweigend zu einem anderen; ist das Tier für das Modell deaktiviert, schlägt die Anfrage mit route_mode_disabled fehl. Wird das Feld ausgelassen, verwendet MLMux die für den API-Key konfigurierten Route-Modi und danach den Modell-Standardwert, welcher official-cheap ist.

WertBeschreibung
officialOffizielle Route des Anbieters, abgerechnet zum Listenpreis des Anbieters.
official-cheapGünstigere offizielle Route. Standard für neue Anfragen und API-Schlüssel.

Abrechnung

Die Nutzung wird in Credits abgerechnet, wobei 1 Credit 1 US-Dollar entspricht. Videomodelle werden pro Output-Token abgerechnet; Bildmodelle je nach Modell pro Upstream-Token oder pro Bild. Tarife für jede Route finden Sie auf der Preisseite.

Task-Antworten zeigen bei der Erstellung des Tasks estimated_charge_credits und nach erfolgreichem Abschluss actual_charge_credits an, beides in Credits. Webhook-Nutzdaten enthalten actual_charge_nano_credits als Ganzzahl, wobei 1.000.000.000 Nano-Credits 1 Credit entsprechen.

Prüfen Sie Ihr verbleibendes Guthaben mit GET /v1/account/balance.

Tasks und Polling

Videoanfragen sowie Bildanfragen mit "async": true geben HTTP 202 mit einem Task zurück. Rufen Sie die poll_url des Tasks alle paar Sekunden ab, bis der Status succeeded, failed, expired oder canceled lautet.

StatusBeschreibung
queuedAkzeptiert und wartet auf den Start.
submittedAn den Upstream-Anbieter gesendet.
runningWird generiert. progress reicht von 0 bis 100.
succeededAbgeschlossen. Die Antwort enthält nun die Ausgabe-URLs.
failedFehlgeschlagen. message gibt den Grund an.
expiredInnerhalb des Task-Zeitlimits nicht abgeschlossen.
canceledÜber den Abbruch-Endpunkt abgebrochen.

Task abbrechen

POSThttps://api.mlmux.com/v1/tasks/{task_id}/cancel

Tasks mit dem Status queued, submitted oder running können abgebrochen werden; die reservierten Credits werden freigegeben. Die Antwort lautet {"id": "task_…", "status": "canceled"}. Bei allen anderen Status wird 409 task_not_cancelable zurückgegeben.

Sichere Wiederholungsversuche

Asynchrone Video- und Bildgenerierungsanfragen akzeptieren einen Idempotency-Key-Header mit bis zu 160 Zeichen. Wird derselbe Schlüssel mit demselben Body erneut gesendet, wird der ursprüngliche Task zurückgegeben, anstatt einen neuen zu erstellen. Wird derselbe Schlüssel mit einem anderen Body gesendet, wird 409 idempotency_key_reused zurückgegeben. Synchrone Anfragen und Bildbearbeitungen akzeptieren diesen Header nicht.

Uploads

Um eine lokale Datei als Referenz zu verwenden, laden Sie sie als Multipart-Feld file hoch. Bilder, Videos und Audiodateien bis zu 50 MB werden akzeptiert und 3 Tage lang gespeichert. Übergeben Sie die zurückgegebene url in einem beliebigen URL-Feld einer Generierungsanfrage.

POSThttps://api.mlmux.com/v1/uploads
Anfrage
curl https://api.mlmux.com/v1/uploads \
  -H "Authorization: Bearer $MLMUX_API_KEY" \
  -F "file=@start-frame.jpg"
Antwort
{
  "url": "https://.../uploads/3f8a....jpg",
  "asset_id": 1024,
  "mime_type": "image/jpeg",
  "size_bytes": 482113,
  "asset_type": "image"
}

Webhooks

Erstellen Sie einen Endpunkt unter Console → Webhooks und wählen Sie die zu empfangenden Events aus. Wenn eine Anfrage oder ein Task abgeschlossen ist, sendet MLMux eine POST-Anfrage mit einem JSON-Body an Ihre URL.

EreignisBeschreibung
request.succeededEine Anfrage oder ein Task war erfolgreich.
request.failedEine Anfrage oder ein Task ist fehlgeschlagen. data.error_code und data.error_message erklären den Grund.
webhook.testWird gesendet, wenn Sie den Endpunkt in der Console testen.
Payload
{
  "event_id": "evt_5b0d...",
  "event_type": "request.succeeded",
  "created_at": "2026-10-26T08:00:00Z",
  "data": {
    "request_id": "task_task_01a9...",
    "task_id": "task_01a9...",
    "public_model_id": "model/seedance-2.5-max",
    "api_method": "videos.generations.create",
    "image_count": 0,
    "image_resolution": "",
    "video_seconds": 8,
    "video_resolution": "720p",
    "actual_charge_nano_credits": 1790000000,
    "latency_ms": 94210
  }
}

Signaturen überprüfen

Jede Zustellung wird mit dem Signiergeheimnis des Endpunkts (whsec_…) signiert, das einmalig beim Erstellen oder Rotieren angezeigt wird. Der Header X-MLMux-Signature enthält einen Unix-Zeitstempel t und eine Signatur v1: den Hex-HMAC-SHA256 des Zeitstempels, eines Punkts und des Roh-Request-Bodys. Berechnen Sie denselben Wert, vergleichen Sie ihn und weisen Sie alte Zeitstempel zurück.

Node.js
import crypto from "node:crypto";

// header: X-MLMux-Signature: t=1767225600,v1=5f8c...
export function verifyMLMuxSignature(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(",").map((part) => part.split("=")));
  const expected = crypto.createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest("hex");
  const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
  return fresh && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1 ?? ""));
}

Geben Sie innerhalb von 10 Sekunden einen beliebigen 2xx-Status zurück. MLMux unternimmt bis zu 6 Zustellversuche über etwa 11 Stunden. Verwenden Sie X-MLMux-Event-ID, um doppelte Zustellungen zu ignorieren.

Fehler

Fehler teilen dasselbe JSON-Format. Verzweigen Sie basierend auf code statt message. Geben Sie die request_id an, die auch im Header X-Request-ID zurückgegeben wird, wenn Sie den Support kontaktieren.

Fehlerantwort
{
  "error": {
    "message": "Invalid API key",
    "type": "invalid_request_error",
    "code": "invalid_api_key",
    "request_id": "req_9f2c..."
  }
}
HTTPCodeBedeutung
400invalid_requestDer Body ist kein gültiges JSON oder ein Feld hat den falschen Typ, wie z. B. ein unbekannter route_mode bei einer Bildgenerierung.
400invalid_valueEin Wert wie resolution, size, aspect_ratio oder n wird vom Modell nicht unterstützt.
400model_not_foundDie Modell-ID existiert nicht oder ist nicht verfügbar.
400invalid_video_requestEin Videomodus, eine Referenzanzahl, ein Seitenverhältnis, eine Auflösung oder eine Dauer ist ungültig.
400content_policy_violationDer Prompt oder eine Eingabe wurde durch die Inhaltsmoderation blockiert.
401invalid_api_keyDer API-Schlüssel fehlt, ist ungültig, abgelaufen oder deaktiviert.
402insufficient_creditsDas Guthaben reicht für die geschätzten Kosten nicht aus. Laden Sie Guthaben auf und versuchen Sie es erneut.
402spend_limit_exceededDie Anfrage würde ein in der Console festgelegtes Ausgabenlimit überschreiten.
402api_key_monthly_limit_exceededDie Anfrage würde das monatliche Budget dieses API-Schlüssels überschreiten.
403email_verification_requiredBestätigen Sie die E-Mail-Adresse des Kontos, bevor Sie die API verwenden.
403model_not_allowedDieser API-Schlüssel ist auf andere Modelle beschränkt.
403forbidden_asset_referenceEine asset://-Referenz gehört nicht zu diesem Konto.
404task_not_foundDer Task existiert nicht oder gehört zu einem anderen Konto.
409idempotency_key_reusedDer Idempotency-Key wurde bereits mit einem anderen Body verwendet.
409task_not_cancelableDer Task ist bereits abgeschlossen.
429rate_limit_exceededZu viele Anfragen pro Minute für diesen Schlüssel oder dieses Konto.
429capacity_exhaustedJeder Upstream auf der ausgewählten Route ist ausgelastet.
502model_unavailableDie ausgewählte Route verfügt über keinen verfügbaren Upstream für dieses Modell.
502generation_failedDer Upstream-Anbieter konnte keine Ausgabe generieren.
503generation_unavailableDer Upstream-Anbieter ist vorübergehend nicht verfügbar.
503route_mode_disabledDer ausgewählte Route-Modus ist für dieses Modell deaktiviert. Senden Sie einen anderen route_mode.
504generation_timeoutZeitüberschreitung beim Upstream-Anbieter.

429-Antworten enthalten einen Retry-After-Header. Warten Sie diese Anzahl von Sekunden, bevor Sie es erneut versuchen, und wiederholen Sie 5xx-Fehler mit exponentiellem Backoff.

WeiterBild-API