/apidoc

Base da API operacional: https://mail.gratis.com.br

Voltar

Manual API

Manual API (mail-api)

Manual completo dos endpoints REST atualmente implementados.

Servico

Binario:

bash /root/app/bin/mail-api

Variaveis de ambiente:

Autenticacao

Quando MAIL_API_TOKEN estiver definido:

API keys escopadas (implementado):

Observacao:

Convencoes

Endpoints

GET /health

Sem auth. Retorna status e versao do MongoDB.

POST /api/v1/auth/login

Sem payload.

Resposta tipica:

json { "status": "ok", "token": "..." }

Se MAIL_API_TOKEN nao estiver definido, retorna token vazio com note.

GET /api/v1/tenants

Lista tenants.

POST /api/v1/tenants

Payload:

json { "name": "Empresa X" }

GET /api/v1/tenants/:tenant_id

Consulta tenant por ID.

DELETE /api/v1/tenants/:tenant_id

Remove tenant por ID.

GET /api/v1/domains?tenant_id=<tenant_id>

Lista dominios (filtro tenant_id opcional).

POST /api/v1/domains

Payload:

json { "tenant_id": "t_...", "domain": "exemplo.com" }

GET /api/v1/domains/:domain_id

Consulta dominio.

DELETE /api/v1/domains/:domain_id

Remove dominio.

GET /api/v1/users?tenant_id=<tenant_id>

Lista usuarios (filtro tenant_id opcional).

POST /api/v1/users

Payload:

json { "tenant_id": "t_...", "domain_id": "d_...", "email": "user@exemplo.com", "name": "Usuario", "password": "Senha#123" }

Observacao:

GET /api/v1/users/:user_id

Consulta usuario.

DELETE /api/v1/users/:user_id

Remove usuario.

POST /api/v1/users/:user_id/password

Payload:

json { "password": "NovaSenha#123" }

Regra: minimo 8 caracteres.

POST /api/v1/smtp/submit

Nao exige Bearer.

Payload:

json { "email": "user@exemplo.com", "password": "Senha#123", "from": "user@exemplo.com", "to": "destino@outrodominio.com", "subject": "Assunto", "text": "Corpo" }

Regras:

Resposta:

json { "status": "queued", "queue_id": "q_..." }

GET /api/v1/queues/outbound?status=queued

Lista fila outbound (filtro status opcional).

POST /api/v1/mailboxes/:mailbox_id/spamtrap/enable

Payload:

json { "mode": "hard", "notes": "texto" }

mode aceito: hard|soft|silent (default hard).

POST /api/v1/mailboxes/:mailbox_id/spamtrap/disable

Sem payload.

GET /api/v1/mailboxes/:mailbox_id/spamtrap

Consulta estado spamtrap da mailbox.

GET /api/v1/aliases?domain=<dominio>&target=<email>&all=1

Lista aliases.

Filtros opcionais:

POST /api/v1/aliases

Payload:

json { "address": "vendas@exemplo.com", "target_address": "usuario@exemplo.com" }

Cria ou atualiza alias (upsert) com vínculo para mailbox alvo ativa.

GET /api/v1/aliases/:alias_id

Consulta alias por ID.

DELETE /api/v1/aliases/:alias_id

Remove alias por ID.

POST /api/v1/aliases/:alias_id/spamtrap/enable

Payload:

json { "mode": "hard" }

mode aceito: hard|soft|silent (default hard).

POST /api/v1/aliases/:alias_id/spamtrap/disable

Sem payload.

GET /api/v1/aliases/:alias_id/spamtrap

Consulta estado spamtrap do alias.

GET /api/v1/apikeys

Lista API keys (somente escopo global).

Filtros opcionais:

POST /api/v1/apikeys

Cria API key (somente escopo global).

Payload:

json { "name": "tenant-key", "scope_type": "tenant", "scope_id": "t_...", "ttl_days": 90, "rate_limit_per_minute": 300, "permissions": ["users.read", "users.write"] }

Observações:

DELETE /api/v1/apikeys/:api_key_id

Revoga API key (status revoked).

POST /api/v1/apikeys/:api_key_id/revoke

Revoga API key (alternativa semântica ao DELETE).

GET /api/v1/quotas

Lista regras de quota (somente escopo global).

Filtros opcionais:

POST /api/v1/quotas

Cria/atualiza quota (upsert, somente escopo global).

Payload:

json { "scope_type": "tenant", "scope_id": "t_...", "metric": "api_calls", "soft_limit": 100000, "hard_limit": 120000, "period": "monthly" }

Regras de enforcement em runtime:

GET /api/v1/usage

Lista contadores de uso (somente escopo global).

Filtros opcionais:

Observação:

GET /api/v1/billing/accounts

