Email Spam Tester

API de teste de spam: e-mail,
caixa de entrada e domínio

Envie uma mensagem real para nós ou informe apenas um domínio. Tudo é respondido em JSON.

Sem chave, sem conta.

Solicitação

# reserve a single-use address

$ curl -sX POST '.../api/v1/inbox?lang=en'

# send your message to that address, then

$ curl -s '.../api/v1/tests/k7m2x9qplw4tz8vn3b6c/status'

# read the report

$ curl -s '.../api/v1/tests/k7m2x9qplw4tz8vn3b6c'

Resposta

200 OK

{
  "address": "test-k7m2x9qplw4tz8vn3b6c@t.email-spam-tester.com",
  "slug": "k7m2x9qplw4tz8vn3b6c",
  "expires_at": "2026-10-31T13:00:00Z"
}

200 OK

{
  "analysis_status": "checks_ready",
  "ai_status": "running",
  "checks_done": 42,
  "checks_total": 42
}

200 OK

{
  "score_ours": 86.4,
  "score_compat": 9.2,
  "subscores": {"auth": 100.0, "infra_spam": 78.1, "content": 92.0},
  "complete": true,
  "checks": [{"id": "auth.dmarc", "status": "warn"}],
  "fixes": [{"id": "dmarc-enforce", "gain_ours": 4.0}]
}

Solicitação

# create a test

$ curl -sX POST '.../api/v1/placement' \ -d '{"public_results_accepted":true}'

# put the marker in the subject, send once to all, then

$ curl -s '.../api/v1/placement/wR3kP9xLq2vT8mZc'

Resposta

201 Created

{
  "marker": "est-3f9a1c7e2b4d6a80c5e1f2d3",
  "status": "waiting",
  "results": [{"provider": "gmail", "placement": "pending"}],
  "fleet": {"status": "observing", "results": [
    {"provider": "yahoo", "placement": "pending"},
    {"provider": "outlook", "placement": "pending"}
  ]}
}

200 OK

{
  "status": "complete",
  "results": [{"provider": "gmail", "placement": "primary"}],
  "fleet": {"status": "finished", "results": [
    {"provider": "yahoo", "placement": "inbox"},
    {"provider": "outlook", "placement": "spam"}
  ]}
}

Solicitação

# no email needed, one GET

$ curl -s '.../api/v1/infra/check?domain=example.com'

# compare with your last run

$ curl -s '.../api/v1/infra/check?domain=example.com&diff=true' \ | jq '.diff'

Resposta

200 OK

{
  "domain": "example.com",
  "ok": false,
  "status": "fail",
  "score": 78,
  "coverage": {"answered": 7, "total": 8},
  "sections": {"ptr": {"status": "fail", "core": true}}
}

200 OK

{
  "changed": true,
  "worsened": true,
  "status_from": "pass",
  "score_from": 100,
  "changes": [{"path": "dkim.key.mail.sha256", "kind": "removed",
               "severity": "critical", "effect": "worsened"}]
}
Nesta página

Teste de e-mail

Lemos uma mensagem real de ponta a ponta: conteúdo, assinatura, cabeçalhos e o servidor que a enviou. Você recebe uma pontuação, uma lista de correções e todas as verificações por trás delas.

Início rápido

