Pruébalo en el entorno de pruebas → Cada endpoint, con un botón que lo ejecuta contra el servicio en producción. Nada de lo que hay aquí necesita una clave, así que cualquier solicitud que envíes desde esta página es real: reserva una dirección real y cuenta.
El ciclo
Dos solicitudes y un correo electrónico. La tercera llamada solo es necesaria porque el análisis tarda unos segundos.
Reserva una dirección
Haz un POST al endpoint de la bandeja de entrada. Recibirás una dirección que acepta exactamente un mensaje y caduca en una hora, además del slug con el que se identifica todo lo demás.
Envíale el mensaje real
Mediante SMTP, desde la plataforma que enviará la campaña. La mitad de las comprobaciones leen las cabeceras que añade tu plataforma de envío, por lo que un mensaje redactado a mano mide algo distinto.
Consulta el estado y después el informe
El endpoint de estado ocupa unos cientos de bytes y te indica si ya merece la pena obtener el informe completo. El informe en sí tiene varios miles de líneas.
# 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"}} ] }
Autenticación
No hay ninguna. No hay que solicitar ninguna clave, establecer ninguna cabecera ni crear ninguna cuenta. El slug que recibes es la capacidad: quien lo tenga puede leer ese informe y nadie más puede adivinarlo.
Endpoints
Dirección base https://email-spam-tester.com. Todo responde en JSON.
POST/api/v1/inbox
Reserva una dirección de un solo uso. Ambos parámetros son opcionales.
| lang | Idioma en el que se redactarán el plan de corrección y los resultados de cada comprobación, como código ISO. Se decide ahora porque el mensaje llega por SMTP minutos después y no contiene ninguna indicación de quién lo espera. Un código desconocido utiliza el inglés de forma predeterminada. |
| utm_source, utm_medium, utm_campaign | Se transfieren a nuestras analíticas. Es útil si estás midiendo tu propia integración. |
GET/api/v1/tests/{slug}/status
Su consulta periódica tiene un coste bajo. Devuelve los dos campos de estado y el progreso de las comprobaciones, y nada más.
GET/api/v1/tests/{slug}
El informe completo. Responde con 202 mientras la dirección está reservada y todavía no ha llegado nada, y con 200 una vez que ha llegado.
GET/api/v1/tests/{slug}/message
El mensaje exactamente como se entregó: todas las cabeceras en el orden de transmisión, ambos cuerpos, la lista de archivos adjuntos y el código fuente sin procesar. Se obtiene por separado porque el informe se consulta periódicamente y esto puede llegar a ocupar un megabyte.
PUT/api/v1/tests/{slug}/locale
Cambia el idioma de una reserva que aún no se ha utilizado. Para un agente que averigua qué idioma lee su usuario después de haber solicitado ya la dirección. Se rechaza una vez que el mensaje ha llegado, porque para entonces el análisis está en curso.
GET/api/health
Comprobación de actividad. Sin autenticación, sin efectos secundarios.
Lectura del informe
Los campos que contienen la respuesta, en el orden en que probablemente los necesite.
| score_ours | De 0 a 100. Nuestro modelo. La autenticación y la infraestructura tienen la mayor parte del peso, porque deciden la entrega antes de que un filtro lea una palabra del texto. |
| score_compat | De 0 a 10. Reproduce la puntuación de estilo SpamAssassin que ya se suele comparar, para que el informe sea comparable con lo que alguien haya visto en otro lugar. |
| subscores | La misma escala de 0 a 100 por sección: auth, infra_spam, content, compliance. |
| checks[] | Las 41, cada una con un estado, una conclusión de una línea, las pruebas en las que se basó la decisión y lo que restó a las dos puntuaciones. |
| checks[].citations | De dónde procede el hallazgo: la sección del RFC, citada textualmente, y la página donde Google establece su propio requisito. Recopilado manualmente en lugar de generarse, por lo que se puede confiar en ello. |
| fixes[] | Qué cambiar, en orden, con los puntos que vale cada cambio. Las mejoras se calculan volviendo a puntuar el informe, no se estiman. |
| complete | Es falso cuando no se pudo ejecutar una comprobación. Un elemento no comprobado nunca se considera aprobado, así que trata la puntuación como optimista hasta que sea verdadero. |
| report_url | La página legible para personas. Entrégasela a una persona en lugar de un bloque de JSON. |
Estados
Una comprobación puede tener uno de cinco estados, y la diferencia entre dos de ellos importa más de lo que parece.
| pass | La comprobación se ejecutó y no encontró ningún problema. |
| warn | Conviene corregirlo. Resta puntos. |
| fail | Perjudicará la entrega. Cuesta más puntos. |
| omitir | No se aplicó. No hay archivos adjuntos que analizar ni parte HTML que evaluar. No es un resultado aprobado. |
| error | No pudimos determinarlo. Se excluye de la puntuación y se marca, en lugar de contarse como un resultado aprobado. |
analysis_status pasa por received, analyzing, checks_ready, failed. ai_status pasa por pending, running, ready, fallback, error. El informe determinista es definitivo en checks_ready; ai_status solo añade el plan.
Qué puede devolverse
| 202 | La dirección está reservada y no ha llegado ningún mensaje. El cuerpo contiene la dirección, la fecha de expiración y el idioma, por lo que quien realiza la llamada puede mostrarlos aunque no haya creado la reserva. |
| 404 | No existe ese slug. Nunca existió o se olvidó la reserva. |
| 410 | La dirección expiró antes de que llegara un mensaje. |
| 409 | Intentaste cambiar el idioma después de que el mensaje ya hubiera llegado. |
| 429 | El límite de pruebas gratuitas para tu dirección. Actualmente no hay ningún límite por persona en este servicio; si alguna vez se establece uno, el cuerpo indica cuándo se restablece. |
Cuatro cosas que conviene saber
Un mensaje por dirección
El segundo se rechaza. Tu informe anterior permanece intacto, que es precisamente el objetivo.
Una hora para usarla
La dirección caduca; el informe no. Los enlaces a los informes son permanentes, así que uno pegado en un ticket sigue funcionando.
Envía desde la plataforma
Probar una campaña desde una cuenta personal mide esa cuenta. Casi todo lo que aparece en la sección de autenticación se refiere a la infraestructura de envío, no al texto.
Repite la prueba después de corregir
Las mejoras esperadas se calculan para una corrección cada vez y no son acumulativas. El segundo informe muestra la cifra real.
Para máquinas
- /api/openapi.json La descripción OpenAPI, generada a partir del mismo código que sirve la API.
- /llms.txt, /llms-full.txt Un mapa breve de este sitio para modelos de lenguaje, según la convención llms.txt, y una versión más extensa con el ciclo completo y los campos del informe en un solo archivo.
- /mcp Un servidor MCP con la misma capacidad y una espera bloqueante, que supera al sondeo desde dentro de un modelo.
- For agents La página del agente: cuándo recurrir a esto, cómo interpretar una comprobación omitida frente a una superada y qué hallazgos son registros DNS que una persona debe cambiar en lugar de texto que un agente puede editar.
Prueba primero uno manualmente
Tarda aproximadamente un minuto y te muestra exactamente lo que describe el JSON.