Lista contas de billing (somente escopo global).

Filtros opcionais:

POST /api/v1/billing/accounts

Cria/atualiza conta de billing por tenant (upsert, escopo global).

Payload:

json { "tenant_id": "t_...", "plan_code": "start", "currency": "BRL", "status": "active", "day_anchor": 15, "overage_mode": "invoice", "auto_upgrade": true, "auto_upgrade_max_plan_code": "scale" }

Campos adicionais:

GET /api/v1/billing/accounts/:billing_account_id

Consulta conta de billing por ID.

GET /api/v1/billing/prices

Lista tabela de preços.

POST /api/v1/billing/prices

Cria/atualiza preço (upsert).

Payload:

json { "code": "overage.smtp_sent.1000", "currency": "BRL", "unit_cents": 140, "unit": "block_1000", "active": true }

GET /api/v1/billing/invoices

Lista invoices.

Filtros opcionais:

GET /api/v1/billing/invoices/:invoice_id

Consulta invoice com itens.

POST /api/v1/billing/close

Fecha invoices do mês para contas ativas (ou para uma conta específica).

Payload:

json { "month": "2026-03", "billing_account_id": "ba_..." }

Observação:

GET /api/v1/whitelists

Filtros opcionais:

POST /api/v1/whitelists

Payload:

json { "scope": "mailbox", "scope_ref": "m_...", "mailbox_id": "m_...", "type": "sender", "value": "noreply@exemplo.com", "spamtrap_bypass_allowed": false }

Regras:

DELETE /api/v1/whitelists/:whitelist_id

Remove whitelist por ID.

GET /api/v1/blacklists?type=<tipo>&active=1

Lista blacklists.

Filtros opcionais:

POST /api/v1/blacklists

Payload:

json { "type": "cidr", "value": "203.0.113.0/24", "action": "tempfail", "reason": "burst abuse source network", "ttl_seconds": 86400 }

Campos:

DELETE /api/v1/blacklists/:blacklist_id

Remove blacklist por ID.

GET /api/v1/policy/watchlist

Lista watchlist.

GET /api/v1/policy/watchlist/:fingerprint

Consulta fingerprint.

DELETE /api/v1/policy/watchlist/:fingerprint

Remove fingerprint.

GET /api/v1/policy/reputation/ip/:ip

Consulta reputacao por IP.

GET /api/v1/policy/reputation/domain/:domain

Consulta reputacao por dominio.

GET /api/v1/policy/reputation/sender/:sender

Consulta reputacao por sender.

GET /api/v1/policy/reputation/fingerprint/:fingerprint

Consulta reputacao por fingerprint.

Observacao:

GET /api/v1/policy/graylist

Lista eventos de graylist.

POST /api/v1/policy/graylist/:event_id/release

Libera e reprocessa mensagens held associadas ao event_id.

DELETE /api/v1/policy/graylist/:fingerprint

Remove eventos de graylist por fingerprint.

GET /api/v1/policy/spamtrap/hits?domain=<dominio>

Lista hits de spamtrap (filtro domain opcional).

GET /api/v1/policy/spamtrap/hits/:hit_id

Consulta hit especifico por ID.

Precedencia de policy (inbound RCPT)

Codigos HTTP comuns

Manual CLI

Manual CLI (mailctl)

Manual completo dos comandos atualmente implementados no mailctl.

Binario

bash /root/app/bin/mailctl

Configuracao

Variaveis de ambiente:

Formato de saida

Comandos

health

bash mailctl [--json] health

Retorna status e versao do MongoDB.

tenant

Criar tenant:

bash mailctl [--json] tenant create --name <nome>

Listar tenants:

bash mailctl [--json] tenant list

Detalhar tenant:

bash mailctl [--json] tenant info <tenant_id>

domain

Criar dominio:

bash mailctl [--json] domain create <domain> --tenant <tenant_id> [--no-cert-prompt] [--no-dkim-auto]

Listar dominios:

bash mailctl [--json] domain list [--tenant <tenant_id>]

Remover dominio:

bash mailctl [--json] domain delete <domain|domain_id> [--force]

Regras:

Gerar DKIM:

bash mailctl [--json] domain dkim gen <domain|domain_id> [--selector mail] [--force]

Regra de seguranca:

Consultar DKIM sem regenerar chave:

bash mailctl [--json] domain dkim show <domain|domain_id>

Consultar sugestao completa de DNS sem regenerar chave:

bash mailctl [--json] domain dns show <domain|domain_id>

Observacao:

Observacao sobre prompt de certificado no domain create:

Observacao sobre DKIM automatico no domain create:

cert

Gerar certificado para dominio (por dominio ou domain_id):

