Email Spam Tester

API перевірки листів на спам,
папки та домену

Надішліть нам одне реальне повідомлення або вкажіть лише домен. Усі відповіді надходять у форматі JSON.

Без ключа, без облікового запису.

Запит

# reserve a single-use address

$ curl -sX POST '.../api/v1/inbox?lang=en'

# send your message to that address, then

$ curl -s '.../api/v1/tests/k7m2x9qplw4tz8vn3b6c/status'

# read the report

$ curl -s '.../api/v1/tests/k7m2x9qplw4tz8vn3b6c'

Відповідь

200 OK

{
  "address": "test-k7m2x9qplw4tz8vn3b6c@t.email-spam-tester.com",
  "slug": "k7m2x9qplw4tz8vn3b6c",
  "expires_at": "2026-10-31T13:00:00Z"
}

200 OK

{
  "analysis_status": "checks_ready",
  "ai_status": "running",
  "checks_done": 42,
  "checks_total": 42
}

200 OK

{
  "score_ours": 86.4,
  "score_compat": 9.2,
  "subscores": {"auth": 100.0, "infra_spam": 78.1, "content": 92.0},
  "complete": true,
  "checks": [{"id": "auth.dmarc", "status": "warn"}],
  "fixes": [{"id": "dmarc-enforce", "gain_ours": 4.0}]
}

Запит

# create a test

$ curl -sX POST '.../api/v1/placement' \ -d '{"public_results_accepted":true}'

# put the marker in the subject, send once to all, then

$ curl -s '.../api/v1/placement/wR3kP9xLq2vT8mZc'

Відповідь

201 Created

{
  "marker": "est-3f9a1c7e2b4d6a80c5e1f2d3",
  "status": "waiting",
  "results": [{"provider": "gmail", "placement": "pending"}],
  "fleet": {"status": "observing", "results": [
    {"provider": "yahoo", "placement": "pending"},
    {"provider": "outlook", "placement": "pending"}
  ]}
}

200 OK

{
  "status": "complete",
  "results": [{"provider": "gmail", "placement": "primary"}],
  "fleet": {"status": "finished", "results": [
    {"provider": "yahoo", "placement": "inbox"},
    {"provider": "outlook", "placement": "spam"}
  ]}
}

Запит

# no email needed, one GET

$ curl -s '.../api/v1/infra/check?domain=example.com'

# compare with your last run

$ curl -s '.../api/v1/infra/check?domain=example.com&diff=true' \ | jq '.diff'

Відповідь

200 OK

{
  "domain": "example.com",
  "ok": false,
  "status": "fail",
  "score": 78,
  "coverage": {"answered": 7, "total": 8},
  "sections": {"ptr": {"status": "fail", "core": true}}
}

200 OK

{
  "changed": true,
  "worsened": true,
  "status_from": "pass",
  "score_from": 100,
  "changes": [{"path": "dkim.key.mail.sha256", "kind": "removed",
               "severity": "critical", "effect": "worsened"}]
}
На цій сторінці

Перевірка листа

Ми повністю аналізуємо одне реальне повідомлення: вміст, підпис, заголовки та сервер, який його надіслав. Ви отримуєте оцінку, список виправлень і результати всіх перевірок, на яких вони ґрунтуються.

Швидкий старт

