Experimente na sandbox → Todos os endpoints, com um botão que os executa no serviço em produção. Nada aqui requer uma chave, pelo que um pedido efetuado a partir desta página é real: reserva um endereço real e é contabilizado.
O ciclo
Dois pedidos e um email. A terceira chamada só existe porque a análise demora alguns segundos.
Reserve um endereço
Faça um POST para o endpoint da caixa de entrada. Recebe um endereço que aceita exatamente uma mensagem e expira ao fim de uma hora, bem como o slug ao qual tudo o resto está associado.
Envie-lhe a mensagem real
Através de SMTP, a partir da plataforma que enviará a campanha. Metade das verificações lê os cabeçalhos adicionados pela sua plataforma de envio, pelo que uma mensagem composta manualmente avalia a coisa errada.
Consulte o estado e depois leia o relatório
O endpoint de estado tem algumas centenas de bytes e indica se já vale a pena obter o relatório completo. O relatório propriamente dito tem 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 existe. Nenhuma chave a pedir, nenhum cabeçalho a definir, nenhuma conta a criar. O slug que recebe é a capacidade: quem o tiver pode ler esse relatório, e mais ninguém o consegue adivinhar.
Endpoints
Endereço base https://email-spam-tester.com. Tudo responde em JSON.
POST/api/v1/inbox
Reserva um endereço de utilização única. Ambos os parâmetros são opcionais.
| lang | Idioma em que serão escritos o plano de correção e as conclusões de cada verificação, como código ISO. É decidido agora porque a mensagem chega por SMTP minutos mais tarde e não contém qualquer indicação de quem está à espera dela. Um código desconhecido usa inglês como alternativa. |
| utm_source, utm_medium, utm_campaign | Transmitidos para as nossas análises. Útil se estiver a medir a sua própria integração. |
GET/api/v1/tests/{slug}/status
Pouco dispendioso de consultar. Devolve os dois campos de estado e o progresso das verificações, e nada mais.
GET/api/v1/tests/{slug}
O relatório completo. Responde com 202 enquanto o endereço está reservado e ainda não chegou nada, e com 200 assim que chegar.
GET/api/v1/tests/{slug}/message
A mensagem exatamente como foi entregue: todos os cabeçalhos pela ordem de transmissão, ambos os corpos, a lista de anexos e a fonte em bruto. É obtida separadamente porque o relatório é consultado repetidamente e esta mensagem pode atingir um megabyte.
PUT/api/v1/tests/{slug}/locale
Altera o idioma de uma reserva que ainda não foi utilizada. Para um agente que descobre qual o idioma que o utilizador lê depois de já ter pedido o endereço. Recusado assim que a mensagem chega, porque nessa altura a análise já está em curso.
GET/api/health
Disponibilidade. Sem autenticação, sem efeitos secundários.
Leitura do relatório
Os campos que contêm a resposta, pela ordem em que provavelmente os pretende consultar.
| score_ours | 0 a 100. O nosso modelo. A autenticação e a infraestrutura têm a maior parte do peso, porque determinam a entrega antes de um filtro ler uma única palavra do conteúdo. |
| score_compat | 0 a 10. Reproduz o valor ao estilo do SpamAssassin que as pessoas já utilizam para comparação, para que o relatório seja comparável ao que alguém viu noutro local. |
| subscores | A mesma escala de 0 a 100 por secção: auth, infra_spam, content, compliance. |
| checks[] | As 41 verificações, cada uma com um estado, uma conclusão numa única linha, os elementos em que a decisão se baseou e o impacto nas duas pontuações. |
| checks[].citations | A origem da conclusão: a secção da RFC, citada literalmente, e a página onde a Google declara o seu próprio requisito. Selecionadas manualmente em vez de geradas, pelo que são fiáveis. |
| fixes[] | O que alterar, por ordem, com os pontos que vale cada alteração. Os ganhos são calculados voltando a pontuar o relatório, não são estimados. |
| complete | False quando não foi possível executar uma verificação. Um item não verificado nunca é uma aprovação, por isso considere a pontuação otimista até ser true. |
| report_url | A página legível por pessoas. Entregue-a a uma pessoa em vez de uma parede de JSON. |
Estados
Uma verificação está num de cinco estados, e a diferença entre dois deles é mais importante do que parece.
| pass | A verificação foi executada e não encontrou qualquer problema. |
| warn | Vale a pena corrigir. Custa pontos. |
| fail | Vai prejudicar a entrega. Custa mais pontos. |
| ignorado | Não se aplicou. Sem anexos para analisar, sem parte HTML para ponderar. Não é uma aprovação. |
| erro | Não foi possível determinar. Excluído da pontuação e sinalizado, em vez de ser 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 acrescenta o plano.
O que pode ser devolvido
| 202 | O endereço está reservado e ainda não chegou nenhuma mensagem. O corpo contém o endereço, a data de expiração e o idioma, para que um cliente que não tenha criado a reserva possa ainda assim apresentá-la. |
| 404 | Esse slug não existe. Nunca existiu ou a reserva foi esquecida. |
| 410 | O endereço expirou antes de chegar uma mensagem. |
| 409 | Tentou alterar o idioma depois de a mensagem já ter chegado. |
| 429 | O limite de testes gratuitos para o seu endereço. Atualmente, este serviço não tem um limite por pessoa; se algum vier a ser definido, o corpo indica quando é reposto. |
Quatro coisas que importa saber
Uma mensagem por endereço
A segunda é recusada. O relatório anterior permanece intacto, que é precisamente o objetivo.
Uma hora para o utilizar
O endereço expira; o relatório não. As ligações para os relatórios são permanentes, por isso uma ligação colada num ticket continua a funcionar.
Envie a partir da plataforma
Testar uma campanha a partir de uma conta pessoal avalia essa conta. Quase tudo na secção de autenticação diz respeito à infraestrutura de envio, não ao texto.
Volte a testar após corrigir
Os ganhos esperados são calculados para uma correção de cada vez e não se acumulam. O segundo relatório apresenta 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, segundo a convenção llms.txt, e uma versão mais longa com o ciclo completo e os campos do relatório num único ficheiro.
- /mcp Um servidor MCP com a mesma capacidade e uma espera bloqueante, que é superior à consulta periódica a partir de um modelo.
- For agents A página do agente: quando recorrer a isto, como interpretar uma verificação ignorada em comparação com uma verificação aprovada e quais das conclusões são registos DNS que uma pessoa tem de alterar, em vez de texto que um agente pode editar.
Experimente primeiro uma manualmente
Demora cerca de um minuto e mostra-lhe exatamente o que o JSON descreve.