Três chamadas. Sem chave, sem conta, sem cadastro. Duas requisições e um e-mail. A terceira chamada só existe porque a análise leva alguns segundos.

  1. Reserve um endereço

    Faça um POST para o endpoint da caixa de entrada. Você recebe um endereço que aceita exatamente uma mensagem e expira em uma hora, além do slug usado como chave para todo o restante.

    Solicitação

    # 1. reserve a single-use address
    curl -sX POST 'https://email-spam-tester.com/api/v1/inbox?lang=en'

    Resposta

    {
      "address": "test-<slug>@t.email-spam-tester.com",
      "slug": "<slug>",
      "expires_at": "2026-01-01T12:00:00Z"
    }
  2. Envie a mensagem real para ele

    Via SMTP, a partir da plataforma que enviará a campanha. Metade das verificações lê cabeçalhos adicionados pela sua plataforma de envio, portanto uma mensagem criada manualmente avalia a coisa errada.

    Solicitação

    # 2. send your message to that address, from your own platform
    To: test-<slug>@t.email-spam-tester.com
  3. Consulte o status e depois leia o relatório

    O endpoint de status tem algumas centenas de bytes e informa se já vale a pena buscar o relatório completo. O relatório em si chega a vários milhares de linhas.

    Solicitação

    # 3. poll
    curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>/status'

    Resposta

    {
      "slug": "<slug>",
      "analysis_status": "checks_ready",
      "ai_status": "running",
      "checks_done": 42,
      "checks_total": 42
    }

    Solicitação

    # 4. read the report once analysis_status is checks_ready
    curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>'

    Resposta

    {
      "report_url": "https://email-spam-tester.com/t/<slug>",
      "score_ours": 86.4,
      "score_compat": 9.2,
      "subscores": {"auth": 100.0, "infra_spam": 78.1, "content": 92.0, "compliance": 75.0},
      "complete": true,
      "checks": [
        {
          "id": "auth.dmarc",
          "status": "warn",
          "title": "DMARC result",
          "summary": "DMARC passes, but the policy is p=none.",
          "weight_ours": -4.0,
          "evidence": {"policy": "none", "aligned": "dkim"},
          "citations": {"standards": [{"title": "RFC 9989 §4.7", "quote": "..."}]}
        }
      ],
      "fixes": [
        {"id": "dmarc-enforce", "gain_ours": 4.0, "gain_compat": 0.0,
         "fix": {"title": "Move DMARC to quarantine", "severity": "medium"}}
      ]
    }

Reserve um endereço, envie a mensagem que você estava prestes a enviar para sua lista e leia o relatório. Tudo o que a página mostra está no JSON, incluindo a pontuação, todas as 42 verificações com suas evidências e a seção da norma em que cada constatação se baseia.

Os primeiros 100.000 relatórios são gratuitos, sem chave e sem conta. Se você estiver configurando um agente em vez de um script, o servidor MCP é mais adequado do que fazer consultas periódicas.

Endpoints

Endereço base https://email-spam-tester.com. Tudo responde com JSON.

POST/api/v1/inbox

Reserva um endereço de uso único. Ambos os parâmetros são opcionais.

langIdioma em que o plano de correção e as constatações de cada verificação serão escritos, como um código ISO. Definido agora porque a mensagem chega por SMTP minutos depois e não traz nenhuma indicação de quem está esperando por ela. Um código desconhecido usa inglês como padrão.
utm_source, utm_medium, utm_campaignRepassados para nossas análises. Útil se você estiver medindo sua própria integração.

GET/api/v1/tests/{slug}/status

Leve para consultar repetidamente. Retorna os dois campos de status e até onde as verificações chegaram, e nada mais.

Consulte isto em vez do relatório. analysis_status chega primeiro a checks_ready, e o plano de IA aparece em ai_status cerca de um minuto depois, para que um cliente que queira apenas as verificações determinísticas não precise esperar pelo plano.

GET/api/v1/tests/{slug}

O relatório completo. Responde com 202 enquanto o endereço está reservado e nada chegou ainda, e com 200 depois que algo chegar.

GET/api/v1/tests/{slug}/message

A mensagem exatamente como foi entregue: todos os cabeçalhos na ordem de transmissão, ambos os corpos, a lista de anexos e a fonte bruta. Obtida separadamente porque o relatório é consultado repetidamente e isto pode chegar a um megabyte.

A mensagem bruta é excluída de acordo com seu próprio prazo, antes do relatório. Depois disso, este endpoint responde com o motivo em vez do conteúdo original.

PUT/api/v1/tests/{slug}/locale

Altera o idioma de uma reserva que ainda não foi usada. Para um agente que descobre qual idioma seu usuário lê depois de já ter solicitado o endereço. Recusado depois que a mensagem chega, porque nesse momento a análise já está em execução.

Posicionamento na caixa de entradaBeta

Envie uma mensagem para uma lista de caixas de entrada de teste e veja onde ela chegou no Gmail, Outlook, Yahoo e outros provedores: Caixa de entrada, Promoções ou Spam.

