Email Spam Tester

API kontroli spamu: e-mail,
skrzynka odbiorcza i domena

Wyślij nam jedną prawdziwą wiadomość lub podaj tylko domenę. Wszystkie odpowiedzi przychodzą w formacie JSON.

Bez klucza, bez konta.

Żądanie

# 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'

Odpowiedź

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}]
}

Żądanie

# 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'

Odpowiedź

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"}
  ]}
}

Żądanie

# 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'

Odpowiedź

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"}]
}
Na tej stronie

Test wiadomości e-mail

Czytamy jedną prawdziwą wiadomość od początku do końca: treść, podpis, nagłówki i serwer, który ją wysłał. Otrzymujesz wynik, listę poprawek i wszystkie kontrole, na których się opierają.

Szybki start

Trzy wywołania. Bez klucza, bez konta, bez rejestracji. Dwa żądania i jedna wiadomość e-mail. Trzecie wywołanie jest potrzebne tylko dlatego, że analiza trwa kilka sekund.

  1. Zarezerwuj adres

    Wyślij żądanie POST do punktu końcowego skrzynki odbiorczej. Otrzymasz adres, który przyjmuje dokładnie jedną wiadomość i wygasa po godzinie, oraz identyfikator, z którym powiązane są wszystkie pozostałe dane.

    Żądanie

    # 1. reserve a single-use address
    curl -sX POST 'https://email-spam-tester.com/api/v1/inbox?lang=en'

    Odpowiedź

    {
      "address": "test-<slug>@t.email-spam-tester.com",
      "slug": "<slug>",
      "expires_at": "2026-01-01T12:00:00Z"
    }
  2. Wyślij na niego rzeczywistą wiadomość

    Przez SMTP, z platformy, która wyśle kampanię. Połowa kontroli odczytuje nagłówki dodawane przez platformę wysyłającą, więc wiadomość utworzona ręcznie mierzy niewłaściwe rzeczy.

    Żądanie

    # 2. send your message to that address, from your own platform
    To: test-<slug>@t.email-spam-tester.com
  3. Odpytuj o status, a następnie odczytaj raport

    Punkt końcowy statusu zwraca kilkaset bajtów i informuje, czy warto już pobrać pełny raport. Sam raport ma kilka tysięcy wierszy.

    Żądanie

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

    Odpowiedź

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

    Żądanie

    # 4. read the report once analysis_status is checks_ready
    curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>'

    Odpowiedź

    {
      "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"}}
      ]
    }

Zarezerwuj adres, wyślij wiadomość, którą zamierzasz wysłać do swojej listy, odczytaj raport. Wszystko, co pokazuje strona, znajduje się w JSON, w tym wynik, wszystkie kontrole (42) wraz z dowodami oraz sekcja standardu, na której opiera się każde ustalenie.

Pierwsze 100 000 raportów jest bezpłatnych, bez klucza i bez konta. Jeśli konfigurujesz agenta, a nie skrypt, serwer MCP jest lepszym rozwiązaniem niż odpytywanie.

Punkty końcowe

Adres bazowy https://email-spam-tester.com. Wszystko zwraca JSON.

POST/api/v1/inbox

Rezerwuje adres jednorazowego użytku. Oba parametry są opcjonalne.

langJęzyk, w którym zostaną napisane plan naprawczy i wyniki poszczególnych testów, podany jako kod ISO. Jest ustalany teraz, ponieważ wiadomość dociera przez SMTP kilka minut później i nie zawiera żadnej wskazówki, kto na nią czeka. Nieznany kod powoduje użycie języka angielskiego.
utm_source, utm_medium, utm_campaignPrzekazywane do naszych narzędzi analitycznych. Przydatne, jeśli mierzysz własną integrację.

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

Niewielki koszt odpytywania. Zwraca dwa pola stanu oraz postęp testów i nic więcej.

Odpytuj ten punkt zamiast raportu. analysis_status najpierw osiąga checks_ready, a plan AI pojawia się w ai_status około minuty później, więc klient, który potrzebuje tylko deterministycznych testów, nie musi czekać na plan.

GET/api/v1/tests/{slug}

Cały raport. Zwraca 202, gdy adres jest zarezerwowany i nic jeszcze nie dotarło, oraz 200, gdy wiadomość już dotarła.

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