Три виклики. Без ключа, облікового запису та реєстрації. Два запити й один лист. Третій виклик потрібен лише тому, що аналіз триває кілька секунд.

  1. Зарезервуйте адресу

    Надішліть POST-запит до кінцевої точки inbox. У відповідь ви отримаєте адресу, яка приймає рівно один лист і втрачає чинність через годину, а також слаг, за яким визначається все інше.

    Запит

    # 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. Надішліть на неї справжній лист

    Через SMTP, із платформи, яка надсилатиме кампанію. Половина перевірок зчитує заголовки, які додає ваша платформа надсилання, тому лист, складений вручну, вимірює не те.

    Запит

    # 2. send your message to that address, from your own platform
    To: test-<slug>@t.email-spam-tester.com
  3. Опитуйте статус, потім прочитайте звіт

    Кінцева точка статусу повертає кілька сотень байтів і повідомляє, чи вже варто отримувати повний звіт. Сам звіт містить кілька тисяч рядків.

    Запит

    # 3. poll
    curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>/status'

    Відповідь

    {
      "slug": "<slug>",
      "analysis_status": "checks_ready",
      "ai_status": "running",
      "checks_done": 42,
      "checks_total": 42
    }

    Запит

    # 4. 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"}}
      ]
    }

Зарезервуйте адресу, надішліть лист, який ви збиралися надіслати своєму списку розсилки, прочитайте звіт. У JSON є все, що показує сторінка, включно з оцінкою, усіма 42 перевірками та їхніми доказами, а також розділом стандарту, на якому ґрунтується кожен висновок.

Перші 100 000 звітів безкоштовні, без ключа й облікового запису. Якщо ви налаштовуєте агент, а не скрипт, сервер MCP підходить краще, ніж опитування.

Кінцеві точки

Базова адреса 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

Не потребує значних ресурсів для опитування. Повертає два поля стану та прогрес перевірок, і більше нічого.

Опитуйте цю кінцеву точку, а не звіт. analysis_status спочатку досягає checks_ready, а план ШІ з’являється в ai_status приблизно на хвилину пізніше, тому клієнту, якому потрібні лише детерміновані перевірки, не доведеться чекати на план.

GET/api/v1/tests/{slug}

Повний звіт. Відповідає кодом 202, поки адресу зарезервовано й повідомлення ще не надійшло, та кодом 200 після його надходження.

GET/api/v1/tests/{slug}/message

Повідомлення саме в тому вигляді, у якому його було доставлено: усі заголовки в порядку передавання, обидві частини тіла, список вкладень і необроблений вихідний код. Отримується окремо, оскільки звіт опитується, а розмір цих даних може сягати мегабайта.

Необроблене повідомлення видаляється за власним розкладом, раніше за звіт. Після цього ця кінцева точка повертає причину замість вихідного повідомлення.

PUT/api/v1/tests/{slug}/locale

Змінює мову резервування, яке ще не було використано. Для агента, який дізнається, якою мовою читає його користувач, після того як уже запросив адресу. Запит відхиляється після надходження повідомлення, оскільки на той момент аналіз уже виконується.

Розміщення у вхіднихБета

Надішліть одне повідомлення на список тестових поштових скриньок і дізнайтеся, куди воно потрапило в Gmail, Outlook, Yahoo та інших провайдерів: у «Вхідні», «Промоакції» чи «Спам».