Início rápido

  1. Crie um teste

    Faça um POST para o endpoint de posicionamento. Você recebe de volta um marcador e as caixas de entrada de teste.

    Solicitação

    # 1. create a test
    curl -sX POST 'https://email-spam-tester.com/api/v1/placement' \
      -H 'Content-Type: application/json' \
      -d '{"public_results_accepted":true}'

    Resposta

    {
      "slug": "<slug>",
      "marker": "est-3f9a1c7e2b4d6a80c5e1f2d3",
      "status": "waiting",
      "deadline": "2026-10-31T12:30:00Z",
      "poll_after_seconds": 60,
      "results": [
        {"address": "<seed>", "provider": "gmail", "kind": "Gmail",
         "placement": "pending", "observed_at": null}
      ],
      "fleet": {
        "status": "observing",
        "results": [
          {"address": "<mailbox>", "provider": "yahoo", "available": true,
           "placement": "pending", "coverage": "pending"}
        ]
      }
    }
  2. Envie uma mensagem para cada caixa de entrada

    Coloque o marcador no assunto e envie pela sua plataforma habitual para todos os endereços de uma só vez.

    Solicitação

    # 2. one message to every address, with the marker in the subject
    Subject: October invoice est-3f9a1c7e2b4d6a80c5e1f2d3
    To: <seed>, <mailbox>, ...
  3. Consulte as pastas

    Cada endereço é preenchido com seu provedor e sua pasta. Consulte até que o status deixe de ser waiting.

    Solicitação

    # 3. poll for the folders
    curl -s 'https://email-spam-tester.com/api/v1/placement/<slug>'

    Resposta

    {
      "status": "complete",
      "received": 2,
      "total": 2,
      "results": [
        {"address": "<seed>", "provider": "gmail", "kind": "Gmail",
         "placement": "primary", "observed_at": "2026-10-31T12:04:11Z"},
        {"address": "<seed>", "provider": "gmail", "kind": "Google Workspace",
         "placement": "promotions", "observed_at": "2026-10-31T12:04:11Z"}
      ],
      "fleet": {
        "status": "finished",
        "results": [
          {"address": "<mailbox>", "provider": "yahoo", "available": true,
           "placement": "inbox", "coverage": "ok"},
          {"address": "<mailbox>", "provider": "outlook", "available": true,
           "placement": "spam", "coverage": "ok"}
        ]
      }
    }

Endpoints

An optional test using public GMass seed inboxes and available project test mailboxes, alone or alongside the email score. Explain to the sender that GMass receives their email and publishes its subject, sender name and placement before creating a test. Use all test mailboxes for non-confidential test messages only.

GET /api/v1/placement/availability

Returns providers: the provider identifiers of currently healthy, admitted project mailboxes. No addresses or credentials are exposed. This read does not create a test or contact GMass. Actual recipients are allocated at creation and may differ as availability or capacity changes.

POST /api/v1/placement

Send JSON {"public_results_accepted":true}. Returns HTTP 201 with slug, marker, results (the seed addresses), deadline and expires_at. Limit: 20 tests per IP per UTC day.

For one-send combined testing, first reserve an email score address and include its score_slug in the placement creation JSON. Repeated creation for that score returns the same placement test. Send the marked email to the score address, every returned seed and every available fleet.results address; keep the main /t/<score_slug> report link. Creating a link after the score address was used or expired returns HTTP 409.

GET /api/v1/placement/by-score/{score_slug}

Read and refresh the placement run attached to the main email test. The response has the same format and polling limits as the standalone endpoint below. HTTP 404 means placement was not included or its stored results have been removed.

GET /api/v1/placement/{slug}

Use poll_after_seconds (normally 60 seconds) while the page is open. Upstream errors trigger a shared cooldown. Add the marker to the subject and send through the sender's normal platform to every seed. Observations are saved for 30 days. Collection ends after 30 minutes or when all seeds have results.

status: waiting, complete or timed_out. Each result has an address, provider, kind, placement and observed_at. Placement is primary, promotions, inbox, updates, social, forums, spam, unknown, pending or not_observed. Missing results do not mean Spam; Promotions is an inbox category. provider_error indicates an upstream outage without discarding saved observations. HTTP 404 means unknown, 410 expired, 429 quota exhausted, and 503 no test inboxes available at creation.

