Préparation de la page…
▥ Seedance 2.5 est disponible ! ›
TarifsDocsMises à jourCompte
GuidesVue d'ensembleAPI ImageAPI Vidéo
Sur cette pageDémarrage rapideAuthentificationEndpointsMode de routageFacturationTâches et pollingTéléversementsWebhooksErreurs
RessourcesCatalogue de modèlesTarifsClés APIEndpoints de webhookSpécification OpenAPIÉtat du serviceMises à jour produit
Vue d'ensembleAPI ImageAPI Vidéo
Documentation

API MLMux

Une seule clé API et un format de requête unique pour les modèles de génération d'images et de vidéos. Les images sont renvoyées directement dans la réponse ; les vidéos s'exécutent sous forme de tâches que vous pouvez interroger ou recevoir par webhook.

Démarrage rapide

  1. 01

    Créer une clé API

    Créez une clé dans Console → Clés API. La clé complète n'est affichée qu'une seule fois, enregistrez-la donc immédiatement, par exemple sous MLMUX_API_KEY.

  2. 02

    Envoyer une requête

    Appelez un endpoint d'image ou de vidéo avec un identifiant de modèle et un prompt. L'utilisation est facturée au compte propriétaire de la clé.

  3. 03

    Obtenir le résultat

    Les requêtes d'image renvoient des URL dans la réponse. Les requêtes de vidéo renvoient une tâche : interrogez son poll_url ou abonnez-vous à un webhook.

Authentification

Envoyez votre clé dans l'en-tête Authorization: Bearer de chaque requête vers https://api.mlmux.com. Les clés commencent par sk-. L'API n'accepte pas les clés dans d'autres en-têtes ou dans la query string.

Pour vérifier qu'une clé fonctionne, listez les modèles qu'elle peut appeler :

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

Endpoints

Tous les endpoints se trouvent sous https://api.mlmux.com. Les corps de requête et de réponse sont en JSON, sauf indication contraire.

MéthodeCheminDescription
GET/v1/modelsLister les identifiants de modèles que vous pouvez appeler.
POST/v1/images/generationsGénérer des images à partir d'un prompt.
POST/v1/images/editsModifier ou combiner des images sources. Accepte le format JSON ou multipart.
GET/v1/images/generations/{task_id}Récupérer une tâche d'image asynchrone. Les modifications utilisent /v1/images/edits/{task_id}.
POST/v1/videos/generationsCréer une tâche vidéo.
GET/v1/videos/generations/{task_id}Récupérer une tâche vidéo.
GET/v1/tasks/{task_id}Récupérer n'importe quelle tâche par son ID.
POST/v1/tasks/{task_id}/cancelAnnuler une tâche qui n'est pas terminée.
POST/v1/uploadsTéléverser un fichier de référence et obtenir une URL.
GET/v1/account/balanceObtenir votre solde de crédits.

Mode de routage

Définissez route_mode dans le corps de la requête pour choisir le niveau en amont. Une requête reste dans son niveau et ne bascule jamais silencieusement vers un autre ; si le niveau est désactivé pour le modèle, la requête échoue avec route_mode_disabled. Lorsque le champ est omis, MLMux utilise les modes de routage définis sur la clé API, puis la valeur par défaut du modèle, qui est official-cheap.

ValeurDescription
officialLa route officielle du fournisseur, facturée à son tarif catalogue.
official-cheapUne route officielle plus économique. Valeur par défaut pour les nouvelles requêtes et clés API.

Facturation

L'utilisation est facturée en crédits, où 1 crédit équivaut à 1 dollar américain. Les modèles vidéo sont facturés par token de sortie ; les modèles d'image sont facturés par token en amont ou par image, selon le modèle. Consultez la page des tarifs pour connaître les prix de chaque route.

Les réponses de tâche indiquent estimated_charge_credits lors de la création de la tâche et actual_charge_credits après sa réussite, tous deux exprimés en crédits. Les payloads de webhook indiquent actual_charge_nano_credits sous forme d'entier, où 1 000 000 000 nano-crédits équivalent à 1 crédit.

Consultez votre solde restant avec GET /v1/account/balance.

Tâches et polling

Les requêtes vidéo et les requêtes d'image envoyées avec "async": true renvoient un code HTTP 202 avec une tâche. Interrogez le poll_url de la tâche toutes les quelques secondes jusqu'à ce que son statut soit succeeded, failed, expired ou canceled.

StatutDescription
queuedAcceptée et en attente de démarrage.
submittedEnvoyée au fournisseur en amont.
runningGénération en cours. progress évolue de 0 à 100.
succeededTerminée. La réponse inclut désormais les URL de sortie.
failedÉchouée. Le champ message en explique la raison.
expiredNon terminée dans le délai limite imparti.
canceledAnnulée via l'endpoint d'annulation.

Annuler une tâche

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