Швидкий старт

  1. Створіть тест

    Виконайте POST-запит до кінцевої точки placement. У відповідь ви отримаєте маркер і тестові скриньки.

    Запит

    # 1. create a test
    curl -sX POST 'https://email-spam-tester.com/api/v1/placement' \
      -H 'Content-Type: application/json' \
      -d '{"public_results_accepted":true}'

    Відповідь

    {
      "slug": "<slug>",
      "marker": "est-3f9a1c7e2b4d6a80c5e1f2d3",
      "status": "waiting",
      "deadline": "2026-10-31T12:30:00Z",
      "poll_after_seconds": 60,
      "results": [
        {"address": "<seed>", "provider": "gmail", "kind": "Gmail",
         "placement": "pending", "observed_at": null}
      ],
      "fleet": {
        "status": "observing",
        "results": [
          {"address": "<mailbox>", "provider": "yahoo", "available": true,
           "placement": "pending", "coverage": "pending"}
        ]
      }
    }
  2. Надішліть одне повідомлення до кожної скриньки

    Додайте маркер у тему та надішліть повідомлення зі своєї звичайної платформи на всі адреси за один раз.

    Запит

    # 2. one message to every address, with the marker in the subject
    Subject: October invoice est-3f9a1c7e2b4d6a80c5e1f2d3
    To: <seed>, <mailbox>, ...
  3. Опитуйте статус папок

    Для кожної адреси з’являться її провайдер і папка. Опитуйте, доки статус не перестане бути waiting.

    Запит

    # 3. poll for the folders
    curl -s 'https://email-spam-tester.com/api/v1/placement/<slug>'

    Відповідь

    {
      "status": "complete",
      "received": 2,
      "total": 2,
      "results": [
        {"address": "<seed>", "provider": "gmail", "kind": "Gmail",
         "placement": "primary", "observed_at": "2026-10-31T12:04:11Z"},
        {"address": "<seed>", "provider": "gmail", "kind": "Google Workspace",
         "placement": "promotions", "observed_at": "2026-10-31T12:04:11Z"}
      ],
      "fleet": {
        "status": "finished",
        "results": [
          {"address": "<mailbox>", "provider": "yahoo", "available": true,
           "placement": "inbox", "coverage": "ok"},
          {"address": "<mailbox>", "provider": "outlook", "available": true,
           "placement": "spam", "coverage": "ok"}
        ]
      }
    }

Кінцеві точки

An optional test using public GMass seed inboxes and available project test mailboxes, alone or alongside the email score. Explain to the sender that GMass receives their email and publishes its subject, sender name and placement before creating a test. Use all test mailboxes for non-confidential test messages only.

GET /api/v1/placement/availability

Returns providers: the provider identifiers of currently healthy, admitted project mailboxes. No addresses or credentials are exposed. This read does not create a test or contact GMass. Actual recipients are allocated at creation and may differ as availability or capacity changes.

POST /api/v1/placement

Send JSON {"public_results_accepted":true}. Returns HTTP 201 with slug, marker, results (the seed addresses), deadline and expires_at. Limit: 20 tests per IP per UTC day.

For one-send combined testing, first reserve an email score address and include its score_slug in the placement creation JSON. Repeated creation for that score returns the same placement test. Send the marked email to the score address, every returned seed and every available fleet.results address; keep the main /t/<score_slug> report link. Creating a link after the score address was used or expired returns HTTP 409.

GET /api/v1/placement/by-score/{score_slug}

Read and refresh the placement run attached to the main email test. The response has the same format and polling limits as the standalone endpoint below. HTTP 404 means placement was not included or its stored results have been removed.

GET /api/v1/placement/{slug}

Use poll_after_seconds (normally 60 seconds) while the page is open. Upstream errors trigger a shared cooldown. Add the marker to the subject and send through the sender's normal platform to every seed. Observations are saved for 30 days. Collection ends after 30 minutes or when all seeds have results.

status: waiting, complete or timed_out. Each result has an address, provider, kind, placement and observed_at. Placement is primary, promotions, inbox, updates, social, forums, spam, unknown, pending or not_observed. Missing results do not mean Spam; Promotions is an inbox category. provider_error indicates an upstream outage without discarding saved observations. HTTP 404 means unknown, 410 expired, 429 quota exhausted, and 503 no test inboxes available at creation.

The optional fleet object contains independently collected project mailbox results, with status observing, settling or finished. Refresh every 30 seconds until it finishes, even when Gmail has completed. Each fleet result includes address, provider, available, placement, category and coverage. Exclude unavailable addresses from new sends; retain their saved observations. Category data may be unavailable even when the physical folder is known.

If GMass is unavailable at creation but project mailboxes can be allocated, provider is fleet and the top-level seed results are empty. Use fleet.results; do not interpret an empty Gmail list as successful delivery. Existing runs never gain new recipient addresses silently.

Перевірка інфраструктури

Один запит GET перевіряє поштове налаштування домену, нічого не надсилаючи, зберігає результат і повідомляє вам, що змінилося з часу останнього запуску. Ключ не потрібен. У cron наведений нижче рядок завершується з ненульовим кодом, коли домен несправний або його налаштування змінилося суттєвим чином.

