MaIA Scan

MaIA API · v1 · documentação técnica

API MaIA: análise de pele e cabelo e prova virtual, por HTTP.

Uma chave, dois endpoints, um crédito por chamada bem-sucedida. Esta página descreve exatamente o que o gateway em maiascan.ai/api aceita e devolve — campos, headers, códigos de erro e limites — com exemplos em curl, Node.js e Python.

Visão geral

A API MaIA é o gateway HTTPS que a B4A expõe em maiascan.ai para dois dos três produtos MaIA. Você autentica com uma chave da sua conta, envia uma foto em multipart/form-data e recebe a resposta de forma síncrona: um perfil de beleza em JSON (MaIA Scan) ou a mesma foto em PNG com o produto aplicado (MaIA Try-On). Cada chamada bem-sucedida consome um crédito do saldo da conta.

Nada é assumido do lado da sua stack: qualquer cliente HTTP capaz de enviar multipart funciona. Não há SDK obrigatório, webhook nem estado de sessão — a resposta da chamada é o resultado.

Disponibilidade dos três produtos MaIA
ProdutoDisponibilidadeEndpointDescrição
MaIA ScanSelf-service via APIPOST /api/v1/scanPerfil de pele e cabelo em JSON a partir de uma selfie frontal (foto de perfil opcional). 1 crédito por análise.
MaIA Try-OnSelf-service via APIPOST /api/v1/try-onA foto da cliente volta em PNG com o batom aplicado — nesta versão, os seis tons e três acabamentos de demonstração. 1 crédito por render. Paleta calibrada para os seus produtos: sob projeto.
MaIA Beauty AdvisorSob projetoNão é um endpoint self-service. É entregue pela B4A como projeto — no WhatsApp da marca, como widget na página de produto ou no chat — usando os mesmos dados de perfil que a MaIA Scan devolve e o catálogo integrado da sua marca.

Comece em quatro passos

  1. Crie a conta

    Entre com Google ou receba um link mágico por e-mail. Não há senha nem aprovação manual.

    Criar conta
  2. Compre um pacote de créditos

    Starter (500 créditos), Growth (2.500) ou Scale (10.000) — pagamento por cartão, Pix ou boleto no nosso próprio checkout. Os créditos não expiram.

    Ver pacotes
  3. Crie a chave de API

    A criação de chaves é liberada após a primeira compra. A chave (msk_live_…) aparece uma única vez — copie e guarde no seu cofre de segredos.

    Minha conta
  4. Faça a primeira chamada

    Envie uma selfie para POST /api/v1/scan ou uma foto com tom e acabamento para POST /api/v1/try-on. A resposta chega na mesma requisição.

curl -X POST https://maiascan.ai/api/v1/scan \
  -H "Authorization: Bearer msk_live_…" \
  -H "x-request-id: order-8841" \
  -F "front=@selfie.jpg;type=image/jpeg" \
  -F "side=@profile.jpg;type=image/jpeg"

Autenticação

Toda rota em /api/v1 exige o header Authorization com uma chave de API no formato Bearer. A chave identifica a conta (e, portanto, o saldo de créditos) e a própria chave usada — o uso fica registrado por chave.

Authorization: Bearer msk_live_…
  • Formato: msk_live_ seguido de 32 caracteres alfanuméricos. Guardamos apenas o hash SHA-256 e um prefixo de exibição; o texto completo é mostrado uma única vez na criação.
  • Até 10 chaves ativas por conta. Revogue qualquer chave a qualquer momento no portal (Minha conta → Chaves de API); a revogação vale na chamada seguinte.
  • Chave ausente, inválida ou revogada: 401 com { "error": "invalid_api_key" }.
  • Use a chave apenas no servidor. Nunca a embuta em código de navegador ou app distribuído — quem tiver a chave gasta os seus créditos.

Créditos

1 crédito = 1 chamada bem-sucedida, seja uma análise (scan) ou um render (try-on). O crédito é reservado antes de chamarmos o modelo e liquidado quando a resposta chega; se o modelo falhar, a reserva é devolvida automaticamente — você nunca paga por um resultado que não recebeu, e nós nunca processamos uma foto que não podemos cobrar.

PacotePreçoCréditospor chamada
StarterR$ 998500R$ 2,00
GrowthR$ 1.9982.500R$ 0,80
ScaleR$ 4.99810.000R$ 0,50

