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"}]
}Wybierz to, czego potrzebujesz
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.
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" }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.comOdpytuj 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.
| lang | Ję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_campaign | Przekazywane 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.
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.
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
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"} ] } }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>, ...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
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'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"} ] } }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)'
| domain | Wymagane. Przyjmuje to, co przyjmują narzędzia: domenę, URL, adres e-mail. |
| ip | Twój adres wysyłający. Powtórz go, aby podać więcej adresów, maksymalnie 6. |
| selector | Selektor 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. |
| helo | Nazwa, którą twój serwer podaje w HELO, porównana z jego rekordem PTR. |
| account | Kogo dotyczy żądanie. Wymagane z kluczem obsługującym wiele osób. |
| checks | Sekcje do uruchomienia, rozdzielone przecinkami. Domyślnie wszystkie. |
| diff | true porównuje to uruchomienie z twoim ostatnim uruchomieniem dla domeny. |
| since | 7d, 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. |
| baseline | Identyfikator jednego z twoich uruchomień, z którym ma zostać wykonane porównanie. Włącza diff. |
| fresh | true 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
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'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
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ąć.
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_ours | Od 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_compat | Od 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. |
| subscores | Ta 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[].citations | Ską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. |
| kompletne | Fał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_raportu | Strona 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.
| zaliczony | Test został wykonany i nie wykrył żadnych problemów. |
| ostrzeżenie | Warto naprawić. Kosztuje punkty. |
| niezaliczony | Moż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łąd | Nie 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
| 202 | Adres 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ć. |
| 404 | Brak takiego identyfikatora. Nigdy nie istniał albo rezerwacja została zapomniana. |
| 410 | Adres wygasł przed nadejściem wiadomości. |
| 409 | Podjęto próbę zmiany języka po nadejściu wiadomości. |
| 429 | Limit 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
- /api/openapi.json Opis OpenAPI wygenerowany z tego samego kodu, który obsługuje API.
- /llms.txt, /llms-full.txt Krótka mapa tej witryny dla modeli językowych, zgodna z konwencją llms.txt, oraz dłuższa wersja z całym cyklem i polami raportu w jednym pliku.
- /mcp Serwer MCP o tych samych możliwościach i z oczekiwaniem blokującym, które jest lepsze niż odpytywanie z wnętrza modelu.
- For agents Strona dla agenta: kiedy z tego skorzystać, jak odróżnić pominiętą kontrolę od zakończonej powodzeniem i które ustalenia są rekordami DNS wymagającymi zmiany przez człowieka, a nie tekstem, który agent może edytować.
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