The optional fleet object contains independently collected project mailbox results, with status observing, settling or finished. Refresh every 30 seconds until it finishes, even when Gmail has completed. Each fleet result includes address, provider, available, placement, category and coverage. Exclude unavailable addresses from new sends; retain their saved observations. Category data may be unavailable even when the physical folder is known.

If GMass is unavailable at creation but project mailboxes can be allocated, provider is fleet and the top-level seed results are empty. Use fleet.results; do not interpret an empty Gmail list as successful delivery. Existing runs never gain new recipient addresses silently.

Verificação de infraestrutura

Uma solicitação GET verifica a configuração de e-mail de um domínio sem enviar nada, armazena o resultado e informa o que mudou desde sua última execução. Nenhuma chave é necessária. No cron, a linha abaixo termina com um código diferente de zero quando o domínio está com problemas ou sua configuração mudou de uma forma relevante.

Início rápido

  1. Faça uma solicitação GET

    Passe o domínio. ip adiciona seus endereços de envio, e selector informa os seletores DKIM a serem lidos.

    Solicitação

    curl -s 'https://email-spam-tester.com/api/v1/infra/check?domain=example.com&selector=mail&diff=true'
  2. Leia o resultado

    ok é a resposta para um script, e sections mostra qual parte falhou.

    Resposta

    {
      "id": "ir_01JB8Y4T2M6K9QZ7H3V5N1XWDA",
      "domain": "example.com",
      "checked_at": "2026-10-31T12:00:00Z",
      "ok": false,
      "status": "fail",
      "score": 78,
      "coverage": {"answered": 7, "total": 8},
      "ips": [{"ip": "203.0.113.5", "sources": ["mx", "spf"], "managed": false}],
      "sections": {
        "dkim": {"status": "pass", "core": true, "findings": [], "data": {}},
        "ptr": {"status": "fail", "core": true, "findings": [], "data": {}}
      },
      "not_checked": [
        {"check": "dkim_signature", "reason": "needs_a_message"},
        {"check": "alignment", "reason": "needs_a_message"}
      ],
      "diff": {
        "baseline": {"id": "ir_01JB2...", "checked_at": "2026-10-24T12:00:00Z"},
        "first_run": false,
        "changed": true,
        "worsened": true,
        "status_from": "pass",
        "score_from": 100,
        "changes": [
          {"path": "dkim.key.mail.sha256", "section": "dkim", "kind": "removed",
           "severity": "critical", "effect": "worsened", "from": "9f2c...", "to": null}
        ],
        "not_compared": [
          {"path": "blocklist_ip.203.0.113.5.bl.spamcop.net.listed", "reason": "lookup_failed"}
        ]
      }
    }
  3. Coloque no cron

    Com diff=true, cada execução é comparada à sua última, e jq transforma a resposta em um código de saída.

    Solicitação

    # exits non-zero if the domain is broken or its setup changed
    curl -s 'https://email-spam-tester.com/api/v1/infra/check?domain=example.com&selector=mail&diff=true' \
      | jq -e '.ok and (.diff.changed | not)'
domainObrigatório. Aceita o que as ferramentas aceitam: um domínio, uma URL, um endereço de e-mail.
ipSeu endereço de envio. Repita-o para adicionar mais, até 6.
selectorUm seletor DKIM. Repita-o para adicionar mais, até 10. Cada seletor que você informar precisa existir, ou a seção dkim falha.
heloO nome que seu servidor fornece no HELO, comparado ao PTR dele.
accountPara quem é a solicitação. Obrigatório com uma chave que atende muitas pessoas.
checksSeções a executar, separadas por vírgulas. Todas elas por padrão.
difftrue compara esta execução com sua última execução do domínio.
since7d, 12h ou uma data ISO 8601. Compara com sua execução mais próxima daquele momento dentro de 12 horas; caso contrário, com a última anterior a ele. Ativa diff.
baselineO ID de uma de suas execuções com a qual comparar. Ativa diff.
freshtrue ignora o cache de 60 segundos.

Leitura da resposta