Швидкий старт

  1. Виконайте один GET-запит

    Передайте домен. ip додає ваші адреси відправлення, а selector задає назви селекторів DKIM, які потрібно прочитати.

    Запит

    curl -s 'https://email-spam-tester.com/api/v1/infra/check?domain=example.com&selector=mail&diff=true'
  2. Прочитайте вердикт

    ok є відповіддю для скрипту, а sections показує, яка частина завершилася помилкою.

    Відповідь

    {
      "id": "ir_01JB8Y4T2M6K9QZ7H3V5N1XWDA",
      "domain": "example.com",
      "checked_at": "2026-10-31T12:00:00Z",
      "ok": false,
      "status": "fail",
      "score": 78,
      "coverage": {"answered": 7, "total": 8},
      "ips": [{"ip": "203.0.113.5", "sources": ["mx", "spf"], "managed": false}],
      "sections": {
        "dkim": {"status": "pass", "core": true, "findings": [], "data": {}},
        "ptr": {"status": "fail", "core": true, "findings": [], "data": {}}
      },
      "not_checked": [
        {"check": "dkim_signature", "reason": "needs_a_message"},
        {"check": "alignment", "reason": "needs_a_message"}
      ],
      "diff": {
        "baseline": {"id": "ir_01JB2...", "checked_at": "2026-10-24T12:00:00Z"},
        "first_run": false,
        "changed": true,
        "worsened": true,
        "status_from": "pass",
        "score_from": 100,
        "changes": [
          {"path": "dkim.key.mail.sha256", "section": "dkim", "kind": "removed",
           "severity": "critical", "effect": "worsened", "from": "9f2c...", "to": null}
        ],
        "not_compared": [
          {"path": "blocklist_ip.203.0.113.5.bl.spamcop.net.listed", "reason": "lookup_failed"}
        ]
      }
    }
  3. Додайте це до cron

    З diff=true кожен запуск порівнюється з вашим попереднім запуском, а jq перетворює відповідь на код завершення.

    Запит

    # exits non-zero if the domain is broken or its setup changed
    curl -s 'https://email-spam-tester.com/api/v1/infra/check?domain=example.com&selector=mail&diff=true' \
      | jq -e '.ok and (.diff.changed | not)'
domainОбов’язково. Приймає те саме, що й інструменти: домен, URL, адресу електронної пошти.
ipВаша IP-адреса відправлення. Повторіть параметр, щоб передати більше адрес, але не більше 6.
selectorСелектор DKIM. Повторіть параметр, щоб передати більше селекторів, але не більше 10. Кожен переданий вами селектор має існувати, інакше перевірка розділу DKIM завершиться невдало.
heloІм’я, яке ваш сервер надає в HELO, порівняно з його PTR.
accountДля кого призначено запит. Обов’язково з ключем, який обслуговує багатьох користувачів.
checksРозділи, які потрібно перевірити, через кому. За замовчуванням усі.
difftrue порівнює цей запуск із вашим останнім запуском домену.
since7d, 12h або дата у форматі ISO 8601. Порівнює з вашим запуском, найближчим до цього моменту в межах 12 годин, або, якщо такого немає, з останнім запуском перед ним. Вмикає diff.
baselineІдентифікатор одного з ваших запусків, з яким потрібно порівняти. Вмикає diff.
freshtrue оминає 60-секундний кеш.

Читання відповіді

Завершена перевірка відповідає кодом 200, а вердикт міститься в тілі. status є найгіршим статусом серед обов’язкових розділів: spf, dkim, dmarc, ptr, blocklist_ip, blocklist_domain, mx і smtp. unknown в обов’язковому розділі вважається warn. ok має значення true, коли status має значення pass або warn. score має значення від 0 до 100 за обов’язковими розділами, які надали відповідь, і дорівнює null, коли через errors і unknowns залишається менше половини застосовної ваги. mta_sts, tls_rpt, bimi, dnssec, dane, ns і registration повертаються та порівнюються, але не впливають на ok або score.

