EmailCheckerEmailChecker

API REFERENCE

EmailChecker API

REST simples com Bearer auth. Resposta 100% compatível com mails.so — drop-in replacement: troque a base URL e a API key, mantenha o resto do código igual.

Começo rápido

Validação em 1 linha

Você precisa de uma API key (crie em /dashboard → API keys) e o endpoint base https://app.emailchecker.email/api/v1.

curl -G "https://app.emailchecker.email/api/v1/validate" \
  -H "Authorization: Bearer ec_live_..." \
  --data-urlencode "email=joao@empresa.com.br"

Autenticação

Bearer API key

Inclua o header Authorization em toda requisição. O segredo aparece uma única vez ao criar a key — armazene em variável de ambiente, nunca no código.

Authorization: Bearer ec_live_<seu_segredo>

Resposta 401 = key ausente, inválida ou revogada.

GET /v1/validate

Validar 1 email

Validação síncrona de um único email. Cobra 1 crédito por chamada — exceto quando result === "unknown" (refund automático).

Query parameters

ParamTipoObrigatórioDescrição
emailstringSimEmail pra validar (RFC 5322).

Response 200

{
  "data": {
    "id": "ec_a1b2c3d4...",
    "email": "joao@empresa.com.br",
    "username": "joao",
    "domain": "empresa.com.br",
    "mx_record": "mx1.empresa.com.br",
    "score": 95,
    "isv_format": true,
    "isv_domain": true,
    "isv_mx": true,
    "isv_noblock": true,
    "isv_nocatchall": true,
    "isv_nogeneric": true,
    "is_free": false,
    "result": "deliverable",
    "reason": "accepted_email"
  },
  "error": null
}

Result codes

CódigoSignificadoCobra crédito?
deliverableCaixa existe + servidor aceita.Sim
riskyCatch-all, role-based (admin@, info@), domínio descartável temporário — pode bouncear.Sim
undeliverableCaixa não existe ou domínio sem MX.Sim
unknownGreylist, timeout, provider bloqueou probe.Não (refund auto)

POST /v1/batch

Submeter lote de emails

Envia até 100.000 emails de uma vez. Retorna um id usado pra pollar status. Validação é assíncrona — leva de segundos a minutos dependendo do volume.

curl -X POST https://app.emailchecker.email/api/v1/batch \
  -H "Authorization: Bearer ec_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "emails": ["a@b.com", "c@d.com", "e@f.com"],
    "name": "lista-junho-2026"
  }'

Response 201

{
  "id": "9c2e8...",
  "name": "lista-junho-2026",
  "created_at": "2026-06-15T10:30:00.000Z",
  "user_id": "5b4c...",
  "size": 3
}

GET /v1/batch/:id

Buscar status do lote

Polling com backoff exponencial recomendado (3s → 6s → 12s → 30s max). Quando finished_at != null, o lote está pronto e o array emails vem populado.

curl https://app.emailchecker.email/api/v1/batch/9c2e8... \
  -H "Authorization: Bearer ec_live_..."

Response 200 (completed)

{
  "id": "9c2e8...",
  "status": "completed",
  "created_at": "2026-06-15T10:30:00.000Z",
  "finished_at": "2026-06-15T10:31:23.000Z",
  "size": 3,
  "emails": [
    {
      "email": "a@b.com",
      "result": "deliverable",
      "reason": "accepted_email",
      "score": 95,
      "isv_format": true,
      "isv_domain": true,
      "isv_mx": true,
      "isv_noblock": true,
      "isv_nocatchall": true,
      "isv_nogeneric": true,
      "is_free": false
    }
  ]
}

Status values

pendingNa fila, ainda não começou.
processingSendo validado. processed_emails incrementa em tempo real.
completedPronto. emails array vem populado.
failedErro. Veja error_message.

Rate limits

Cotas por API key

JanelaLimite defaultReset
Por minuto300 requestsSliding window
Por hora10.000 requestsSliding window

Headers de resposta: x-rate-limit-remaining-minute, x-rate-limit-remaining-hour. Quando estourar: 429 Too Many Requests + retry-after em segundos.

Limites maiores disponíveis pra contas enterprise — fala com a gente.

Códigos de erro

HTTP status reference

StatusQuando ocorre
400Body / params inválidos.
401API key ausente, inválida ou revogada.
402Saldo insuficiente. Compre créditos em /dashboard/comprar.
404Batch ID não encontrado (ou pertence a outra conta).
429Rate limit excedido. Veja header retry-after.
502Erro upstream (provider de validação). Crédito não cobrado.
500Erro interno. Reporte pro suporte.

Migrando do mails.so

Drop-in replacement

Se você já usa mails.so, a migração é trivial. Os endpoints, params e response shapes são idênticos. Só troca:

  1. Base URL https://api.mails.so/v1 https://app.emailchecker.email/api/v1
  2. Header de auth: x-mails-api-key Authorization: Bearer ec_live_...
  3. Pronto. Mesmos métodos, mesmas respostas.

Nosso router internamente delega gmail pro mails.so e o resto pro nosso engine SMTP próprio — accuracy igual ou melhor, custo menor.