Uma verificação concluída responde com 200, e o veredito está no corpo. status é o pior resultado entre as seções obrigatórias: spf, dkim, dmarc, ptr, blocklist_ip, blocklist_domain, mx e smtp. unknown em uma seção obrigatória conta como warn. ok é true quando status é pass ou warn. score varia de 0 a 100 nas seções obrigatórias que responderam, e é null quando erros e resultados unknown deixam menos da metade do peso aplicável. mta_sts, tls_rpt, bimi, dnssec, dane, ns e registration são informados e comparados, mas não afetam ok nem score.

Uma seção pode ser pass, warn, fail, error (não foi possível verificá-la), unknown (há informações insuficientes) ou skipped (não se aplica). skipped não afeta o resultado, e o motivo está em not_checked. dkim_signature e alignment estão sempre presentes, porque precisam de uma mensagem real.

O que ip e selector alteram

PTR e listas de bloqueio se referem a endereços, então uma execução precisa de alguns. Ela usa os valores de ip que você envia. Se nenhum for enviado, ela obtém até quatro dos seus hosts MX e de termos ip4: e ip6: com um único endereço no registro SPF raiz. Endereços de um provedor de e-mail conhecido são listados como managed e não são verificados, e, se nada restar, ptr e blocklist_ip respondem com skipped. Um selector não pode ser lido do DNS, então uma execução tenta o seu, os encontrados nas suas execuções anteriores e uma lista de nomes comuns. Não encontrar nada não prova nada, e dkim responde com unknown. Se você envia a partir do seu próprio servidor, envie ambos.

O que mudou

Cada entrada em diff.changes tem um path, um kind (added, removed, changed), uma severity (critical, warning, info) e um effect (worsened, improved, neutral). Somente critical e warning definem diff.changed, portanto uma chave DKIM rotacionada com o mesmo comprimento, um novo endereço MX ou um certificado renovado não fazem a linha do cron falhar. diff.worsened reflete o efeito de qualquer alteração. Em uma primeira execução, não há nada com que comparar, e diff.first_run indica isso.

Uma referência é sempre uma execução sua, então outra pessoa verificar o domínio entre duas das suas execuções não oculta nada. Tudo o que não foi possível ler desta vez vai para diff.not_compared, mantendo seu último valor conhecido, o que significa que uma alteração feita durante uma indisponibilidade aparece assim que a consulta volta a funcionar. Uma execução com ip ou selector diferente permanece na mesma série, e aquilo que ela não solicitou também não é comparado.

Por que uma verificação agendada deve usar uma chave

Sem uma chave, seu histórico pertence a um hash com chave do seu endereço IP, então ele termina quando o endereço muda, e as pessoas por trás de um mesmo endereço o compartilham: a execução de um colega altera sua referência. Com uma chave de API pessoal em Authorization: Bearer, o histórico acompanha a chave. Execuções com uma chave são mantidas por 365 dias e só podem ser acessadas com essa chave. Execuções sem uma chave são mantidas por 30 dias e podem ser acessadas por qualquer pessoa que tenha seu id.

6 solicitações por minuto e 50 por dia por IP, ou 30 e 500 por chave. Acima disso, a resposta é 429 com Retry-After. Uma solicitação idêntica dentro de 60 segundos vem de um cache, é marcada como cached: true, não grava uma execução e não entra na contagem. A leitura de execuções armazenadas permite 120 solicitações por minuto por cliente. 503 com Retry-After significa que há verificações demais em execução ou, ao ler execuções armazenadas, que o armazenamento está indisponível. 401 indica uma chave incorreta. 422 inclui detail.code: invalid_domain, invalid_ip, invalid_selector, invalid_check, invalid_since, unknown_baseline ou account_required.

Endpoints

GET/api/v1/infra/check

Executa a verificação. Os parâmetros estão na tabela acima.

GET/api/v1/infra/runs/{public_id}

Uma execução armazenada, completa. 404 se ela não existir ou pertencer a outra chave.

GET/api/v1/infra/domains/{domain}/runs

Suas execuções de um domínio, da mais recente para a mais antiga: id, horário, status, pontuação e número de alterações. Aceita limit (1 a 100, 30 por padrão) e before, um id de execução.

GET/api/v1/infra/diff

A mesma comparação entre duas execuções armazenadas, ?from=<id>&to=<id>. Você precisa ter acesso a ambas.

GET/api/v1/infra/checks

Cada seção com seu peso, a versão da pontuação e os limites.

Verificações individuais

