Попробовать в песочнице → Каждая конечная точка снабжена кнопкой, которая запускает запрос к рабочему сервису. Здесь нигде не нужен ключ, поэтому запрос, отправленный с этой страницы, является реальным: он резервирует реальный адрес и учитывается.
Цикл
Два запроса и одно письмо. Третий вызов нужен только потому, что анализ занимает несколько секунд.
Зарезервируйте адрес
Отправьте POST-запрос к конечной точке входящих сообщений. В ответ вы получите адрес, который принимает ровно одно сообщение и истекает через час, а также slug, к которому привязано всё остальное.
Отправьте на него настоящее сообщение
По SMTP, с платформы, которая будет отправлять рассылку. Половина проверок анализирует заголовки, добавляемые вашей платформой отправки, поэтому составленное вручную сообщение измеряет не то, что нужно.
Опрашивайте статус, затем прочитайте отчёт
Конечная точка статуса возвращает несколько сотен байт и сообщает, стоит ли уже загружать полный отчёт. Сам отчёт занимает несколько тысяч строк.
# 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"}} ] }
Аутентификация
Её нет. Не нужно запрашивать ключ, задавать заголовок или создавать учётную запись. Полученный слаг и есть средство доступа: любой, у кого он есть, может прочитать этот отчёт, а остальные не могут его угадать.
Конечные точки
Базовый адрес https://email-spam-tester.com. Все ответы возвращаются в формате JSON.
POST/api/v1/inbox
Резервирует одноразовый адрес. Оба параметра необязательны.
| lang | Язык, на котором будут написаны план исправлений и результаты отдельных проверок, в виде кода ISO. Он определяется сейчас, потому что сообщение приходит по SMTP через несколько минут и не содержит указаний на то, кто его ожидает. Для неизвестного кода используется английский язык. |
| utm_source, utm_medium, utm_campaign | Передаются в нашу аналитику. Полезно, если вы оцениваете собственную интеграцию. |
GET/api/v1/tests/{slug}/status
Не требует значительных ресурсов при опросе. Возвращает два поля состояния и сведения о ходе проверок, и ничего больше.
GET/api/v1/tests/{slug}
Полный отчёт. Возвращает 202, пока адрес зарезервирован и ещё ничего не поступило, и 200 после поступления сообщения.
GET/api/v1/tests/{slug}/message
Сообщение в точности в том виде, в котором оно было доставлено: все заголовки в порядке передачи, обе части сообщения, список вложений и исходные данные. Загружается отдельно, потому что отчёт опрашивается, а размер сообщения может достигать мегабайта.
PUT/api/v1/tests/{slug}/locale
Изменяет язык резервирования, которое еще не было использовано. Для агента, который узнает, на каком языке читает его пользователь, уже после запроса адреса. Запрос отклоняется после поступления сообщения, потому что к тому времени анализ уже выполняется.
GET/api/health
Проверка работоспособности. Без аутентификации, без побочных эффектов.
Чтение отчета
Поля, содержащие ответ, в том порядке, в котором они, вероятно, вам понадобятся.
| score_ours | От 0 до 100. Наша модель. Аутентификация и инфраструктура имеют наибольший вес, потому что они определяют доставку до того, как фильтр прочитает хотя бы слово текста. |
| score_compat | От 0 до 10. Воспроизводит показатель в стиле SpamAssassin, с которым уже привыкли сравнивать, поэтому отчет сопоставим с тем, что кто-либо видел в другом месте. |
| subscores | Та же шкала от 0 до 100 для каждого раздела: auth, infra_spam, content, compliance. |
| checks[] | Все 41, каждый со статусом, выводом в одну строку, данными, на основании которых он был сделан, и тем, сколько баллов он стоил двум оценкам. |
| checks[].citations | Источник результата проверки: раздел RFC, процитированный дословно, и страница, где Google указывает собственное требование. Подобрано вручную, а не сгенерировано, поэтому этим данным можно доверять. |
| fixes[] | Что изменить, в каком порядке и сколько баллов дает каждое изменение. Прирост рассчитывается путем повторной оценки отчета, а не приблизительно. |
| complete | False, если проверку не удалось выполнить. Непроверенный элемент никогда не считается пройденным, поэтому считайте оценку оптимистичной, пока это значение не станет true. |
| report_url | Страница в удобном для чтения виде. Передайте человеку ее, а не стену JSON. |
Статусы
Проверка имеет один из пяти статусов, и разница между двумя из них важнее, чем кажется.
| pass | Проверка выполнена и не выявила проблем. |
| warn | Стоит исправить. Снижает оценку. |
| fail | Ухудшит доставляемость. Стоит больше баллов. |
| пропуск | Не применимо. Нет вложений для сканирования, нет HTML-части для оценки. Это не успешная проверка. |
| ошибка | Нам не удалось это выяснить. Исключено из оценки и помечено, а не засчитано как успешная проверка. |
analysis_status принимает значения received, analyzing, checks_ready, failed. ai_status принимает значения pending, running, ready, fallback, error. Детерминированный отчёт окончательно формируется при checks_ready; ai_status только добавляет план.
Что может вернуться
| 202 | Адрес зарезервирован, и сообщение ещё не поступило. Тело содержит адрес, срок действия и язык, поэтому вызывающая сторона, которая не создавала резервирование, всё равно может их отобразить. |
| 404 | Такого идентификатора нет. Он либо никогда не существовал, либо резервирование было забыто. |
| 410 | Срок действия адреса истёк до поступления сообщения. |
| 409 | Вы попытались изменить язык после того, как сообщение уже поступило. |
| 429 | Лимит бесплатных тестов для вашего адреса. Сейчас в этом сервисе нет лимита на пользователя; если он когда-либо будет установлен, в теле будет указано, когда он сбрасывается. |
Четыре важных момента
Одно сообщение на адрес
Второе сообщение отклоняется. Ваш предыдущий отчёт остаётся без изменений, в этом и смысл.
Час на использование
Адрес перестаёт действовать, отчёт остаётся. Ссылки на отчёты постоянны, поэтому ссылка, вставленная в заявку, продолжает работать.
Отправляйте с платформы
Тестирование кампании из личной учётной записи оценивает эту учётную запись. Почти всё в разделе аутентификации относится к инфраструктуре отправки, а не к тексту.
Повторите тест после исправления
Ожидаемые улучшения рассчитываются для каждого исправления отдельно и не суммируются. Второй отчёт покажет достоверный результат.
Для машин
- /api/openapi.json Описание OpenAPI, созданное из того же кода, который обслуживает API.
- /llms.txt, /llms-full.txt Краткая карта этого сайта для языковых моделей в формате llms.txt и более подробная версия со всем циклом и полями отчета в одном файле.
- /mcp Сервер MCP с теми же возможностями и блокирующим ожиданием, которое лучше опроса изнутри модели.
- For agents Страница для агента: когда это использовать, как отличить пропущенную проверку от пройденной и какие обнаруженные проблемы относятся к записям DNS, которые должен изменить человек, а не к тексту, который может отредактировать агент.
Сначала попробуйте вручную
Это занимает около минуты и показывает, что именно описывает JSON.