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.
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.
Rufen Sie einen Bild- oder Video-Endpunkt mit einer Modell-ID und einem Prompt auf. Die Nutzung wird dem Konto des Schlüsselinhabers berechnet.
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.
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:
https://api.mlmux.com/v1/modelscurl https://api.mlmux.com/v1/models \
-H "Authorization: Bearer $MLMUX_API_KEY"{
"object": "list",
"data": [
{ "id": "nano-banana-2", "object": "model", "owned_by": "platform" },
{ "id": "model/seedance-2.5-max", "object": "model", "owned_by": "platform" }
]
}Alle Endpunkte befinden sich unter https://api.mlmux.com. Sofern nicht anders angegeben, sind Request- und Response-Bodys im JSON-Format.
| Methode | Pfad | Beschreibung |
|---|---|---|
GET | /v1/models | Verfügbare Modell-IDs auflisten. |
POST | /v1/images/generations | Bilder aus einem Prompt generieren. |
POST | /v1/images/edits | Eingabebilder 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/generations | Video-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}/cancel | Noch nicht abgeschlossenen Task abbrechen. |
POST | /v1/uploads | Referenzdatei hochladen und eine URL erhalten. |
GET | /v1/account/balance | Guthaben abrufen. |
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.
| Wert | Beschreibung |
|---|---|
official | Offizielle Route des Anbieters, abgerechnet zum Listenpreis des Anbieters. |
official-cheap | Günstigere offizielle Route. Standard für neue Anfragen und API-Schlüssel. |
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.
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.
| Status | Beschreibung |
|---|---|
queued | Akzeptiert und wartet auf den Start. |
submitted | An den Upstream-Anbieter gesendet. |
running | Wird generiert. progress reicht von 0 bis 100. |
succeeded | Abgeschlossen. Die Antwort enthält nun die Ausgabe-URLs. |
failed | Fehlgeschlagen. message gibt den Grund an. |
expired | Innerhalb des Task-Zeitlimits nicht abgeschlossen. |
canceled | Über den Abbruch-Endpunkt abgebrochen. |
https://api.mlmux.com/v1/tasks/{task_id}/cancelTasks 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.
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.
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.
https://api.mlmux.com/v1/uploadscurl https://api.mlmux.com/v1/uploads \
-H "Authorization: Bearer $MLMUX_API_KEY" \
-F "file=@start-frame.jpg"{
"url": "https://.../uploads/3f8a....jpg",
"asset_id": 1024,
"mime_type": "image/jpeg",
"size_bytes": 482113,
"asset_type": "image"
}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.
| Ereignis | Beschreibung |
|---|---|
request.succeeded | Eine Anfrage oder ein Task war erfolgreich. |
request.failed | Eine Anfrage oder ein Task ist fehlgeschlagen. data.error_code und data.error_message erklären den Grund. |
webhook.test | Wird gesendet, wenn Sie den Endpunkt in der Console testen. |
{
"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
}
}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.
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 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.
{
"error": {
"message": "Invalid API key",
"type": "invalid_request_error",
"code": "invalid_api_key",
"request_id": "req_9f2c..."
}
}| HTTP | Code | Bedeutung |
|---|---|---|
| 400 | invalid_request | Der Body ist kein gültiges JSON oder ein Feld hat den falschen Typ, wie z. B. ein unbekannter route_mode bei einer Bildgenerierung. |
| 400 | invalid_value | Ein Wert wie resolution, size, aspect_ratio oder n wird vom Modell nicht unterstützt. |
| 400 | model_not_found | Die Modell-ID existiert nicht oder ist nicht verfügbar. |
| 400 | invalid_video_request | Ein Videomodus, eine Referenzanzahl, ein Seitenverhältnis, eine Auflösung oder eine Dauer ist ungültig. |
| 400 | content_policy_violation | Der Prompt oder eine Eingabe wurde durch die Inhaltsmoderation blockiert. |
| 401 | invalid_api_key | Der API-Schlüssel fehlt, ist ungültig, abgelaufen oder deaktiviert. |
| 402 | insufficient_credits | Das Guthaben reicht für die geschätzten Kosten nicht aus. Laden Sie Guthaben auf und versuchen Sie es erneut. |
| 402 | spend_limit_exceeded | Die Anfrage würde ein in der Console festgelegtes Ausgabenlimit überschreiten. |
| 402 | api_key_monthly_limit_exceeded | Die Anfrage würde das monatliche Budget dieses API-Schlüssels überschreiten. |
| 403 | email_verification_required | Bestätigen Sie die E-Mail-Adresse des Kontos, bevor Sie die API verwenden. |
| 403 | model_not_allowed | Dieser API-Schlüssel ist auf andere Modelle beschränkt. |
| 403 | forbidden_asset_reference | Eine asset://-Referenz gehört nicht zu diesem Konto. |
| 404 | task_not_found | Der Task existiert nicht oder gehört zu einem anderen Konto. |
| 409 | idempotency_key_reused | Der Idempotency-Key wurde bereits mit einem anderen Body verwendet. |
| 409 | task_not_cancelable | Der Task ist bereits abgeschlossen. |
| 429 | rate_limit_exceeded | Zu viele Anfragen pro Minute für diesen Schlüssel oder dieses Konto. |
| 429 | capacity_exhausted | Jeder Upstream auf der ausgewählten Route ist ausgelastet. |
| 502 | model_unavailable | Die ausgewählte Route verfügt über keinen verfügbaren Upstream für dieses Modell. |
| 502 | generation_failed | Der Upstream-Anbieter konnte keine Ausgabe generieren. |
| 503 | generation_unavailable | Der Upstream-Anbieter ist vorübergehend nicht verfügbar. |
| 503 | route_mode_disabled | Der ausgewählte Route-Modus ist für dieses Modell deaktiviert. Senden Sie einen anderen route_mode. |
| 504 | generation_timeout | Zeitü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.