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.
| Produto | Disponibilidade | Endpoint | Descrição |
|---|---|---|---|
| MaIA Scan | Self-service via API | POST /api/v1/scan | Perfil de pele e cabelo em JSON a partir de uma selfie frontal (foto de perfil opcional). 1 crédito por análise. |
| MaIA Try-On | Self-service via API | POST /api/v1/try-on | A 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 Advisor | Sob projeto | — | Nã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
Crie a conta
Entre com Google ou receba um link mágico por e-mail. Não há senha nem aprovação manual.
Criar contaCompre 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 pacotesCrie 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 contaFaç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.
| Pacote | Preço | Créditos | por chamada |
|---|---|---|---|
| Starter | R$ 998 | 500 | R$ 2,00 |
| Growth | R$ 1.998 | 2.500 | R$ 0,80 |
| Scale | R$ 4.998 | 10.000 | R$ 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ê).
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).
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
front | arquivo | sim | Foto frontal do rosto. Content-Type declarado deve ser image/jpeg, image/png, image/webp ou image/heic. Até 10 MB. |
side | arquivo | opcional | Foto de perfil (lateral) da mesma pessoa, mesmos tipos e limite. Enviada na mesma chamada — não custa crédito adicional. |
x-request-id | header | opcional | Seu 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.
| Campo | Tipo | Descrição |
|---|---|---|
session_id | string | Identificador do evento de uso (a sessão cobrada). Guarde para suporte e conciliação. |
capture_id | string | Identificador da captura na MaIA Scan API. |
credits_remaining | integer | Saldo da conta após esta chamada. |
result | object | Perfil 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. |
HTTP/1.1 200 OK
Content-Type: application/json
{
"session_id": "cmg1x3k9h0001abcd",
"capture_id": "cap_01J8…",
"credits_remaining": 499,
"result": { … }
}Erros
| Status | Código | Significado | Crédito cobrado? |
|---|---|---|---|
400 | front_required | O campo front não foi enviado. | não |
400 | unsupported_media_type | Content-Type de um dos arquivos fora de JPEG/PNG/WEBP/HEIC. | não |
401 | invalid_api_key | Chave ausente, inválida ou revogada. | não |
402 | insufficient_credits | Saldo zero; o corpo traz balance. | não |
413 | — | Arquivo acima de 10 MB (recusado na recepção; corpo genérico). | não |
429 | — | Mais de 120 requisições por minuto do mesmo IP. | não |
502 | analysis_failed | O modelo não completou a análise. O crédito reservado foi devolvido; o corpo traz session_id. | não |
503 | upstream_not_configured | O 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).
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
photo | arquivo | sim | Foto 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. |
shade | texto | sim | Um dos tons de demonstração: rose, red, berry, coral, plum ou nude (ver GET /api/v1/try-on/shades). |
finish | texto | sim | matte, satin ou gloss. |
x-request-id | header | opcional | Seu 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:
| Header | Descrição |
|---|---|
X-Session-Id | Identificador do evento de uso (a sessão cobrada). |
X-Credits-Remaining | Saldo da conta após esta chamada. |
X-TryOn-Finish-Requested | O acabamento que você pediu. |
X-TryOn-Finish-Applied | O 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-Control | no-store. A imagem não fica em nenhum cache do nosso lado. |
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
| Status | Código | Significado | Crédito cobrado? |
|---|---|---|---|
400 | photo_required | O campo photo não foi enviado. | não |
400 | — | Campo de texto desconhecido ou fora do formato (validação do corpo). | não |
401 | invalid_api_key | Chave ausente, inválida ou revogada. | não |
402 | insufficient_credits | Saldo zero; o corpo traz balance. | não |
413 | photo_too_large | Foto acima de 6 MB. Uploads muito acima do limite são cortados na recepção com um 413 genérico. | não |
422 | invalid_selection | shade ou finish fora da lista. | não |
422 | unsupported_photo | Os bytes não são JPEG nem PNG (ou o arquivo está vazio). | não |
422 | bad_photo | O modelo recusou a foto (rosto não frontal, boca não visível, lado menor abaixo de 320 px). Crédito devolvido. | não |
429 | — | Mais de 120 requisições por minuto do mesmo IP. | não |
503 | upstream_unavailable | O serviço de render falhou ou está ocupado. Crédito devolvido; tente de novo em instantes. | não |
503 | upstream_not_configured | O 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-AppliedGET/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).
| Campo | Tipo | Descrição |
|---|---|---|
shades[].id | string | Valor aceito no campo shade do try-on. |
shades[].hex | string | Cor de referência do tom (#RRGGBB) para exibir na sua interface. |
shades[].trained_finish | string | Acabamento com que o tom foi treinado — o fallback de X-TryOn-Finish-Applied. |
finishes | string[] | Valores aceitos no campo finish. |
max_upload_bytes | integer | Limite de upload da foto em bytes (6 MB). |
{
"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.
| Status | Significado |
|---|---|
400 | Requisição malformada: campo obrigatório ausente, tipo de arquivo não declarado corretamente ou campo de texto desconhecido. |
401 | invalid_api_key — chave ausente, inválida ou revogada. |
402 | insufficient_credits — saldo zero; compre um pacote ou espere a recarga automática. |
413 | Arquivo acima do limite (10 MB no scan, 6 MB no try-on). |
422 | Entrada válida em forma, inválida em conteúdo: invalid_selection, unsupported_photo, bad_photo (try-on). |
429 | Limite de requisições por minuto excedido. Aguarde e repita com backoff. |
502 | analysis_failed — a análise não completou; crédito devolvido (scan). |
503 | upstream_unavailable (crédito devolvido) ou upstream_not_configured (nada cobrado). |
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.
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.