Cada chamada responde a uma pergunta e não mantém histórico. Uma ferramenta executa sozinha uma parte da verificação de infraestrutura, exceto a ferramenta de cabeçalho, que lê uma mensagem que você já recebeu.

Início rápido

  1. Escolha uma verificação

    Escolha a ferramenta na lista abaixo e informe o domínio, o endereço ou o IP solicitado.

    Solicitação

    curl -s 'https://email-spam-tester.com/api/v1/tools/spf?domain=example.com'
  2. Leia o status e as constatações

    Cada ferramenta responde com um status e suas constatações. Os campos seguintes dependem da ferramenta.

    Resposta

    {
      "tool": "spf",
      "query": {"domain": "example.com"},
      "checked_at": "2026-10-31T12:00:00Z",
      "duration_ms": 412,
      "status": "fail",
      "findings": [
        {"code": "spf.too_many_lookups", "level": "fail",
         "params": {"limit": 10, "count": 12},
         "message": "RFC 7208 §4.6.4 allows at most 10 DNS lookups, and this record needs 12, so receivers return permerror."}
      ],
      "record": "v=spf1 include:_spf.example.net ~all",
      "lookups": {"count": 12, "limit": 10, "void": 0}
    }

Endpoints

Todas respondem com 200, um status e uma lista de constatações, cada uma com um código e seus parâmetros. O status é pass, warn, fail ou error, e uma ferramenta compartilhada com a verificação de infraestrutura também pode responder unknown ou skipped. Uma consulta que expirou ou uma lista que recusou a consulta nunca conta como pass. São permitidas 30 solicitações por minuto e 300 por dia por IP entre todas as ferramentas; acima disso, a resposta é 429 com Retry-After.

GET/api/v1/tools/spf

O registro SPF de um domínio: sua sintaxe, cada include e redirect seguido e as consultas DNS que a árvore inteira consome do limite de dez. Passe ?domain=example.com.

GET/api/v1/tools/dmarc

O registro DMARC de um domínio, ou de seu domínio organizacional quando ele não tem um: as tags, a política e se cada endereço externo de relatórios concordou em receber relatórios. Passe ?domain=example.com.

GET/api/v1/tools/dkim

A chave DKIM publicada para um seletor: se ela existe e é decodificada, seu tipo e tamanho e os sinalizadores de revogação e teste. Passe ?domain=example.com&selector=s1.

GET/api/v1/tools/blocklist

Um endereço IPv4, um endereço IPv6 ou um domínio verificado nas listas de bloqueio DNS usadas pelo relatório, com a resposta de cada lista. Passe ?target=203.0.113.5.

GET/api/v1/tools/mx

Os registros MX de um domínio na ordem em que os remetentes tentam usá-los, com os endereços IPv4 e IPv6 de cada host. MX nulo, um domínio sem MX, hosts que são endereços IP ou CNAMEs e hosts que não são resolvidos são informados, assim como os registros MTA-STS e TLS-RPT. Envie ?domain=example.com.

GET/api/v1/tools/bimi

A configuração de BIMI de um domínio em quatro etapas: a política de DMARC exigida pelo BIMI, o registro em default._bimi, o logotipo SVG verificado em relação ao perfil Tiny PS e o certificado de marca com seu tipo, domínios e validade. Envie ?domain=example.com e &selector= para um seletor diferente de default.

GET/api/v1/tools/ptr

Os registros PTR de um endereço e se algum desses nomes é resolvido de volta para ele. Uma consulta que falhou resulta no status error; um registro ausente resulta no status fail. Use ?ip=8.8.8.8.

GET/api/v1/tools/mta-sts

O registro MTA-STS de um domínio e o arquivo de política para o qual ele aponta: o modo, os hosts listados e qualquer host MX que a política não inclua. Use ?domain=example.com.

GET/api/v1/tools/tls-rpt

O registro TLS-RPT de um domínio e os endereços que recebem seus relatórios. Use ?domain=example.com.

GET/api/v1/tools/dnssec

Se a zona de um domínio está assinada, não assinada ou com problemas, com base em seus registros DNSKEY e DS. Uma assinatura inválida é diferenciada de uma indisponibilidade do resolvedor. Use ?domain=example.com.

GET/api/v1/tools/dane