Розділ може мати статус pass, warn, fail, error (нам не вдалося виконати перевірку), unknown (недостатньо даних) або skipped (не застосовується). skipped не впливає на результат, а причина міститься в not_checked. dkim_signature і alignment завжди присутні, оскільки для них потрібне реальне повідомлення.

Що змінюють ip і selector

PTR і блоклісти стосуються адрес, тому запуску потрібні адреси. Він використовує передані вами значення ip. Якщо їх немає, він бере до чотирьох адрес із ваших хостів MX і з термів ip4: та ip6: з однією адресою в кореневому записі SPF. Адреси відомого поштового провайдера позначаються як managed і не перевіряються, а якщо після цього нічого не залишається, ptr і blocklist_ip відповідають skipped. selector неможливо прочитати з DNS, тому запуск перевіряє ваші значення, значення, знайдені під час ваших попередніх запусків, і список поширених назв. Якщо нічого не знайдено, це нічого не доводить, і dkim відповідає unknown. Якщо ви надсилаєте пошту з власного сервера, передайте обидва значення.

Що змінилося

Кожен запис у diff.changes має path, kind (added, removed, changed), severity (critical, warning, info) та effect (worsened, improved, neutral). Лише critical і warning встановлюють diff.changed, тому ротація ключа DKIM на ключ такої самої довжини, нова адреса MX або поновлений сертифікат не спричиняють помилку рядка cron. diff.worsened відповідає effect будь-якої зміни. Під час першого запуску порівнювати нема з чим, і diff.first_run вказує на це.

Базовим завжди є один із ваших власних запусків, тому перевірка домену кимось іншим між двома вашими запусками нічого не приховує. Усе, що цього разу не вдалося прочитати, потрапляє до diff.not_compared зі збереженим останнім відомим значенням, а це означає, що зміна, внесена під час збою, з’явиться, щойно пошук знову запрацює. Запуск з іншим ip або selector залишається в тій самій серії, а те, що він не запитував, також не порівнюється.

Навіщо плановій перевірці потрібен ключ

Без ключа ваша історія належить хешу з ключем від вашої IP-адреси, тому вона закінчується, коли адреса змінюється, а користувачі за однією адресою мають спільну історію: запуск колеги змінює вашу базову версію. З особистим ключем API в Authorization: Bearer історія прив’язана до ключа. Запуски з ключем зберігаються 365 днів і відкриваються лише з цим ключем. Запуски без ключа зберігаються 30 днів і відкриті всім, хто має їхній id.

6 запитів на хвилину і 50 на день для кожної IP-адреси або 30 і 500 для кожного ключа. У разі перевищення відповідь має код 429 із Retry-After. Ідентичний запит протягом 60 секунд повертається з кешу, позначається cached: true, не створює запис запуску й не враховується. Читання збережених запусків дозволяє 120 запитів на хвилину для кожного клієнта. Код 503 із Retry-After означає, що виконується забагато перевірок, або, під час читання збережених запусків, що сховище недоступне. Код 401 означає неправильний ключ. Код 422 містить detail.code: invalid_domain, invalid_ip, invalid_selector, invalid_check, invalid_since, unknown_baseline або account_required.

Кінцеві точки

GET/api/v1/infra/check

Запускає перевірку. Параметри наведено в таблиці вище.

GET/api/v1/infra/runs/{public_id}

Один збережений запуск, повністю. 404, якщо він не існує або належить іншому ключу.

GET/api/v1/infra/domains/{domain}/runs

Ваші запуски для домену, від найновішого: id, час, статус, оцінка та кількість змін. Приймає limit (від 1 до 100, типово 30) і before, id запуску.

GET/api/v1/infra/diff

