Teste no 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.
O fluxo
Duas requisições e um e-mail. A terceira chamada só existe porque a análise leva alguns segundos.
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.
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.
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.
# 1. reserve a single-use address curl -sX POST 'https://email-spam-tester.com/api/v1/inbox?lang=en' { "address": "test-<slug>@t.email-spam-tester.com", "slug": "<slug>", "expires_at": "2026-01-01T12:00:00Z" }
# 2. send your message to that address, then poll curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>/status' { "slug": "<slug>", "analysis_status": "checks_ready", "ai_status": "running", "checks_done": 39, "checks_total": 39 }
# 3. read the report once analysis_status is checks_ready curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>' { "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"}} ] }
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.
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.
| lang | Idioma 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_campaign | Repassados 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.
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.
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.
GET/api/health
Verificação de atividade. Sem autenticação, sem efeitos colaterais.
Leitura do relatório
Os campos que contêm a resposta, na ordem em que você provavelmente vai querer consultá-los.
| score_ours | De 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_compat | De 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. |
| subscores | A mesma escala de 0 a 100 por seção: auth, infra_spam, content, compliance. |
| checks[] | Todas as 41, 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[].citations | De 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. |
| complete | False 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_url | A 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.
| pass | A verificação foi executada e não encontrou nada de errado. |
| warn | Vale a pena corrigir. Custa pontos. |
| fail | Prejudicará sua entrega. Custa mais pontos. |
| ignorado | Não se aplicou. Nenhum anexo para verificar, nenhuma parte HTML para avaliar. Não é uma aprovação. |
| erro | Nã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
| 202 | O 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. |
| 404 | Esse slug não existe. Nunca existiu ou a reserva foi esquecida. |
| 410 | O endereço expirou antes de uma mensagem chegar. |
| 409 | Você tentou alterar o idioma depois que a mensagem já havia chegado. |
| 429 | O 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
- /api/openapi.json A descrição OpenAPI, gerada a partir do mesmo código que disponibiliza a API.
- /llms.txt, /llms-full.txt Um mapa curto deste site para modelos de linguagem, na convenção llms.txt, e uma versão mais longa com o ciclo completo e os campos do relatório em um único arquivo.
- /mcp Um servidor MCP com o mesmo recurso e uma espera bloqueante, que é melhor do que fazer polling de dentro de um modelo.
- For agents A página do agente: quando usar isto, como interpretar uma verificação ignorada em comparação com uma aprovada e quais constatações são registros DNS que uma pessoa precisa alterar, em vez de texto que um agente pode editar.
Primeiro, faça um teste manual
Leva cerca de um minuto e mostra exatamente o que o JSON descreve.