Os registros TLSA dos hosts MX, comparados com o certificado apresentado por um host quando foi possível ler esse certificado. Use ?domain=example.com.

GET/api/v1/tools/smtp

STARTTLS e o certificado nos dois primeiros hosts MX: versão do TLS, emissor, data de expiração e se a cadeia e o nome são válidos. Conectamos apenas a hosts no domínio consultado e ignoramos provedores de e-mail, e um resultado por endereço é compartilhado por 6 horas. Nenhum e-mail é enviado. Use ?domain=example.com.

GET/api/v1/tools/ns

Os servidores de nomes de um domínio e se sua zona tem um registro SOA. Um único servidor de nomes é um aviso. Use ?domain=example.com.

GET/api/v1/tools/registration

Quando o registro de um domínio expira, segundo o RDAP. Restando menos de 30 dias, é um aviso. Uma zona sem serviço RDAP retorna skipped. Use ?domain=example.com.

POST/api/v1/tools/header

Os cabeçalhos de uma mensagem recebida, enviados como JSON {"headers": "..."} ou como text/plain: a rota salto a salto com atrasos, TLS e desvio de relógio, o Authentication-Results do próprio destinatário, o alinhamento dos domínios de From, DKIM d= e Return-Path, e os cabeçalhos de DKIM, ARC, cancelamento de inscrição e filtro de spam. Tudo após a primeira linha vazia é descartado sem ser lido. Os cabeçalhos são processados na memória e não são armazenados, mantidos em cache nem registrados em logs.

Verifique o domínio todas as noites.
Teste o e-mail antes que ele seja enviado.

Compartilhado por todos os produtos

Acesso, chaves, formato do relatório, status, erros, além de OpenAPI e llms.txt para máquinas.

Autenticação

Não há nenhuma. Nenhuma chave para solicitar, nenhum cabeçalho para definir, nenhuma conta para criar. O slug que você recebe é a capacidade: quem o possuir pode ler esse relatório, e ninguém mais consegue adivinhá-lo.

Isso também significa que vale a pena tratar um slug como uma senha. Um relatório mostra a linha de assunto, o remetente, o endereço de retorno e a fonte completa da mensagem para qualquer pessoa que tenha o link.

Chaves de API pessoais

Everything above works without a key. A key is for automation platforms such as Zapier, where every user's calls come from the platform's servers and per-IP limits would be shared by all of them. With a key, limits count per key (50 tests a day, 3 with placement, 5 permanent mailboxes), the key's tests form a history, and the key can keep permanent mailboxes whose reports only it can read. Send the key as Authorization: Bearer est_live_… on any call on this page. The routes below also take account, a short name of your choosing ([A-Za-z0-9_-], up to 64 characters) that keeps separate lists under one key. GET /api/v1/installations/tests requires it; pass the same one on POST /api/v1/inbox so the test shows up there. The Zapier integration uses zapier.

POST /api/v1/keys

Send JSON {"email":"you@example.com"}. Returns HTTP 201 with key and email. The key is shown once; only its hash is kept. Asking again gives a new key and leaves the earlier ones working. Limit: 5 keys per IP per UTC day. The form on /zapier/ calls this.

GET /api/v1/keys/me

Returns email, key_prefix and created_at of the key in the header, or HTTP 401. Use it to check a key.

GET /api/v1/installations/tests

The key's tests, newest first: ?account=…&limit=50 (up to 100), and before=<slug> for the next page. Each item has slug, created_at, analysis_status (waiting or expired before an email arrived), score_ours, score_compat, placement and changes, the checks that moved since the previous test of the same sending domain. Read the full report at /api/v1/tests/{slug}.

POST /api/v1/installations/mailboxes

Send JSON {"domain":"example.com","account":"…"}. Returns the permanent mailbox of that sending domain: id, address, domain, state, daily_cap and created. HTTP 201 when it is new, 200 when it already existed, 409 when the key keeps as many mailboxes as it may. Subscribe the address to a newsletter or a sequence and every email that arrives is checked. GET on the same path with ?account=… lists them, and DELETE /api/v1/installations/mailboxes/{mailbox_id} stops one.

GET /api/v1/installations/mailboxes/{mailbox_id}/letters