Таке саме порівняння між двома збереженими запусками, ?from=<id>&to=<id>. Вам потрібен доступ до обох.

GET/api/v1/infra/checks

Кожен розділ із його вагою, версією оцінювання та обмеженнями.

Окремі перевірки

Кожен виклик відповідає на одне запитання й не зберігає історію. Інструмент самостійно виконує одну частину перевірки інфраструктури, крім інструмента заголовків, який читає повідомлення, уже отримане вами.

Швидкий старт

  1. Виберіть перевірку

    Виберіть інструмент зі списку нижче та передайте домен, адресу або IP, який він запитує.

    Запит

    curl -s 'https://email-spam-tester.com/api/v1/tools/spf?domain=example.com'
  2. Перегляньте статус і результати

    Кожен інструмент повертає статус і результати. Поля після них залежать від інструмента.

    Відповідь

    {
      "tool": "spf",
      "query": {"domain": "example.com"},
      "checked_at": "2026-10-31T12:00:00Z",
      "duration_ms": 412,
      "status": "fail",
      "findings": [
        {"code": "spf.too_many_lookups", "level": "fail",
         "params": {"limit": 10, "count": 12},
         "message": "RFC 7208 §4.6.4 allows at most 10 DNS lookups, and this record needs 12, so receivers return permerror."}
      ],
      "record": "v=spf1 include:_spf.example.net ~all",
      "lookups": {"count": 12, "limit": 10, "void": 0}
    }

Кінцеві точки

Усі вони відповідають кодом 200 зі статусом і списком результатів, кожен із кодом та його параметрами. Статусом є pass, warn, fail або error, а інструмент, спільний із перевіркою інфраструктури, також може відповісти unknown або skipped. Пошук, для якого минув час очікування, або список, який відхилив запит, ніколи не зараховується як pass. 30 запитів за хвилину та 300 на день для кожної IP-адреси в усіх інструментах; понад цей ліміт відповідь має код 429 із Retry-After.

GET/api/v1/tools/spf

Запис SPF домену: його синтаксис, усі пройдені include і redirect та кількість DNS-запитів, яку все дерево витрачає з ліміту в десять. Передайте ?domain=example.com.

GET/api/v1/tools/dmarc

Запис DMARC домену або його організаційного домену, якщо власного запису немає: теги, політика та чи погодилася кожна зовнішня адреса для звітів приймати звіти. Передайте ?domain=example.com.

GET/api/v1/tools/dkim

Ключ DKIM, опублікований для селектора: чи він існує та декодується, його тип і розмір, а також прапорці відкликання й тестування. Передайте ?domain=example.com&selector=s1.

GET/api/v1/tools/blocklist

Адреса IPv4, адреса IPv6 або домен, перевірені за списками блокування DNS, які використовує звіт, із відповіддю кожного списку. Передайте ?target=203.0.113.5.

GET/api/v1/tools/mx

Записи MX домену в порядку, у якому відправники їх перевіряють, з адресами IPv4 та IPv6 кожного хоста. Повідомляється про нульовий MX, домен без MX, хости, що є IP-адресами або CNAME, і хости, адреси яких не визначаються, а також про записи MTA-STS і TLS-RPT. Передайте ?domain=example.com.

GET/api/v1/tools/bimi

Налаштування BIMI домену у чотири кроки: політика DMARC, якої вимагає BIMI, запис у default._bimi, логотип SVG, перевірений на відповідність профілю Tiny PS, і сертифікат знака із зазначенням його типу, доменів і строку дії. Передайте ?domain=example.com, а для селектора, відмінного від default, також &selector=.

GET/api/v1/tools/ptr

PTR-записи адреси та те, чи вказує будь-яке з цих імен назад на неї. Невдалий пошук дає статус error; відсутній запис дає статус fail. Передайте ?ip=8.8.8.8.

GET/api/v1/tools/mta-sts