Les tâches aux statuts queued, submitted ou running peuvent être annulées, et leurs crédits réservés sont libérés. La réponse est {"id": "task_…", "status": "canceled"}. Les tâches dans tout autre statut renvoient 409 task_not_cancelable.

Nouvelles tentatives sécurisées

Les requêtes asynchrones de génération d'images et de vidéos acceptent un en-tête Idempotency-Key d'un maximum de 160 caractères. Envoyer à nouveau la même clé avec le même corps renvoie la tâche d'origine au lieu d'en créer une nouvelle. Envoyer la même clé avec un corps différent renvoie une erreur 409 idempotency_key_reused. Les requêtes synchrones et les modifications d'image n'acceptent pas cet en-tête.

Téléversements

Pour utiliser un fichier local comme référence, téléversez-le dans le champ multipart file. Les images, vidéos et fichiers audio jusqu'à 50 MB sont acceptés et conservés pendant 3 jours. Transmettez l'url renvoyée dans n'importe quel champ d'URL d'une requête de génération.

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

Webhooks

Créez un point de terminaison dans Console → Webhooks et choisissez les événements à recevoir. Lorsqu'une requête ou une tâche se termine, MLMux envoie une requête POST avec un corps JSON à votre URL.

ÉvénementDescription
request.succeededUne requête ou une tâche a réussi.
request.failedUne requête ou une tâche a échoué. data.error_code et data.error_message en expliquent la raison.
webhook.testEnvoyé lorsque vous testez le point de terminaison dans la Console.
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
  }
}

Vérifier les signatures

Chaque envoi est signé avec le secret de signature du point de terminaison (whsec_…), qui n'est affiché qu'une seule fois lors de sa création ou de son renouvellement. L'en-tête X-MLMux-Signature contient un horodatage Unix t et une signature v1 : le HMAC-SHA256 hexadécimal de l'horodatage, d'un point et du corps brut de la requête. Calculez la même valeur, comparez-la et rejetez les horodatages trop anciens.

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 ?? ""));
}

Renvoyez n'importe quel statut 2xx dans les 10 secondes. MLMux effectue jusqu'à 6 tentatives d'envoi sur une durée d'environ 11 heures. Utilisez X-MLMux-Event-ID pour ignorer les envois en double.

Erreurs

Les erreurs partagent une structure JSON unique. Fondez vos conditions sur code plutôt que sur message. Incluez request_id, qui est également renvoyé dans l'en-tête X-Request-ID, lorsque vous contactez l'assistance.

Réponse d'erreur
{
  "error": {
    "message": "Invalid API key",
    "type": "invalid_request_error",
    "code": "invalid_api_key",
    "request_id": "req_9f2c..."
  }
}
HTTPCodeSignification
400invalid_requestLe corps n'est pas un JSON valide ou un champ a un type incorrect, comme un route_mode inconnu lors d'une génération d'image.
400invalid_valueUne valeur telle que resolution, size, aspect_ratio ou n n'est pas prise en charge par le modèle.
400model_not_foundL'identifiant du modèle n'existe pas ou n'est pas disponible.
400invalid_video_requestLe mode vidéo, le nombre de références, le format, la résolution ou la durée ne sont pas valides.
400content_policy_violationLe prompt ou une entrée a été bloqué par la modération de contenu.
401invalid_api_keyLa clé API est manquante, invalide, expirée ou désactivée.
402insufficient_creditsLe solde ne permet pas de couvrir le montant estimé. Rechargez vos crédits et réessayez.
402spend_limit_exceededLa requête dépasserait une limite de dépenses définie dans la Console.
402api_key_monthly_limit_exceededLa requête dépasserait le budget mensuel de cette clé API.
403email_verification_requiredVérifiez l'adresse e-mail du compte avant d'utiliser l'API.
403model_not_allowedCette clé API est restreinte à d'autres modèles.
403forbidden_asset_referenceUne référence asset:// n'appartient pas à ce compte.
404task_not_foundLa tâche n'existe pas ou appartient à un autre compte.
409idempotency_key_reusedLa valeur de Idempotency-Key a déjà été utilisée avec un corps différent.
409task_not_cancelableLa tâche est déjà terminée.
429rate_limit_exceededTrop de requêtes par minute pour cette clé ou ce compte.
429capacity_exhaustedTous les fournisseurs en amont sur le routage sélectionné sont occupés.
502model_unavailableLe routage sélectionné n'a aucun fournisseur disponible pour ce modèle.
502generation_failedLe fournisseur en amont n'a pas pu générer de résultat.
503generation_unavailableLe fournisseur en amont est temporairement indisponible.
503route_mode_disabledLe mode de routage sélectionné est désactivé pour ce modèle. Envoyez un autre route_mode.
504generation_timeoutLe fournisseur en amont a expiré.

Les réponses 429 incluent un en-tête Retry-After. Attendez ce nombre de secondes avant de réessayer, et réessayez les erreurs 5xx avec un intervalle exponentiel.

SuivantAPI Image