The emails that arrived, oldest first, paged with after_id and next_after_id. settled=true ends the page before the first email still being checked, so paging never skips one. newest=true turns the order round, for a quick look at the latest; settled does nothing with it. Each has test_id, slug, received_at, analysis_status, score_ours, score_compat, subject, from_addr and kind.

GET /api/v1/installations/letters/{slug}

The report of one email in a permanent mailbox, the same JSON as /api/v1/tests/{slug} with report_url null: there is no public page for it. HTTP 410 once the report has expired.

Leitura do relatório

Os campos que contêm a resposta, na ordem em que você provavelmente vai querer consultá-los.

score_oursDe 0 a 100. Nosso modelo. Autenticação e infraestrutura têm a maior parte do peso, porque determinam a entrega antes que um filtro leia uma palavra do texto.
score_compatDe 0 a 10. Reproduz o número no estilo do SpamAssassin que as pessoas já usam para comparação, para que o relatório seja comparável ao que alguém viu em outro lugar.
subscoresA mesma escala de 0 a 100 por seção: auth, infra_spam, content, compliance.
checks[]Todas as 42, cada uma com um status, uma constatação de uma linha, as evidências usadas para a decisão e o impacto nos dois scores.
checks[].citationsDe onde vem a constatação: a seção da RFC, citada literalmente, e a página em que o Google declara seu próprio requisito. Selecionadas manualmente em vez de geradas, portanto são confiáveis.
fixes[]O que alterar, em ordem, com os pontos que cada alteração vale. Os ganhos são calculados recalculando a pontuação do relatório, não estimados.
completeFalse quando uma verificação não pôde ser executada. Um item não verificado nunca é uma aprovação, portanto considere a pontuação otimista até que seja true.
report_urlA página legível por humanos. Entregue-a a uma pessoa em vez de uma parede de JSON.

Status

Uma verificação é uma de cinco coisas, e a diferença entre duas delas importa mais do que parece.

passA verificação foi executada e não encontrou nada de errado.
warnVale a pena corrigir. Custa pontos.
failPrejudicará sua entrega. Custa mais pontos.
ignoradoNão se aplicou. Nenhum anexo para verificar, nenhuma parte HTML para avaliar. Não é uma aprovação.
erroNão foi possível determinar. Excluído da pontuação e sinalizado, em vez de contado como uma aprovação.

analysis_status passa por received, analyzing, checks_ready, failed. ai_status passa por pending, running, ready, fallback, error. O relatório determinístico é final em checks_ready; ai_status apenas adiciona o plano.

O que pode ser retornado

202O endereço está reservado e nenhuma mensagem chegou. O corpo contém o endereço, a expiração e o idioma, portanto um cliente que não criou a reserva ainda pode exibi-la.
404Esse slug não existe. Nunca existiu ou a reserva foi esquecida.
410O endereço expirou antes de uma mensagem chegar.
409Você tentou alterar o idioma depois que a mensagem já havia chegado.
429O limite de testes gratuitos para o seu endereço. No momento, não há limite por pessoa neste serviço; se algum dia um limite for definido, o corpo informará quando ele será redefinido.

Quatro coisas que vale a pena saber

Uma mensagem por endereço

A segunda é recusada. Seu relatório anterior permanece intacto, que é justamente o objetivo.

Uma hora para usá-lo

O endereço expira; o relatório não. Os links dos relatórios são permanentes, então um link colado em um ticket continua funcionando.

Envie pela plataforma

Testar uma campanha a partir de uma conta pessoal mede essa conta. Quase tudo na seção de autenticação diz respeito à infraestrutura de envio, não ao texto.

Teste novamente após corrigir

Os ganhos esperados são calculados considerando uma correção por vez e não são cumulativos. O segundo relatório mostra o valor real.

Para máquinas

GET/api/health

Verificação de atividade. Sem autenticação, sem efeitos colaterais.

Primeiro, faça um teste manual

Leva cerca de um minuto e mostra exatamente o que o JSON descreve.

Obter um endereço de teste

Sandbox.

Cada endpoint, com um botão que o executa no serviço ativo. Nada aqui precisa de uma chave, portanto uma solicitação feita nesta página é real: ela reserva um endereço real e é contabilizada.

Teste no sandbox