Email Spam Tester

A API

Três chamadas. Sem chave, sem conta, sem registo.

Reserve um endereço, envie a mensagem que estava prestes a enviar à sua lista e consulte o relatório. Tudo o que a página apresenta está no JSON, incluindo a pontuação, as 41 verificações com as respetivas evidências e a secção da norma em que se baseia cada resultado.

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

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.

  1. 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.

  2. 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.

  3. 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.

Isso também significa que deve tratar um slug como uma palavra-passe. Um relatório mostra o assunto, o remetente, o endereço de devolução e a fonte completa da mensagem a qualquer pessoa que tenha a ligação.

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.

langIdioma 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_campaignTransmitidos 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.

Consulte este endpoint em vez do relatório. analysis_status atinge primeiro checks_ready, e o plano de AI fica disponível em ai_status cerca de um minuto mais tarde, para que um cliente que apenas pretenda as verificações determinísticas não tenha de esperar pelo plano.

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.

A mensagem em bruto é eliminada segundo o 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 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_ours0 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_compat0 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.
subscoresA 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[].citationsA 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.
completeFalse 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_urlA 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.

passA verificação foi executada e não encontrou qualquer problema.
warnVale a pena corrigir. Custa pontos.
failVai prejudicar a entrega. Custa mais pontos.
ignoradoNão se aplicou. Sem anexos para analisar, sem parte HTML para ponderar. Não é uma aprovação.
erroNã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

202O 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.
404Esse slug não existe. Nunca existiu ou a reserva foi esquecida.
410O endereço expirou antes de chegar uma mensagem.
409Tentou alterar o idioma depois de a mensagem já ter chegado.
429O 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

Experimente primeiro uma manualmente

Demora cerca de um minuto e mostra-lhe exatamente o que o JSON descreve.

Obter um endereço de teste