Recargas avulsas e automáticas usam o preço por chamada do último pacote pago. Créditos não expiram. Enterprise: fale com a gente.

  • O saldo após a chamada vem em toda resposta bem-sucedida: campo credits_remaining no JSON do scan e header X-Credits-Remaining no try-on.
  • Saldo zero: a chamada é recusada antes de qualquer processamento com 402 e { "error": "insufficient_credits", "balance": 0 }. A tentativa fica registrada no seu uso, sem cobrança.
  • Recarga automática: no portal você define um limiar e um valor; quando o saldo cai abaixo dele, criamos um pedido e enviamos o link de pagamento por e-mail (nunca cobramos o cartão sem você).
Ver pacotes e saldo

POST/api/v1/scan

Envia uma selfie frontal (e opcionalmente uma foto de perfil) e recebe o perfil de beleza da pessoa em JSON. Síncrono: a resposta é o resultado.

Status em produção (22/09/2026): o gateway ainda não está conectado ao serviço de análise da MaIA Scan API. Até a credencial ser emitida, POST /api/v1/scan responde 503 upstream_not_configured e nenhum crédito é cobrado. O contrato desta seção é o definitivo — integre contra ele; a resposta passará a ser 200 sem mudança do seu lado.

Requisição

Corpo multipart/form-data com os campos abaixo. Headers: Authorization (obrigatório) e x-request-id (opcional).

CampoTipoObrigatórioDescrição
frontarquivosimFoto frontal do rosto. Content-Type declarado deve ser image/jpeg, image/png, image/webp ou image/heic. Até 10 MB.
sidearquivoopcionalFoto de perfil (lateral) da mesma pessoa, mesmos tipos e limite. Enviada na mesma chamada — não custa crédito adicional.
x-request-idheaderopcionalSeu identificador da requisição (até 80 caracteres). Gravado junto ao evento de uso para conciliação; não deduplica chamadas.

Resposta

200 OK, application/json. O envelope é fixo; result é o documento de análise devolvido pela MaIA Scan API.

CampoTipoDescrição
session_idstringIdentificador do evento de uso (a sessão cobrada). Guarde para suporte e conciliação.
capture_idstringIdentificador da captura na MaIA Scan API.
credits_remainingintegerSaldo da conta após esta chamada.
resultobjectPerfil de beleza: tom e subtom de pele, tipo de pele, métricas Skin Scan (vermelhidão, oleosidade, textura, poros, manchas, hidratação, pigmentação), cor e estrutura do cabelo, checagens de qualidade da foto e confiança por campo. As chaves seguem a versão da MaIA Scan API — trate como documento JSON e leia os campos que precisa.
Resposta
HTTP/1.1 200 OK
Content-Type: application/json

{
  "session_id": "cmg1x3k9h0001abcd",
  "capture_id": "cap_01J8…",
  "credits_remaining": 499,
  "result": { … }
}

Erros

StatusCódigoSignificadoCrédito cobrado?
400front_requiredO campo front não foi enviado.não
400unsupported_media_typeContent-Type de um dos arquivos fora de JPEG/PNG/WEBP/HEIC.não
401invalid_api_keyChave ausente, inválida ou revogada.não
402insufficient_creditsSaldo zero; o corpo traz balance.não
413Arquivo acima de 10 MB (recusado na recepção; corpo genérico).não
429Mais de 120 requisições por minuto do mesmo IP.não
502analysis_failedO modelo não completou a análise. O crédito reservado foi devolvido; o corpo traz session_id.não
503upstream_not_configuredO serviço de análise não está conectado neste ambiente. Nada é cobrado.não

Limites

  • Até 10 MB por arquivo, no máximo 2 arquivos (front + side).
  • Chamada síncrona; o gateway aguarda o modelo por até 60 s.
  • 120 requisições por minuto por IP de origem.

Consentimento obrigatório: obtenha a autorização explícita da pessoa antes de enviar a foto (LGPD). A MaIA Scan não faz reconhecimento facial nem identificação; devolve análise cosmética para personalização.

Exemplos

curl -X POST https://maiascan.ai/api/v1/scan \
  -H "Authorization: Bearer msk_live_…" \
  -H "x-request-id: order-8841" \
  -F "front=@selfie.jpg;type=image/jpeg" \
  -F "side=@profile.jpg;type=image/jpeg"

POST/api/v1/try-on

Envia uma foto frontal com um tom e um acabamento e recebe a mesma foto em PNG com o batom aplicado. Só a área da maquiagem muda. Síncrono.

Requisição

Corpo multipart/form-data com exatamente os campos abaixo (campos de texto desconhecidos são recusados com 400). Headers: Authorization (obrigatório) e x-request-id (opcional).