Wiadomość dokładnie w postaci, w jakiej została dostarczona: każdy nagłówek w kolejności przesłania, obie treści, lista załączników i surowe źródło. Jest pobierana osobno, ponieważ raport jest odpytywany, a ta odpowiedź może mieć rozmiar do megabajta.

Surowa wiadomość jest usuwana zgodnie z własnym harmonogramem, wcześniej niż raport. Po tym czasie ten endpoint zwraca powód zamiast źródła.

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

Zmienia język rezerwacji, która nie została jeszcze użyta. Dla agenta, który dowiaduje się, w jakim języku czyta jego użytkownik, po tym, jak poprosił już o adres. Żądanie jest odrzucane po nadejściu wiadomości, ponieważ analiza już wtedy trwa.

Umieszczenie w skrzynce odbiorczejBeta

Wyślij jedną wiadomość na listę testowych skrzynek odbiorczych i sprawdź, gdzie trafiła w Gmailu, Outlooku, Yahoo i u innych dostawców: do Odebranych, Ofert lub Spamu.

Szybki start

  1. Utwórz test

    Wyślij żądanie POST do punktu końcowego placement. Otrzymasz znacznik i testowe skrzynki odbiorcze.

    Żądanie

    # 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}'

    Odpowiedź

    {
      "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. Wyślij wiadomość do każdej skrzynki

    Umieść znacznik w temacie i wyślij wiadomość ze swojej zwykłej platformy na wszystkie adresy jednocześnie.

    Żądanie

    # 2. one message to every address, with the marker in the subject
    Subject: October invoice est-3f9a1c7e2b4d6a80c5e1f2d3
    To: <seed>, <mailbox>, ...
  3. Odpytuj o foldery

    Dla każdego adresu pojawi się dostawca i folder. Odpytuj, aż status przestanie mieć wartość waiting.

    Żądanie

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

    Odpowiedź

    {
      "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"}
        ]
      }
    }

Punkty końcowe

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.

Sprawdzanie infrastruktury

Jedno żądanie GET sprawdza konfigurację poczty domeny bez wysyłania czegokolwiek, zachowuje wynik i informuje cię, co zmieniło się od ostatniego uruchomienia. Klucz nie jest potrzebny. W cron poniższy wiersz kończy działanie z kodem różnym od zera, gdy domena jest uszkodzona lub jej konfiguracja zmieniła się w istotny sposób.

