Uma única chave de API e um formato de requisição para modelos de geração de imagem e vídeo. As imagens retornam na resposta; os vídeos são executados como tarefas que você consulta periodicamente ou recebe via webhook.
Crie uma chave em Console → Chaves de API. A chave completa é exibida apenas uma vez, portanto, armazene-a imediatamente, por exemplo, como MLMUX_API_KEY.
Chame um endpoint de imagem ou vídeo com um ID de modelo e um prompt. O uso é cobrado na conta proprietária da chave.
Requisições de imagem retornam URLs na resposta. Requisições de vídeo retornam uma tarefa: faça polling da sua poll_url ou assine um webhook.
Envie sua chave no cabeçalho Authorization: Bearer em todas as requisições para https://api.mlmux.com. As chaves começam com sk-. A API não aceita chaves em outros cabeçalhos ou na query string.
Para verificar se uma chave funciona, liste os modelos que ela pode chamar:
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" }
]
}Todos os endpoints estão em https://api.mlmux.com. Os corpos de requisição e resposta são em JSON, a menos que indicado.
| Método | Caminho | Descrição |
|---|---|---|
GET | /v1/models | Listar os IDs de modelo que você pode chamar. |
POST | /v1/images/generations | Gerar imagens a partir de um prompt. |
POST | /v1/images/edits | Editar ou combinar imagens de entrada. Aceita JSON ou multipart. |
GET | /v1/images/generations/{task_id} | Obter uma tarefa assíncrona de imagem. Edições usam /v1/images/edits/{task_id}. |
POST | /v1/videos/generations | Criar uma tarefa de vídeo. |
GET | /v1/videos/generations/{task_id} | Obter uma tarefa de vídeo. |
GET | /v1/tasks/{task_id} | Obter qualquer tarefa por ID. |
POST | /v1/tasks/{task_id}/cancel | Cancelar uma tarefa que não foi concluída. |
POST | /v1/uploads | Fazer upload de um arquivo de referência e obter uma URL. |
GET | /v1/account/balance | Obter seu saldo de créditos. |
Defina route_mode no corpo da requisição para escolher o nível upstream. Uma requisição permanece em seu nível e nunca muda silenciosamente para outro; se o nível estiver desativado para o modelo, a requisição falhará com route_mode_disabled. Quando o campo é omitido, o MLMux usa os modos de rota definidos na chave de API e, em seguida, o padrão do modelo, que é official-cheap.
| Valor | Descrição |
|---|---|
official | A rota oficial do provedor, cobrada pelo preço de tabela do provedor. |
official-cheap | Uma rota oficial de custo mais baixo. Padrão para novas requisições e chaves de API. |
O uso é cobrado em créditos, e 1 crédito equivale a 1 dólar americano. Os modelos de vídeo são cobrados por token de saída; os modelos de imagem são cobrados por token upstream ou por imagem, dependendo do modelo. Consulte a página de preços para ver as tarifas de cada rota.
As respostas de tarefas exibem estimated_charge_credits quando a tarefa é criada e actual_charge_credits após sua conclusão bem-sucedida, ambos em créditos. Os payloads de webhook exibem actual_charge_nano_credits como um número inteiro, em que 1,000,000,000 nano-créditos equivalem a 1 crédito.
Consulte seu saldo restante com GET /v1/account/balance.
Requisições de vídeo e requisições de imagem enviadas com "async": true retornam HTTP 202 com uma tarefa. Faça polling da poll_url da tarefa a cada poucos segundos até que seu status seja succeeded, failed, expired ou canceled.
| Status | Descrição |
|---|---|
queued | Aceita e aguardando início. |
submitted | Enviada ao provedor upstream. |
running | Gerando. progress vai de 0 a 100. |
succeeded | Concluída. A resposta agora inclui as URLs de saída. |
failed | Com falha. message explica o motivo. |
expired | Não concluída dentro do limite de tempo da tarefa. |
canceled | Cancelada pelo endpoint de cancelamento. |
https://api.mlmux.com/v1/tasks/{task_id}/cancelTarefas que estejam queued, submitted ou running podem ser canceladas, e seus créditos retidos são liberados. A resposta é {"id": "task_…", "status": "canceled"}. Tarefas em qualquer outro status retornam 409 task_not_cancelable.
Solicitações assíncronas de geração de vídeo e imagem aceitam um cabeçalho Idempotency-Key de até 160 caracteres. Enviar a mesma chave com o mesmo corpo novamente retorna a tarefa original em vez de criar uma nova. Enviar a mesma chave com um corpo diferente retorna 409 idempotency_key_reused. Solicitações síncronas e edições de imagem não aceitam este cabeçalho.
Para usar um arquivo local como referência, faça o upload dele como o campo multipart file. Imagens, vídeos e áudios de até 50 MB são aceitos e mantidos por 3 dias. Passe a url retornada em qualquer campo de URL de uma solicitação de geração.
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"
}Crie um endpoint em Console → Webhooks e escolha os eventos a receber. Quando uma solicitação ou tarefa for concluída, o MLMux enviará uma solicitação POST com um corpo JSON para a sua URL.
| Evento | Descrição |
|---|---|
request.succeeded | Uma solicitação ou tarefa foi bem-sucedida. |
request.failed | Uma solicitação ou tarefa falhou. data.error_code e data.error_message explicam o motivo. |
webhook.test | Enviado quando você testa o endpoint no Console. |
{
"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
}
}Cada entrega é assinada com o segredo de assinatura do endpoint (whsec_…), que é exibido apenas uma vez ao criá-lo ou alterná-lo. O cabeçalho X-MLMux-Signature contém um timestamp Unix t e uma assinatura v1: o HMAC-SHA256 em hexadecimal do timestamp, um ponto e o corpo bruto da solicitação. Calcule o mesmo valor, compare-o e rejeite timestamps antigos.
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 ?? ""));
}Retorne qualquer status 2xx em até 10 segundos. O MLMux faz até 6 tentativas de entrega ao longo de aproximadamente 11 horas. Use X-MLMux-Event-ID para ignorar entregas duplicadas.
Os erros compartilham o mesmo formato JSON. Faça o tratamento com base em code em vez de message. Inclua o request_id, que também é retornado no cabeçalho X-Request-ID, ao entrar em contato com o suporte.
{
"error": {
"message": "Invalid API key",
"type": "invalid_request_error",
"code": "invalid_api_key",
"request_id": "req_9f2c..."
}
}| HTTP | Código | Significado |
|---|---|---|
| 400 | invalid_request | O corpo não é um JSON válido ou um campo possui o tipo incorreto, como um route_mode desconhecido em uma geração de imagem. |
| 400 | invalid_value | Um valor como resolution, size, aspect_ratio ou n não é suportado pelo modelo. |
| 400 | model_not_found | O ID do modelo não existe ou não está disponível. |
| 400 | invalid_video_request | O modo de vídeo, a contagem de referências, a proporção, a resolução ou a duração são inválidos. |
| 400 | content_policy_violation | O prompt ou uma entrada foi bloqueado pela moderação de conteúdo. |
| 401 | invalid_api_key | A chave de API está ausente, inválida, expirada ou desativada. |
| 402 | insufficient_credits | O saldo não cobre a cobrança estimada. Adicione créditos e tente novamente. |
| 402 | spend_limit_exceeded | A solicitação excederia um limite de gastos definido no Console. |
| 402 | api_key_monthly_limit_exceeded | A solicitação excederia o orçamento mensal desta chave de API. |
| 403 | email_verification_required | Verifique o endereço de e-mail da conta antes de usar a API. |
| 403 | model_not_allowed | Esta chave de API é restrita a outros modelos. |
| 403 | forbidden_asset_reference | Uma referência asset:// não pertence a esta conta. |
| 404 | task_not_found | A tarefa não existe ou pertence a outra conta. |
| 409 | idempotency_key_reused | O Idempotency-Key já foi usado com um corpo diferente. |
| 409 | task_not_cancelable | A tarefa já foi concluída. |
| 429 | rate_limit_exceeded | Muitas solicitações por minuto para esta chave ou conta. |
| 429 | capacity_exhausted | Todos os upstreams na rota selecionada estão ocupados. |
| 502 | model_unavailable | A rota selecionada não possui nenhum upstream disponível para este modelo. |
| 502 | generation_failed | O provedor upstream falhou ao gerar uma saída. |
| 503 | generation_unavailable | O provedor upstream está temporariamente indisponível. |
| 503 | route_mode_disabled | O modo de rota selecionado está desativado para este modelo. Envie outro route_mode. |
| 504 | generation_timeout | O provedor upstream esgotou o tempo limite. |
Respostas 429 incluem um cabeçalho Retry-After. Aguarde esse número de segundos antes de tentar novamente e repita erros 5xx com backoff exponencial.