bash mailctl [--json] cert generate <domain|domain_id> [--provider <nome>] [--email <email>]

Consultar metadados TLS do dominio:

bash mailctl [--json] cert show <domain|domain_id>

user

Criar usuario (com senha opcional):

bash mailctl [--json] user create <email> --name <nome> --tenant <tenant_id> --domain <domain|domain_id> [--password <senha>]

Regra:

Definir/atualizar senha:

bash mailctl [--json] user passwd <email> --password <senha>

Listar usuarios:

bash mailctl [--json] user list [--tenant <tenant_id>]

smtp

Submeter email outbound:

bash mailctl [--json] smtp submit --from <email> --to <email> --subject <txt> --text <txt>

Listar fila outbound:

bash mailctl [--json] smtp queue list [--status queued|retry|processing|delivered|failed]

Forcar retry de item da fila:

bash mailctl [--json] smtp queue retry <queue_id>

mailbox spamtrap

Habilitar spamtrap de mailbox:

bash mailctl [--json] mailbox spamtrap enable <email> [--mode hard|soft|silent] [--notes <texto>]

Desabilitar spamtrap de mailbox:

bash mailctl [--json] mailbox spamtrap disable <email>

Consultar spamtrap de mailbox:

bash mailctl [--json] mailbox spamtrap info <email>

Listar mailboxes spamtrap:

bash mailctl [--json] mailbox spamtrap list [--domain <dominio>]

alias

Criar alias:

bash mailctl [--json] alias create <alias_email> <target_email>

Listar aliases:

bash mailctl [--json] alias list [--domain <dominio>] [--target <email>] [--all]

alias spamtrap

Habilitar spamtrap de alias:

bash mailctl [--json] alias spamtrap enable <email> [--mode hard|soft|silent]

Desabilitar spamtrap de alias:

bash mailctl [--json] alias spamtrap disable <email>

Listar aliases spamtrap:

bash mailctl [--json] alias spamtrap list [--domain <dominio>]

whitelist

Escopos:

Adicionar whitelist:

bash mailctl [--json] whitelist add [--scope mailbox|domain|global] [--mailbox <email>|--domain-id <domain_id>] (--sender <sender>|--domain <dominio>) [--spamtrap-bypass]

Remover whitelist:

bash mailctl [--json] whitelist remove [--scope mailbox|domain|global] [--mailbox <email>|--domain-id <domain_id>] (--sender <sender>|--domain <dominio>)

Listar whitelist:

bash mailctl [--json] whitelist list [--scope mailbox|domain|global] [--mailbox <email>|--domain-id <domain_id>]

Regras de escopo:

blacklist

Tipos suportados:

Adicionar blacklist:

bash mailctl [--json] blacklist add --type ip|cidr|sender|domain|fingerprint|helo --value <valor> [--action reject|tempfail] [--ttl <duracao>] [--reason <texto>]

Remover blacklist:

bash mailctl [--json] blacklist remove (--id <blacklist_id> | --type ip|cidr|sender|domain|fingerprint|helo --value <valor>)

Listar blacklist:

bash mailctl [--json] blacklist list [--type ip|cidr|sender|domain|fingerprint|helo] [--all]

Observacoes:

apikey

Criar API key:

bash mailctl [--json] apikey create [--name <nome>] [--scope-type global|tenant|domain|account] [--scope-id <id>] [--ttl-days <dias>] [--rpm <n>] [--perm <perm>]

Observacoes:

Listar API keys:

bash mailctl [--json] apikey list [--scope-type global|tenant|domain|account] [--scope-id <id>] [--status active|revoked]

Revogar API key:

bash mailctl [--json] apikey revoke <api_key_id>

quota

Criar/atualizar quota:

bash mailctl [--json] quota set --scope-type tenant|domain|mailbox --scope-id <id> --metric api_calls|smtp_sent|storage_bytes --soft <n> --hard <n> [--period monthly]

Listar quotas:

bash mailctl [--json] quota list [--scope-type tenant|domain|mailbox] [--scope-id <id>] [--metric api_calls|smtp_sent|storage_bytes]

usage

Consultar uso consolidado:

bash mailctl [--json] usage show [--month YYYY-MM] [--scope-type tenant|domain|mailbox] [--scope-id <id>] [--metric api_calls|smtp_sent|storage_bytes]

billing

Conta de billing (upsert):

bash mailctl [--json] billing account set --tenant <tenant_id> --plan start|growth|scale [--status active] [--currency BRL] [--day-anchor 1..28] [--overage-mode invoice|block] [--auto-upgrade true|false] [--auto-upgrade-max-plan start|growth|scale]

Observacoes:

Listar contas de billing:

bash mailctl [--json] billing account list [--tenant <tenant_id>] [--status active|past_due|suspended|canceled]

