Preparando página…
▥ O Seedance 2.5 chegou! ›
PreçosDocsAtualizaçõesConta
GuiasVisão geralAPI de imagensAPI de vídeos
Nesta páginaInício rápidoAutenticaçãoEndpointsModo de rotaFaturamentoTarefas e pollingUploadsWebhooksErros
RecursosCatálogo de modelosPreçosChaves de APIEndpoints de webhookEspecificação OpenAPIStatus do serviçoAtualizações do produto
Visão geralAPI de imagensAPI de vídeos
Documentação

MLMux API

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.

Início rápido

  1. 01

    Criar uma chave de API

    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.

  2. 02

    Envie uma requisição

    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.

  3. 03

    Obtenha o resultado

    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.

Autenticação

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:

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

Endpoints

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étodoCaminhoDescrição
GET/v1/modelsListar os IDs de modelo que você pode chamar.
POST/v1/images/generationsGerar imagens a partir de um prompt.
POST/v1/images/editsEditar 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/generationsCriar 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}/cancelCancelar uma tarefa que não foi concluída.
POST/v1/uploadsFazer upload de um arquivo de referência e obter uma URL.
GET/v1/account/balanceObter seu saldo de créditos.

Modo de rota

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.

ValorDescrição
officialA rota oficial do provedor, cobrada pelo preço de tabela do provedor.
official-cheapUma rota oficial de custo mais baixo. Padrão para novas requisições e chaves de API.

Faturamento

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.

Tarefas e polling

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.

StatusDescrição
queuedAceita e aguardando início.
submittedEnviada ao provedor upstream.
runningGerando. progress vai de 0 a 100.
succeededConcluída. A resposta agora inclui as URLs de saída.
failedCom falha. message explica o motivo.
expiredNão concluída dentro do limite de tempo da tarefa.
canceledCancelada pelo endpoint de cancelamento.

Cancelar uma tarefa

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

Tarefas 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.

Retentativas seguras

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.

Uploads

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.

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

Webhooks

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.

EventoDescrição
request.succeededUma solicitação ou tarefa foi bem-sucedida.
request.failedUma solicitação ou tarefa falhou. data.error_code e data.error_message explicam o motivo.
webhook.testEnviado quando você testa o endpoint no 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
  }
}

Verificar assinaturas

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.

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

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.

Erros

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.

Resposta de erro
{
  "error": {
    "message": "Invalid API key",
    "type": "invalid_request_error",
    "code": "invalid_api_key",
    "request_id": "req_9f2c..."
  }
}
HTTPCódigoSignificado
400invalid_requestO 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.
400invalid_valueUm valor como resolution, size, aspect_ratio ou n não é suportado pelo modelo.
400model_not_foundO ID do modelo não existe ou não está disponível.
400invalid_video_requestO modo de vídeo, a contagem de referências, a proporção, a resolução ou a duração são inválidos.
400content_policy_violationO prompt ou uma entrada foi bloqueado pela moderação de conteúdo.
401invalid_api_keyA chave de API está ausente, inválida, expirada ou desativada.
402insufficient_creditsO saldo não cobre a cobrança estimada. Adicione créditos e tente novamente.
402spend_limit_exceededA solicitação excederia um limite de gastos definido no Console.
402api_key_monthly_limit_exceededA solicitação excederia o orçamento mensal desta chave de API.
403email_verification_requiredVerifique o endereço de e-mail da conta antes de usar a API.
403model_not_allowedEsta chave de API é restrita a outros modelos.
403forbidden_asset_referenceUma referência asset:// não pertence a esta conta.
404task_not_foundA tarefa não existe ou pertence a outra conta.
409idempotency_key_reusedO Idempotency-Key já foi usado com um corpo diferente.
409task_not_cancelableA tarefa já foi concluída.
429rate_limit_exceededMuitas solicitações por minuto para esta chave ou conta.
429capacity_exhaustedTodos os upstreams na rota selecionada estão ocupados.
502model_unavailableA rota selecionada não possui nenhum upstream disponível para este modelo.
502generation_failedO provedor upstream falhou ao gerar uma saída.
503generation_unavailableO provedor upstream está temporariamente indisponível.
503route_mode_disabledO modo de rota selecionado está desativado para este modelo. Envie outro route_mode.
504generation_timeoutO 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.

PróximoAPI de imagens