Szybki start

  1. Wykonaj jedno żądanie GET

    Przekaż domenę. ip dodaje twoje adresy wysyłające, a selector określa selektory DKIM do odczytania.

    Żądanie

    curl -s 'https://email-spam-tester.com/api/v1/infra/check?domain=example.com&selector=mail&diff=true'
  2. Odczytaj werdykt

    ok to odpowiedź dla skryptu, a sections pokazuje, która część zakończyła się niepowodzeniem.

    Odpowiedź

    {
      "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. Dodaj to do crona

    Z diff=true każde uruchomienie jest porównywane z poprzednim, a jq zamienia odpowiedź na kod wyjścia.

    Żądanie

    # 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)'
domainWymagane. Przyjmuje to, co przyjmują narzędzia: domenę, URL, adres e-mail.
ipTwój adres wysyłający. Powtórz go, aby podać więcej adresów, maksymalnie 6.
selectorSelektor DKIM. Powtórz go, aby podać więcej selektorów, maksymalnie 10. Każdy przekazany selektor musi istnieć, inaczej sekcja dkim kończy się niepowodzeniem.
heloNazwa, którą twój serwer podaje w HELO, porównana z jego rekordem PTR.
accountKogo dotyczy żądanie. Wymagane z kluczem obsługującym wiele osób.
checksSekcje do uruchomienia, rozdzielone przecinkami. Domyślnie wszystkie.
difftrue porównuje to uruchomienie z twoim ostatnim uruchomieniem dla domeny.
since7d, 12h lub data w formacie ISO 8601. Porównuje z twoim uruchomieniem najbliższym temu momentowi w ciągu 12 godzin, a jeśli takiego nie ma, z ostatnim wcześniejszym. Włącza diff.
baselineIdentyfikator jednego z twoich uruchomień, z którym ma zostać wykonane porównanie. Włącza diff.
freshtrue pomija 60-sekundową pamięć podręczną.

Odczytywanie odpowiedzi

Zakończone sprawdzenie odpowiada kodem 200, a werdykt znajduje się w treści odpowiedzi. status jest najgorszym wynikiem wymaganych sekcji: spf, dkim, dmarc, ptr, blocklist_ip, blocklist_domain, mx i smtp. unknown w wymaganej sekcji liczy się jako warn. ok ma wartość true, gdy status to pass lub warn. score mieści się w zakresie od 0 do 100 dla wymaganych sekcji, które zwróciły odpowiedź, i ma wartość null, gdy błędy i wyniki unknown pozostawiają mniej niż połowę mającej zastosowanie wagi. mta_sts, tls_rpt, bimi, dnssec, dane, ns i registration są raportowane i porównywane, ale nie wpływają na ok ani score.

Sekcja może mieć wynik pass, warn, fail, error (nie mogliśmy sprawdzić), unknown (za mało danych) lub skipped (nie ma zastosowania). skipped nie wpływa na wynik, a przyczyna znajduje się w not_checked. dkim_signature i alignment są zawsze obecne, ponieważ wymagają prawdziwej wiadomości.

Co zmieniają ip i selector

PTR i listy blokad dotyczą adresów, więc uruchomienie ich potrzebuje. Używa wartości ip, które przekażesz. Jeśli ich nie ma, pobiera maksymalnie cztery z hostów MX oraz z terminów ip4: i ip6: zawierających pojedynczy adres w głównym rekordzie SPF. Adresy znanego dostawcy poczty są oznaczane jako managed i pozostawiane bez sprawdzenia, a jeśli nic nie zostanie, ptr i blocklist_ip zwracają skipped. Wartości selector nie można odczytać z DNS, więc uruchomienie sprawdza twoją wartość, wartości znalezione przez twoje wcześniejsze uruchomienia oraz listę popularnych nazw. Nieznalezienie niczego niczego nie dowodzi, a dkim zwraca unknown. Jeśli wysyłasz z własnego serwera, przekaż oba.

Co się zmieniło

Każdy wpis w diff.changes ma path, kind (added, removed, changed), severity (critical, warning, info) oraz effect (worsened, improved, neutral). Tylko critical i warning ustawiają diff.changed, więc zmiana klucza DKIM na klucz tej samej długości, nowy adres MX lub odnowiony certyfikat nie powodują niepowodzenia wiersza cron. diff.worsened odzwierciedla effect dowolnej zmiany. Przy pierwszym uruchomieniu nie ma z czym porównywać i wskazuje na to diff.first_run.

Punkt odniesienia jest zawsze jednym z twoich uruchomień, więc sprawdzenie domeny przez kogoś innego między twoimi dwoma uruchomieniami niczego nie ukrywa. Wszystko, czego tym razem nie mogliśmy odczytać, trafia do diff.not_compared z zachowaniem ostatniej znanej wartości, co oznacza, że zmiana wprowadzona podczas awarii pojawi się, gdy wyszukiwanie znów zadziała. Uruchomienie z inną wartością ip lub selector pozostaje w tej samej serii, a to, czego nie obejmowało, również nie jest porównywane.

Dlaczego zaplanowane sprawdzenie powinno używać klucza

Bez klucza twoja historia należy do skrótu twojego adresu IP utworzonego z kluczem, więc kończy się, gdy adres się zmienia, a osoby korzystające z jednego adresu współdzielą ją: uruchomienie współpracownika zmienia twój punkt odniesienia. Z osobistym kluczem API w Authorization: Bearer historia jest przypisana do klucza. Uruchomienia z kluczem są przechowywane przez 365 dni i można je otworzyć tylko przy użyciu tego klucza. Uruchomienia bez klucza są przechowywane przez 30 dni i może je otworzyć każdy, kto ma ich id.

6 żądań na minutę i 50 dziennie na IP albo 30 i 500 na klucz. Po przekroczeniu limitu odpowiedź ma kod 429 i nagłówek Retry-After. Identyczne żądanie w ciągu 60 sekund pochodzi z pamięci podręcznej, jest oznaczone jako cached: true, nie zapisuje uruchomienia i nie wlicza się do limitu. Odczytywanie zapisanych uruchomień pozwala na 120 żądań na minutę na klienta. Kod 503 z Retry-After oznacza, że działa zbyt wiele sprawdzeń albo, podczas odczytywania zapisanych uruchomień, że pamięć danych jest niedostępna. Kod 401 oznacza nieprawidłowy klucz. Kod 422 zawiera detail.code: invalid_domain, invalid_ip, invalid_selector, invalid_check, invalid_since, unknown_baseline lub account_required.

Punkty końcowe

GET/api/v1/infra/check

Uruchamia test. Parametry znajdują się w tabeli powyżej.

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

Jeden zapisany przebieg, w całości. 404, jeśli nie istnieje lub należy do innego klucza.

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

Twoje przebiegi dla domeny, od najnowszego: identyfikator, czas, status, wynik i liczba zmian. Przyjmuje limit (od 1 do 100, domyślnie 30) oraz before, identyfikator przebiegu.

GET/api/v1/infra/diff

To samo porównanie między dwoma zapisanymi przebiegami, ?from=<id>&to=<id>. Potrzebujesz dostępu do obu.

GET/api/v1/infra/checks

Każda sekcja z jej wagą, wersją punktacji i limitami.

Pojedyncze kontrole

Każde wywołanie odpowiada na jedno pytanie i nie przechowuje historii. Narzędzie samodzielnie wykonuje jedną część kontroli infrastruktury, z wyjątkiem narzędzia nagłówków, które odczytuje wiadomość, którą już masz.

Szybki start

  1. Wybierz kontrolę

    Wybierz narzędzie z poniższej listy i przekaż domenę, adres lub IP, o które prosi.

    Żądanie

    curl -s 'https://email-spam-tester.com/api/v1/tools/spf?domain=example.com'
  2. Odczytaj status i ustalenia

    Każde narzędzie zwraca status i ustalenia. Następujące po nich pola zależą od narzędzia.

    Odpowiedź

    {
      "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}
    }

Punkty końcowe

Wszystkie odpowiadają kodem 200 ze statusem i listą ustaleń, z których każde ma kod i jego parametry. Status to pass, warn, fail lub error, a narzędzie współdzielone ze sprawdzaniem infrastruktury może także odpowiedzieć unknown lub skipped. Wyszukiwanie, które przekroczyło limit czasu, lub lista, która odrzuciła zapytanie, nigdy nie jest uznawana za pass. 30 żądań na minutę i 300 dziennie na IP łącznie dla wszystkich narzędzi; po przekroczeniu limitu odpowiedź ma kod 429 i nagłówek Retry-After.

GET/api/v1/tools/spf

Rekord SPF domeny: jego składnia, każde przeanalizowane include i redirect oraz liczba wyszukiwań DNS wykorzystanych przez całe drzewo w odniesieniu do limitu dziesięciu. Przekaż ?domain=example.com.

GET/api/v1/tools/dmarc

Rekord DMARC domeny lub jej domeny organizacyjnej, jeśli nie ma własnego rekordu: tagi, polityka oraz informacja, czy każdy zewnętrzny adres do raportowania zgodził się przyjmować raporty. Przekaż ?domain=example.com.

GET/api/v1/tools/dkim

Klucz DKIM opublikowany dla selektora: czy istnieje i może zostać zdekodowany, jego typ i rozmiar oraz flagi unieważnienia i testowania. Przekaż ?domain=example.com&selector=s1.

GET/api/v1/tools/blocklist

Adres IPv4, adres IPv6 lub domena sprawdzone na listach blokujących DNS używanych przez raport, wraz z odpowiedzią każdej listy. Przekaż ?target=203.0.113.5.

GET/api/v1/tools/mx

Rekordy MX domeny w kolejności, w której nadawcy próbują ich używać, wraz z adresami IPv4 i IPv6 każdego hosta. Zgłaszane są Null MX, domena bez MX, hosty będące adresami IP lub rekordami CNAME oraz hosty, których nazw nie można rozwiązać, a także rekordy MTA-STS i TLS-RPT. Przekaż ?domain=example.com.

GET/api/v1/tools/bimi

Konfiguracja BIMI domeny w czterech krokach: polityka DMARC wymagana przez BIMI, rekord w default._bimi, logo SVG sprawdzone pod kątem profilu Tiny PS oraz certyfikat znaku wraz z jego typem, domenami i datą wygaśnięcia. Przekaż ?domain=example.com oraz &selector= dla selektora innego niż default.

GET/api/v1/tools/ptr

Rekordy PTR adresu oraz informacja, czy którakolwiek z tych nazw wskazuje z powrotem na ten adres. Nieudane wyszukiwanie daje status error; brak rekordu daje status fail. Przekaż ?ip=8.8.8.8.

GET/api/v1/tools/mta-sts

Rekord MTA-STS domeny i plik polityki, na który wskazuje: tryb, wymienione hosty oraz każdy host MX pominięty przez politykę. Przekaż ?domain=example.com.

GET/api/v1/tools/tls-rpt

Rekord TLS-RPT domeny i adresy, które otrzymują jego raporty. Przekaż ?domain=example.com.

GET/api/v1/tools/dnssec

Czy strefa domeny jest podpisana, niepodpisana czy uszkodzona, na podstawie jej rekordów DNSKEY i DS. Nieprawidłowy podpis jest odróżniany od awarii resolvera. Przekaż ?domain=example.com.

GET/api/v1/tools/dane

Rekordy TLSA hostów MX, porównane z certyfikatem przedstawianym przez host, jeśli ten certyfikat można było odczytać. Przekaż ?domain=example.com.

GET/api/v1/tools/smtp

STARTTLS i certyfikat na pierwszych dwóch hostach MX: wersja TLS, wystawca, data wygaśnięcia oraz informacja, czy łańcuch i nazwa są prawidłowe. Łączymy się tylko z hostami w domenie, o którą pytasz, i pomijamy dostawców poczty, a jeden wynik dla każdego adresu jest współdzielony przez 6 godzin. Żadna wiadomość nie jest wysyłana. Przekaż ?domain=example.com.

GET/api/v1/tools/ns

Serwery nazw domeny oraz informacja, czy jej strefa ma rekord SOA. Jeden serwer nazw oznacza ostrzeżenie. Przekaż ?domain=example.com.

GET/api/v1/tools/registration

Kiedy wygasa rejestracja domeny, według RDAP. Mniej niż 30 pozostałych dni oznacza ostrzeżenie. Strefa bez usługi RDAP zwraca status skipped. Przekaż ?domain=example.com.

POST/api/v1/tools/header

Nagłówki odebranej wiadomości, wysłane jako JSON {"headers": "..."} lub jako text/plain: trasa krok po kroku wraz z opóźnieniami, TLS i odchyleniem zegara, własny nagłówek Authentication-Results odbiorcy, zgodność domen From, DKIM d= i Return-Path oraz nagłówki DKIM, ARC, rezygnacji z subskrypcji i filtrów spamu. Wszystko po pierwszym pustym wierszu jest odrzucane bez odczytywania. Nagłówki są przetwarzane w pamięci i nie są przechowywane, umieszczane w pamięci podręcznej ani rejestrowane.

Sprawdzaj domenę każdej nocy.
Przetestuj e-mail przed wysłaniem.

Wspólne dla każdego produktu

Dostęp, klucze, format raportu, statusy, błędy oraz OpenAPI i llms.txt dla maszyn.

Uwierzytelnianie

Nie ma żadnego. Nie trzeba uzyskiwać klucza, ustawiać nagłówka ani tworzyć konta. Zwrócony slug jest uprawnieniem: każdy, kto go posiada, może odczytać ten raport, a nikt inny nie może go odgadnąć.

Oznacza to również, że slug należy traktować jak hasło. Raport pokazuje temat, nadawcę, adres zwrotny i pełne źródło wiadomości każdemu, kto ma link.

Osobiste klucze 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.

Odczytywanie raportu

Pola zawierające odpowiedź, w kolejności, w której prawdopodobnie będą potrzebne.

score_oursOd 0 do 100. Nasz model. Uwierzytelnianie i infrastruktura mają największą wagę, ponieważ decydują o dostarczeniu, zanim filtr przeczyta choćby jedno słowo treści.
score_compatOd 0 do 10. Odtwarza wartość w stylu SpamAssassin, z którą użytkownicy już porównują wyniki, dzięki czemu raport można porównać z tym, co ktoś zobaczył gdzie indziej.
subscoresTa sama skala od 0 do 100 dla każdej sekcji: auth, infra_spam, content, compliance.
checks[]Wszystkie 42, każda ze statusem, jednowierszowym wynikiem, dowodami, na podstawie których podjęto decyzję, oraz wpływem na obie oceny.
checks[].citationsSkąd pochodzi ustalenie: sekcja RFC, zacytowana dosłownie, oraz strona, na której Google określa własne wymaganie. Opracowane ręcznie, a nie wygenerowane, więc można na nich polegać.
poprawki[]Co zmienić, w odpowiedniej kolejności, wraz z liczbą punktów przypisaną każdej zmianie. Korzyści są obliczane przez ponowne wyznaczenie wyniku raportu, a nie szacowane.
kompletneFałsz, gdy nie można było wykonać testu. Niesprawdzony element nigdy nie jest zaliczony, więc traktuj wynik jako optymistyczny, dopóki ta wartość nie będzie prawdziwa.
adres_url_raportuStrona czytelna dla człowieka. Przekaż ją osobie zamiast ściany tekstu JSON.

Statusy

Test ma jeden z pięciu statusów, a różnica między dwoma z nich ma większe znaczenie, niż się wydaje.

zaliczonyTest został wykonany i nie wykrył żadnych problemów.
ostrzeżenieWarto naprawić. Kosztuje punkty.
niezaliczonyMoże uniemożliwić dostarczenie. Kosztuje więcej punktów.
pomińNie dotyczyło. Brak załączników do przeskanowania, brak części HTML do oceny. To nie jest wynik pozytywny.
błądNie udało nam się tego ustalić. Wykluczono z punktacji i oznaczono, zamiast uznać za wynik pozytywny.

analysis_status przyjmuje wartości received, analyzing, checks_ready, failed. ai_status przyjmuje wartości pending, running, ready, fallback, error. Raport deterministyczny jest ostateczny przy checks_ready; ai_status jedynie dodaje plan.

Co może zostać zwrócone

202Adres jest zarezerwowany i żadna wiadomość jeszcze nie dotarła. Treść zawiera adres, termin wygaśnięcia i język, więc klient, który nie utworzył rezerwacji, nadal może je wyświetlić.
404Brak takiego identyfikatora. Nigdy nie istniał albo rezerwacja została zapomniana.
410Adres wygasł przed nadejściem wiadomości.
409Podjęto próbę zmiany języka po nadejściu wiadomości.
429Limit bezpłatnych testów dla Twojego adresu. Obecnie w tej usłudze nie ma limitu na osobę; jeśli kiedykolwiek zostanie ustawiony, treść podaje, kiedy zostanie zresetowany.

Cztery rzeczy, które warto wiedzieć

Jedna wiadomość na adres

Druga zostanie odrzucona. Wcześniejszy raport pozostanie bez zmian, o co właśnie chodzi.

Godzina na użycie

Adres wygasa; raport nie. Łącza do raportów są trwałe, więc łącze wklejone do zgłoszenia nadal działa.

Wysyłaj z platformy

Testowanie kampanii z konta osobistego mierzy to konto. Prawie wszystko w sekcji uwierzytelniania dotyczy infrastruktury wysyłającej, a nie tekstu.

Przetestuj ponownie po poprawkach

Oczekiwane korzyści są obliczane dla każdej poprawki z osobna i nie sumują się. Drugi raport podaje rzeczywisty wynik.

Dla maszyn

GET/api/health

Kontrola aktywności. Bez uwierzytelniania, bez skutków ubocznych.

Najpierw wypróbuj ręcznie

Zajmuje to około minuty i pokazuje dokładnie to, co opisuje JSON.

Uzyskaj adres testowy

Środowisko testowe.

Każdy endpoint ma przycisk, który uruchamia go w aktywnej usłudze. Nic tutaj nie wymaga klucza, więc żądanie wysłane z tej strony jest rzeczywiste: rezerwuje rzeczywisty adres i jest zliczane.

Wypróbuj w środowisku testowym