CampoTipoObrigatórioDescrição
photoarquivosimFoto frontal, JPEG ou PNG (verificamos os bytes, não o Content-Type). Até 6 MB; lado menor de pelo menos 320 px; boca visível.
shadetextosimUm dos tons de demonstração: rose, red, berry, coral, plum ou nude (ver GET /api/v1/try-on/shades).
finishtextosimmatte, satin ou gloss.
x-request-idheaderopcionalSeu identificador da requisição (até 80 caracteres), gravado no evento de uso.

Resposta

200 OK, image/png — o corpo é a imagem renderizada. O recibo vem nos headers:

HeaderDescrição
X-Session-IdIdentificador do evento de uso (a sessão cobrada).
X-Credits-RemainingSaldo da conta após esta chamada.
X-TryOn-Finish-RequestedO acabamento que você pediu.
X-TryOn-Finish-AppliedO acabamento efetivamente aplicado. Quando o modelo não consegue aplicar o acabamento pedido a uma foto, o gateway renderiza no acabamento treinado do tom (matte para red/berry/plum, satin para rose/coral/nude) em vez de falhar — compare os dois headers para avisar a pessoa.
Cache-Controlno-store. A imagem não fica em nenhum cache do nosso lado.
Resposta
HTTP/1.1 200 OK
Content-Type: image/png
Cache-Control: no-store
X-Session-Id: cmg1x4p2r0002efgh
X-Credits-Remaining: 498
X-TryOn-Finish-Requested: gloss
X-TryOn-Finish-Applied: gloss

<PNG bytes>

Erros

StatusCódigoSignificadoCrédito cobrado?
400photo_requiredO campo photo não foi enviado.não
400Campo de texto desconhecido ou fora do formato (validação do corpo).não
401invalid_api_keyChave ausente, inválida ou revogada.não
402insufficient_creditsSaldo zero; o corpo traz balance.não
413photo_too_largeFoto acima de 6 MB. Uploads muito acima do limite são cortados na recepção com um 413 genérico.não
422invalid_selectionshade ou finish fora da lista.não
422unsupported_photoOs bytes não são JPEG nem PNG (ou o arquivo está vazio).não
422bad_photoO modelo recusou a foto (rosto não frontal, boca não visível, lado menor abaixo de 320 px). Crédito devolvido.não
429Mais de 120 requisições por minuto do mesmo IP.não
503upstream_unavailableO serviço de render falhou ou está ocupado. Crédito devolvido; tente de novo em instantes.não
503upstream_not_configuredO serviço de render não está conectado neste ambiente. Nada é cobrado.não

Limites

  • JPEG ou PNG, até 6 MB, lado menor ≥ 320 px. Fotos maiores que 1600 × 1079 px podem ser reduzidas pelo modelo antes do render.
  • Cerca de 2 a 4 segundos por render. O serviço de render escala a zero: a primeira chamada depois de um período ocioso pode levar mais tempo (o gateway aguarda até 60 s e repete uma vez um 422 tardio de cold start).
  • 120 requisições por minuto por IP de origem.
  • Cor simulada pode diferir do produto real. Nesta versão da API, os tons são os seis de demonstração; a paleta calibrada para os produtos da sua marca é entregue sob projeto.

Exemplos

curl -X POST https://maiascan.ai/api/v1/try-on \
  -H "Authorization: Bearer msk_live_…" \
  -F "photo=@selfie.jpg;type=image/jpeg" \
  -F "shade=rose" \
  -F "finish=gloss" \
  -D headers.txt \
  -o try-on.png
# headers.txt now holds X-Session-Id, X-Credits-Remaining, X-TryOn-Finish-Applied

GET/api/v1/try-on/shades

Lista os tons e acabamentos aceitos por POST /api/v1/try-on, com o hex de referência e o acabamento treinado de cada tom. Não consome crédito.

Resposta

200 OK, application/json, Cache-Control: private, max-age=3600. Exige a mesma chave (401 sem ela).