MTA-STS-запис домену та файл політики, на який він указує: режим, перелічені хости й усі MX-хости, які не охоплює політика. Передайте ?domain=example.com.

GET/api/v1/tools/tls-rpt

TLS-RPT-запис домену й адреси, які отримують його звіти. Передайте ?domain=example.com.

GET/api/v1/tools/dnssec

Чи є зона домену підписаною, непідписаною або несправною, згідно з її записами DNSKEY і DS. Некоректний підпис відрізняється від збою резолвера. Передайте ?domain=example.com.

GET/api/v1/tools/dane

TLSA-записи MX-хостів, зіставлені із сертифікатом, який надає хост, якщо цей сертифікат вдалося прочитати. Передайте ?domain=example.com.

GET/api/v1/tools/smtp

STARTTLS і сертифікат на перших двох MX-хостах: версія TLS, видавець, дата завершення строку дії й те, чи є ланцюжок та ім’я дійсними. Ми підключаємося лише до хостів у домені, про який ви запитали, і пропускаємо поштових провайдерів, а один результат для кожної адреси використовується протягом 6 годин. Пошта не надсилається. Передайте ?domain=example.com.

GET/api/v1/tools/ns

Сервери імен домену й те, чи має його зона запис SOA. Один сервер імен є попередженням. Передайте ?domain=example.com.

GET/api/v1/tools/registration

Коли закінчується реєстрація домену, за даними RDAP. Якщо залишилося менш ніж 30 днів, це є попередженням. Зона без служби RDAP отримує результат skipped. Передайте ?domain=example.com.

POST/api/v1/tools/header

Заголовки отриманого повідомлення, надіслані як JSON {"headers": "..."} або як text/plain: маршрут переход за переходом із затримками, TLS і розбіжністю годинників, власний Authentication-Results одержувача, вирівнювання доменів From, DKIM d= і Return-Path, а також заголовки DKIM, ARC, відписки та спам-фільтра. Усе після першого порожнього рядка відкидається без читання. Заголовки обробляються в пам’яті та не зберігаються, не кешуються й не записуються в журнал.

Перевіряйте домен щоночі.
Тестуйте лист перед відправленням.

Спільне для всіх продуктів

Доступ, ключі, формат звіту, статуси, помилки, а також OpenAPI і llms.txt для машин.

Автентифікація

Її немає. Не потрібно запитувати ключ, задавати заголовок чи створювати обліковий запис. Отриманий слаг є засобом доступу: кожен, хто має його, може прочитати цей звіт, а ніхто інший не може його вгадати.

Це також означає, що слаг варто захищати як пароль. Звіт показує тему, відправника, адресу для повернення та повний вихідний код повідомлення кожному, хто має посилання.

Особисті ключі API

Everything above works without a key. A key is for automation platforms such as Zapier, where every user's calls come from the platform's servers and per-IP limits would be shared by all of them. With a key, limits count per key (50 tests a day, 3 with placement, 5 permanent mailboxes), the key's tests form a history, and the key can keep permanent mailboxes whose reports only it can read. Send the key as Authorization: Bearer est_live_… on any call on this page. The routes below also take account, a short name of your choosing ([A-Za-z0-9_-], up to 64 characters) that keeps separate lists under one key. GET /api/v1/installations/tests requires it; pass the same one on POST /api/v1/inbox so the test shows up there. The Zapier integration uses zapier.

POST /api/v1/keys

Send JSON {"email":"you@example.com"}. Returns HTTP 201 with key and email. The key is shown once; only its hash is kept. Asking again gives a new key and leaves the earlier ones working. Limit: 5 keys per IP per UTC day. The form on /zapier/ calls this.

GET /api/v1/keys/me

Returns email, key_prefix and created_at of the key in the header, or HTTP 401. Use it to check a key.

GET /api/v1/installations/tests