Preco (upsert):

bash mailctl [--json] billing price set --code <code> --unit-cents <n> [--unit <u>] [--currency BRL] [--active true|false]

Listar precos:

bash mailctl [--json] billing price list [--code <code>]

Listar invoices:

bash mailctl [--json] billing invoice list [--month YYYY-MM] [--billing-account <id>] [--status draft|open|paid|void|uncollectible]

Detalhar invoice:

bash mailctl [--json] billing invoice show <invoice_id>

Fechamento mensal:

bash mailctl [--json] billing close [--month YYYY-MM] [--billing-account <id>]

policy watchlist

bash mailctl [--json] policy watchlist list mailctl [--json] policy watchlist info <fingerprint> mailctl [--json] policy watchlist remove <fingerprint>

policy reputation

bash mailctl [--json] policy reputation show --fingerprint <fp> mailctl [--json] policy reputation show --ip <ip> mailctl [--json] policy reputation show --sender <sender> mailctl [--json] policy reputation show --domain <domain>

policy graylist

bash mailctl [--json] policy graylist list mailctl [--json] policy graylist release <event_id> mailctl [--json] policy graylist remove <fingerprint>

policy burst

bash mailctl [--json] policy burst show --fingerprint <fingerprint> mailctl [--json] policy burst list [--active]

spamtrap hits

bash mailctl [--json] spamtrap hits list [--domain <dominio>] mailctl [--json] spamtrap hits show <hit_id>

Exemplo rapido

bash mailctl --json tenant list mailctl --json domain list --tenant t_123 mailctl --json policy graylist release gl_123

Billing

Billing (BRL) e Desenho Tecnico de Cobranca

Documento de referencia para modelo comercial, quotas, rate limiting e metering.

Objetivo

Definir um modelo vendavel para mercado (SaaS/B2B + developers) com:

Modelo Comercial

Escopos de produto:

Direcao de venda:

Pacote comercial vendavel (forma de contrato)

Para cada tenant, vender como pacote base com limites contratados:

Modelo de excedente:

Tabela Inicial (BRL)

| Plano | Preco/mês | Caixas incluidas | Dominios incluidos | Envio incluido/mês | API incluida/mês | Storage incluido | Excedente envio | Excedente API | Excedente storage | |---|---:|---:|---:|---:|---:|---:|---:|---:|---:| | Start | R$ 149 | 20 | 3 | 50.000 | 200.000 req | 100 GB | R$ 1,80 / 1.000 | R$ 1,20 / 100.000 | R$ 0,35 / GB | | Growth | R$ 499 | 100 | 15 | 300.000 | 2.000.000 req | 500 GB | R$ 1,40 / 1.000 | R$ 0,90 / 100.000 | R$ 0,30 / GB | | Scale | R$ 1.490 | 500 | 80 | 1.500.000 | 12.000.000 req | 2 TB | R$ 1,10 / 1.000 | R$ 0,70 / 100.000 | R$ 0,25 / GB | | Enterprise | sob consulta | custom | custom | custom | custom | custom | custom | custom | custom |

Add-ons sugeridos:

Quotas (Tecnico)

Hierarquia obrigatoria:

Regras:

Delegacao operacional de quotas:

Regras de consistencia:

Metricas base para quota:

Rate Limiting

Escopos de rate limit:

Modelo recomendado:

Metering e Cobranca

Colecoes sugeridas

Campos minimos

collection_billing_accounts:

collection_usage_counters (granularidade diaria):

collection_quota_limits:

collection_invoices:

collection_invoice_items:

Pipeline operacional

  1. Servicos emitem eventos de uso (smtp_sent, api_calls, storage_bytes).
  2. Worker de metering agrega em collection_usage_counters com idempotencia.
  3. Job diario recalcula media de storage e verifica soft/hard limit.
  4. Job de fechamento mensal gera fatura (collection_invoices + items).
  5. Aplicacao de politicas por status de cobranca:
  6. past_due: alertas e reducao de limite opcional;
  7. suspended: bloqueio de escrita/envio/API conforme regra.

Formula de total:

total = mensalidade_base + excedentes + add-ons - descontos + impostos

API Keys e Billing

Diretriz de autenticacao comercial:

Politica de escopo (v1):

Campos de auditoria por request:

Politicas recomendadas de bloqueio

Ao exceder hard limit:

Ao exceder soft limit:

Roadmap tecnico (ordem sugerida)

  1. API keys escopadas com permissoes finas e auditoria.
  2. Rate limiting por escopo com armazenamento de contadores.
  3. Quotas multinivel (tenant > domain > mailbox) com enforcement.
  4. Metering consolidado e fechamento de fatura.
  5. Integracao de pagamento e ciclo comercial completo.