CampoTipoDescrição
shades[].idstringValor aceito no campo shade do try-on.
shades[].hexstringCor de referência do tom (#RRGGBB) para exibir na sua interface.
shades[].trained_finishstringAcabamento com que o tom foi treinado — o fallback de X-TryOn-Finish-Applied.
finishesstring[]Valores aceitos no campo finish.
max_upload_bytesintegerLimite de upload da foto em bytes (6 MB).
Resposta
{
  "shades": [
    { "id": "rose",  "hex": "#B85C75", "trained_finish": "satin" },
    { "id": "red",   "hex": "#B8293D", "trained_finish": "matte" },
    { "id": "berry", "hex": "#883252", "trained_finish": "matte" },
    { "id": "coral", "hex": "#D96758", "trained_finish": "satin" },
    { "id": "plum",  "hex": "#703B5B", "trained_finish": "matte" },
    { "id": "nude",  "hex": "#AF786F", "trained_finish": "satin" }
  ],
  "finishes": ["matte", "satin", "gloss"],
  "max_upload_bytes": 6291456
}

Exemplos

curl https://maiascan.ai/api/v1/try-on/shades \
  -H "Authorization: Bearer msk_live_…"

Erros e códigos de status

Todo erro é JSON com um campo error estável (para o seu código) e message legível (para o log). Compare error, não message. Nenhum erro consome crédito: quando a falha acontece depois da reserva (502 no scan, 422 bad_photo ou 503 no try-on), o crédito é devolvido na mesma transação.

StatusSignificado
400Requisição malformada: campo obrigatório ausente, tipo de arquivo não declarado corretamente ou campo de texto desconhecido.
401invalid_api_key — chave ausente, inválida ou revogada.
402insufficient_credits — saldo zero; compre um pacote ou espere a recarga automática.
413Arquivo acima do limite (10 MB no scan, 6 MB no try-on).
422Entrada válida em forma, inválida em conteúdo: invalid_selection, unsupported_photo, bad_photo (try-on).
429Limite de requisições por minuto excedido. Aguarde e repita com backoff.
502analysis_failed — a análise não completou; crédito devolvido (scan).
503upstream_unavailable (crédito devolvido) ou upstream_not_configured (nada cobrado).
Formato de um erro
HTTP/1.1 402 Payment Required
Content-Type: application/json

{
  "error": "insufficient_credits",
  "message": "Buy a credit package to continue.",
  "balance": 0
}

Limites, idempotência e x-request-id

  • Rate limit: 120 requisições por minuto por IP de origem, em todas as rotas /api/v1. Ainda não há limite por chave; para volumes maiores, fale com a gente.
  • Idempotência: as chamadas não são idempotentes — cada 200 consome um crédito. Não repita automaticamente uma chamada que devolveu 200; repita apenas erros 429, 502 e 503 (que não cobram), com backoff exponencial.
  • x-request-id: envie o seu identificador (até 80 caracteres). Ele é gravado no evento de uso e aparece na conciliação; use-o com session_id / X-Session-Id ao falar com o suporte.
  • Timeouts: o gateway aguarda o modelo por até 60 s. Configure o seu cliente HTTP com pelo menos 90 s para não abandonar uma chamada que ainda será cobrada e respondida.

Tratamento de dados e consentimento

  • Consentimento: você é responsável por obter a autorização explícita da pessoa antes de enviar qualquer foto, nos termos da LGPD. Na nossa própria demo o texto usado é: "Autorizo o processamento desta foto apenas para gerar a simulação; ela não é armazenada."
  • Fotos no gateway: ficam em memória apenas durante a requisição e são encaminhadas uma vez ao modelo. O gateway não grava fotos em disco, banco ou logs — os logs registram tamanho, tom, acabamento, latência e status.
  • Try-on: a foto não é armazenada nem pelo gateway nem pelo serviço de render; só o PNG volta para você, com Cache-Control: no-store.
  • Scan: a MaIA Scan API armazena o resultado estruturado com as versões de modelo e de pipeline; a retenção da imagem bruta é configurável por projeto — fale com a gente para definir a sua.
  • O que não fazemos: reconhecimento facial, identificação de pessoas, inferência de traços protegidos ou diagnóstico médico. Campos com baixa confiança devem ser confirmados com a pessoa.
  • Registro de uso: por chamada guardamos conta, chave, endpoint, status, crédito, latência, x-request-id e, no scan, o capture_id — é o que aparece na sua página de uso.
Política de Privacidade da B4A →

Base URL, versão e contato

https://maiascan.ai/api
  • Base URL: https://maiascan.ai/api — sempre HTTPS. As rotas públicas ficam sob /v1.
  • Versionamento: a versão vai no caminho (v1). Mudanças compatíveis (campos novos no JSON, headers novos, tons novos) chegam sem troca de versão; qualquer mudança incompatível nasce como /v2, com /v1 mantida em paralelo por um período anunciado.
  • Status do gateway: GET https://maiascan.ai/api/health devolve { "status": "ok", "commit": "…" } — sem autenticação.
  • Suporte técnico e comercial: comercial@b4a.ai.

Precisa de mais volume, limites por chave, paleta calibrada para o seu catálogo, MaIA Beauty Advisor ou um contrato enterprise? Fale com a gente — a B4A entrega projetos completos em cima da mesma API.