The key's tests, newest first: ?account=…&limit=50 (up to 100), and before=<slug> for the next page. Each item has slug, created_at, analysis_status (waiting or expired before an email arrived), score_ours, score_compat, placement and changes, the checks that moved since the previous test of the same sending domain. Read the full report at /api/v1/tests/{slug}.

POST /api/v1/installations/mailboxes

Send JSON {"domain":"example.com","account":"…"}. Returns the permanent mailbox of that sending domain: id, address, domain, state, daily_cap and created. HTTP 201 when it is new, 200 when it already existed, 409 when the key keeps as many mailboxes as it may. Subscribe the address to a newsletter or a sequence and every email that arrives is checked. GET on the same path with ?account=… lists them, and DELETE /api/v1/installations/mailboxes/{mailbox_id} stops one.

GET /api/v1/installations/mailboxes/{mailbox_id}/letters

The emails that arrived, oldest first, paged with after_id and next_after_id. settled=true ends the page before the first email still being checked, so paging never skips one. newest=true turns the order round, for a quick look at the latest; settled does nothing with it. Each has test_id, slug, received_at, analysis_status, score_ours, score_compat, subject, from_addr and kind.

GET /api/v1/installations/letters/{slug}

The report of one email in a permanent mailbox, the same JSON as /api/v1/tests/{slug} with report_url null: there is no public page for it. HTTP 410 once the report has expired.

Читання звіту

Поля, що містять відповідь, у порядку, у якому вони вам, імовірно, потрібні.

score_oursВід 0 до 100. Наша модель. Автентифікація та інфраструктура мають найбільшу вагу, оскільки вони визначають доставку ще до того, як фільтр прочитає текст повідомлення.
score_compatВід 0 до 10. Відтворює число у стилі SpamAssassin, з яким користувачі вже звикли порівнювати, тому звіт можна зіставити з тим, що хтось бачив деінде.
subscoresТа сама шкала від 0 до 100 для кожного розділу: auth, infra_spam, content, compliance.
checks[]Усі 42, кожна зі статусом, коротким висновком в один рядок, доказами, на основі яких її визначено, і тим, як вона вплинула на дві оцінки.
checks[].citationsЗвідки походить висновок: розділ RFC, процитований дослівно, і сторінка, де Google зазначає власну вимогу. Підібрано вручну, а не згенеровано, тому на них можна покладатися.
fixes[]Що змінити, у якому порядку та скільки балів дає кожна зміна. Приріст обчислюється повторним оцінюванням звіту, а не приблизно.
completeFalse, якщо перевірку не вдалося виконати. Неперевірений пункт ніколи не вважається пройденим, тому вважайте оцінку оптимістичною, доки це значення не стане 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Досягнуто ліміту безкоштовних тестів для вашої адреси. Зараз у цьому сервісі немає ліміту на особу; якщо його колись установлять, у тілі буде вказано, коли його буде скинуто.

Чотири важливі речі

Одне повідомлення на адресу

Друге повідомлення відхиляється. Ваш попередній звіт залишається без змін, у цьому й суть.

Година на використання

Термін дії адреси спливає; звіту ні. Посилання на звіти постійні, тому посилання, вставлене в заявку, продовжує працювати.

Надсилайте з платформи

Тестування кампанії з особистого облікового запису оцінює цей обліковий запис. Майже все в розділі автентифікації стосується інфраструктури надсилання, а не тексту.

Повторіть тест після виправлення

Очікувані покращення обчислюються для кожного виправлення окремо й не складаються. Другий звіт показує достовірне значення.

Для машин

GET/api/health

Перевірка працездатності. Без автентифікації, без побічних ефектів.

Спочатку спробуйте один раз вручну

Це займає близько хвилини й показує, що саме описує JSON.

Отримати тестову адресу

Пісочниця.

Кожна кінцева точка має кнопку, яка запускає її в реальному сервісі. Тут ключ не потрібен, тому запит, який ви надсилаєте з цієї сторінки, є справжнім: він резервує справжню адресу та враховується.

Спробувати в пісочниці