API de verificare a spamului:
e-mail, inbox și domeniu
Trimite-ne un singur mesaj real sau dă-ne doar un domeniu. Toate răspunsurile sunt în JSON.
Fără cheie, fără cont.
Cerere
# 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'
Răspuns
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}]
}Cerere
# 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'
Răspuns
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"}
]}
}Cerere
# 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'
Răspuns
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"}]
}Alege ce îți trebuie
Pe această pagină
Test de e-mail
Citim integral un mesaj real: conținutul, semnătura, anteturile și serverul care l-a trimis. Primești un scor, o listă de remedieri și toate verificările pe care se bazează.
Pornire rapidă
Trei apeluri. Fără cheie, fără cont, fără înregistrare. Două cereri și un e-mail. Al treilea apel există doar pentru că analiza durează câteva secunde.
Rezervă o adresă
Trimite o cerere POST către endpointul inbox. Primești o adresă care acceptă exact un mesaj și expiră într-o oră, împreună cu identificatorul slug pe baza căruia este indexat tot restul.
Cerere
# 1. reserve a single-use address curl -sX POST 'https://email-spam-tester.com/api/v1/inbox?lang=en'Răspuns
{ "address": "test-<slug>@t.email-spam-tester.com", "slug": "<slug>", "expires_at": "2026-01-01T12:00:00Z" }Trimite-i mesajul real
Prin SMTP, de pe platforma care va trimite campania. Jumătate dintre verificări citesc anteturile adăugate de platforma de trimitere, astfel încât un mesaj compus manual măsoară altceva.
Cerere
# 2. send your message to that address, from your own platform To: test-<slug>@t.email-spam-tester.comInteroghează starea, apoi citește raportul
Endpointul de stare are câteva sute de octeți și îți spune dacă merită să preiei deja raportul complet. Raportul propriu-zis are câteva mii de linii.
Cerere
# 3. poll curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>/status'Răspuns
{ "slug": "<slug>", "analysis_status": "checks_ready", "ai_status": "running", "checks_done": 42, "checks_total": 42 }Cerere
# 4. read the report once analysis_status is checks_ready curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>'Răspuns
{ "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"}} ] }
Rezervă o adresă, trimite mesajul pe care urma să îl trimiți listei tale, citește raportul. Tot ce afișează pagina se află în JSON, inclusiv scorul, toate cele 42 de verificări cu dovezile lor și secțiunea standardului pe care se bazează fiecare constatare.
Primele 100.000 de rapoarte sunt gratuite, fără cheie și fără cont. Dacă integrezi un agent în locul unui script, serverul MCP este mai potrivit decât interogarea periodică.
Endpointuri
Adresa de bază https://email-spam-tester.com. Totul răspunde cu JSON.
POST/api/v1/inbox
Rezervă o adresă de unică folosință. Ambii parametri sunt opționali.
| lang | Limba în care vor fi scrise planul de remediere și constatările pentru fiecare verificare, sub forma unui cod ISO. Este stabilită acum deoarece mesajul sosește prin SMTP câteva minute mai târziu și nu conține niciun indiciu despre cine îl așteaptă. Pentru un cod necunoscut se folosește implicit engleza. |
| utm_source, utm_medium, utm_campaign | Transmise către sistemul nostru de analiză. Util dacă îți măsori propria integrare. |
GET/api/v1/tests/{slug}/status
Poate fi interogat frecvent. Returnează cele două câmpuri de stare și progresul verificărilor, fără nimic altceva.
GET/api/v1/tests/{slug}
Raportul complet. Răspunde cu 202 cât timp adresa este rezervată și încă nu a sosit nimic, apoi cu 200 după ce mesajul a sosit.
GET/api/v1/tests/{slug}/message
Mesajul exact așa cum a fost livrat: fiecare antet în ordinea transmisiei, ambele corpuri, lista atașamentelor și sursa brută. Este preluat separat deoarece raportul este interogat periodic, iar acesta poate ajunge la un megabyte.
PUT/api/v1/tests/{slug}/locale
Schimbă limba unei rezervări care nu a fost încă utilizată. Pentru un agent care află ce limbă citește utilizatorul său după ce a solicitat deja adresa. Refuzată după sosirea mesajului, deoarece până atunci analiza este în curs.
Plasare în inboxBeta
Trimite un mesaj către o listă de căsuțe de primire de test și vezi unde a ajuns la Gmail, Outlook, Yahoo și alți furnizori: Mesaje primite, Promoții sau Spam.
Pornire rapidă
Creează un test
Trimite o cerere POST către endpointul de plasare. Primești un marcaj și inboxurile de test.
Cerere
# 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}'Răspuns
{ "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"} ] } }Trimite un mesaj către fiecare inbox
Pune marcajul în subiect și trimite de pe platforma ta obișnuită, către toate adresele dintr-o singură trimitere.
Cerere
# 2. one message to every address, with the marker in the subject Subject: October invoice est-3f9a1c7e2b4d6a80c5e1f2d3 To: <seed>, <mailbox>, ...Interoghează folderele
Fiecare adresă se completează cu furnizorul și folderul său. Interoghează până când starea nu mai este waiting.
Cerere
# 3. poll for the folders curl -s 'https://email-spam-tester.com/api/v1/placement/<slug>'Răspuns
{ "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"} ] } }
Endpointuri
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.
Verificarea infrastructurii
O singură solicitare GET verifică configurația de e-mail a unui domeniu fără să trimită nimic, păstrează rezultatul și îți spune ce s-a schimbat de la ultima rulare. Nu este necesară nicio cheie. În cron, linia de mai jos returnează un cod diferit de zero când domeniul are probleme sau configurația sa s-a schimbat într-un mod semnificativ.
Pornire rapidă
Fă o singură cerere GET
Transmite domeniul. ip adaugă adresele tale de trimitere, iar selector specifică numele selectorilor DKIM de citit.
Cerere
curl -s 'https://email-spam-tester.com/api/v1/infra/check?domain=example.com&selector=mail&diff=true'Citește verdictul
ok este răspunsul pentru un script, iar sections arată ce parte a eșuat.
Răspuns
{ "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"} ] } }Adaugă-l în cron
Cu diff=true, fiecare rulare este comparată cu ultima ta rulare, iar jq transformă răspunsul într-un cod de ieșire.
Cerere
# 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 | Obligatoriu. Acceptă ce acceptă instrumentele: un domeniu, un URL, o adresă de e-mail. |
| ip | Adresa ta de trimitere. Repet-o pentru mai multe, până la 6. |
| selector | Un selector DKIM. Repetă-l pentru mai multe, până la 10. Fiecare selector pe care îl trimiți trebuie să existe, altfel secțiunea DKIM eșuează. |
| helo | Numele pe care serverul tău îl furnizează în HELO, comparat cu înregistrarea sa PTR. |
| account | Pentru cine este solicitarea. Obligatoriu cu o cheie care deservește mai multe persoane. |
| checks | Secțiunile care trebuie rulate, separate prin virgulă. Toate în mod implicit. |
| diff | true compară această rulare cu ultima ta rulare a domeniului. |
| since | 7d, 12h sau o dată ISO 8601. Compară cu rularea ta cea mai apropiată de acel moment într-un interval de 12 ore, iar dacă nu există, cu ultima rulare dinaintea acestuia. Activează diff. |
| baseline | ID-ul uneia dintre rulările tale cu care se face comparația. Activează diff. |
| fresh | true omite memoria cache de 60 de secunde. |
Citirea răspunsului
O verificare finalizată răspunde cu 200, iar verdictul se află în corp. status este cea mai slabă stare dintre secțiunile obligatorii: spf, dkim, dmarc, ptr, blocklist_ip, blocklist_domain, mx și smtp. unknown într-o secțiune obligatorie este considerat warn. ok este true când status este pass sau warn. score variază de la 0 la 100 pentru secțiunile obligatorii care au răspuns și este null când erorile și valorile unknown lasă mai puțin de jumătate din ponderea aplicabilă. mta_sts, tls_rpt, bimi, dnssec, dane, ns și registration sunt raportate și comparate, dar nu afectează ok sau score.
O secțiune poate fi pass, warn, fail, error (nu am putut verifica), unknown (prea puține informații pentru o concluzie) sau skipped (nu se aplică). skipped nu are niciun efect asupra rezultatului, iar motivul se află în not_checked. dkim_signature și alignment sunt întotdeauna prezente, deoarece necesită un mesaj real.
Ce schimbă ip și selector
PTR și listele de blocare se referă la adrese, așa că o rulare are nevoie de unele. Folosește valorile ip pe care le trimiți. Dacă nu trimiți niciuna, preia până la patru de la gazdele tale MX și din termenii ip4: și ip6: cu o singură adresă din înregistrarea SPF rădăcină. Adresele unui furnizor de e-mail cunoscut sunt marcate ca managed și nu sunt verificate, iar dacă nu mai rămâne nimic, ptr și blocklist_ip răspund cu skipped. Un selector nu poate fi citit din DNS, așa că o rulare le încearcă pe al tău, pe cele găsite de rulările tale anterioare și o listă de nume uzuale. Faptul că nu găsește nimic nu dovedește nimic, iar dkim răspunde cu unknown. Dacă trimiți de pe propriul server, transmite-le pe ambele.
Ce s-a schimbat
Fiecare intrare din diff.changes are un path, un kind (added, removed, changed), o severity (critical, warning, info) și un effect (worsened, improved, neutral). Numai critical și warning setează diff.changed, astfel încât o cheie DKIM rotită de aceeași lungime, o adresă MX nouă sau un certificat reînnoit nu duc la eșecul liniei cron. diff.worsened urmează efectul oricărei modificări. La prima rulare nu există nimic cu care să se facă comparația, iar diff.first_run indică acest lucru.
O referință este întotdeauna una dintre rulările tale, așa că verificarea domeniului de către altcineva între două dintre rulările tale nu ascunde nimic. Orice nu am putut citi de data aceasta ajunge în diff.not_compared, păstrându-se ultima valoare cunoscută, ceea ce înseamnă că o modificare făcută în timpul unei întreruperi apare după ce interogarea funcționează din nou. O rulare cu un ip sau selector diferit rămâne în aceeași serie, iar ceea ce nu a solicitat nu este nici comparat.
De ce o verificare programată ar trebui să folosească o cheie
Fără o cheie, istoricul tău aparține unui hash cu cheie al adresei tale IP, așa că se încheie când adresa se schimbă, iar persoanele din spatele aceleiași adrese îl partajează: rularea unui coleg îți mută referința. Cu o cheie API personală în Authorization: Bearer, istoricul urmează cheia. Rulările cu o cheie sunt păstrate timp de 365 de zile și pot fi deschise numai cu acea cheie. Rulările fără cheie sunt păstrate timp de 30 de zile și pot fi deschise de oricine le are ID-ul.
6 solicitări pe minut și 50 pe zi pentru fiecare IP sau 30 și 500 pentru fiecare cheie. Peste această limită, răspunsul este 429 cu Retry-After. O solicitare identică în interval de 60 de secunde provine din memoria cache, este marcată cached: true, nu scrie nicio rulare și nu este contorizată. Citirea rulărilor stocate permite 120 de solicitări pe minut pentru fiecare client. 503 cu Retry-After înseamnă că rulează prea multe verificări sau, la citirea rulărilor stocate, că spațiul de stocare nu este disponibil. 401 indică o cheie greșită. 422 include detail.code: invalid_domain, invalid_ip, invalid_selector, invalid_check, invalid_since, unknown_baseline sau account_required.
Endpointuri
GET/api/v1/infra/check
Rulează verificarea. Parametrii sunt în tabelul de mai sus.
GET/api/v1/infra/runs/{public_id}
O execuție stocată, în întregime. 404 dacă nu există sau aparține altei chei.
GET/api/v1/infra/domains/{domain}/runs
Execuțiile tale pentru un domeniu, de la cea mai nouă: id, oră, stare, scor și număr de modificări. Acceptă limit (de la 1 la 100, implicit 30) și before, un id de execuție.
GET/api/v1/infra/diff
Aceeași comparație între două execuții stocate, ?from=<id>&to=<id>. Ai nevoie de acces la ambele.
GET/api/v1/infra/checks
Fiecare secțiune cu ponderea sa, versiunea scorului și limitele.
Verificări individuale
Fiecare apel răspunde la o întrebare și nu păstrează niciun istoric. Un instrument rulează singur o parte a verificării infrastructurii, cu excepția instrumentului pentru anteturi, care citește un mesaj pe care l-ai primit deja.
Pornire rapidă
Alege o verificare
Alege instrumentul din lista de mai jos și transmite domeniul, adresa sau IP-ul solicitat.
Cerere
curl -s 'https://email-spam-tester.com/api/v1/tools/spf?domain=example.com'Citește starea și constatările
Fiecare instrument răspunde cu o stare și constatările sale. Câmpurile de după acestea depind de instrument.
Răspuns
{ "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} }
Endpointuri
GET/api/v1/tools/spf
Înregistrarea SPF a unui domeniu: sintaxa sa, fiecare include și redirect urmărit și numărul de interogări DNS consumate de întregul arbore din limita de zece. Transmite ?domain=example.com.
GET/api/v1/tools/dmarc
Înregistrarea DMARC a unui domeniu sau a domeniului său organizațional atunci când acesta nu are una: etichetele, politica și dacă fiecare adresă externă pentru rapoarte a acceptat să primească rapoarte. Transmite ?domain=example.com.
GET/api/v1/tools/dkim
Cheia DKIM publicată pentru un selector: dacă există și poate fi decodificată, tipul și dimensiunea sa și indicatoarele de revocare și testare. Transmite ?domain=example.com&selector=s1.
GET/api/v1/tools/blocklist
O adresă IPv4, o adresă IPv6 sau un domeniu verificat în listele de blocare DNS utilizate de raport, împreună cu răspunsul fiecărei liste. Transmite ?target=203.0.113.5.
GET/api/v1/tools/mx
Înregistrările MX ale unui domeniu în ordinea în care expeditorii le încearcă, cu adresele IPv4 și IPv6 ale fiecărei gazde. Sunt raportate Null MX, un domeniu fără MX, gazdele care sunt adrese IP sau CNAME și gazdele care nu se rezolvă, precum și înregistrările MTA-STS și TLS-RPT. Trimite ?domain=example.com.
GET/api/v1/tools/bimi
Configurația BIMI a unui domeniu în patru pași: politica DMARC necesară pentru BIMI, înregistrarea de la default._bimi, sigla SVG verificată în raport cu profilul Tiny PS și certificatul mărcii, cu tipul, domeniile și data expirării. Trimite ?domain=example.com și &selector= pentru un selector diferit de default.
GET/api/v1/tools/ptr
Înregistrările PTR ale unei adrese și dacă vreunul dintre acele nume se rezolvă înapoi la aceasta. O interogare care a eșuat returnează starea error; o înregistrare lipsă returnează starea fail. Trimite ?ip=8.8.8.8.
GET/api/v1/tools/mta-sts
Înregistrarea MTA-STS a unui domeniu și fișierul de politică la care indică: modul, gazdele enumerate și orice gazdă MX pe care politica o omite. Trimite ?domain=example.com.
GET/api/v1/tools/tls-rpt
Înregistrarea TLS-RPT a unui domeniu și adresele care primesc rapoartele acesteia. Trimite ?domain=example.com.
GET/api/v1/tools/dnssec
Dacă zona unui domeniu este semnată, nesemnată sau defectă, conform înregistrărilor DNSKEY și DS. O semnătură incorectă este diferențiată de o întrerupere a resolverului. Trimite ?domain=example.com.
GET/api/v1/tools/dane
Înregistrările TLSA ale gazdelor MX, comparate cu certificatul prezentat de o gazdă atunci când certificatul a putut fi citit. Trimite ?domain=example.com.
GET/api/v1/tools/smtp
STARTTLS și certificatul de pe primele două gazde MX: versiunea TLS, emitentul, data expirării și dacă lanțul și numele sunt valide. Ne conectăm numai la gazdele din domeniul despre care ai întrebat și omitem furnizorii de e-mail, iar un rezultat per adresă este partajat timp de 6 ore. Nu se trimite niciun e-mail. Trimite ?domain=example.com.
GET/api/v1/tools/ns
Serverele de nume ale unui domeniu și dacă zona sa are o înregistrare SOA. Un singur server de nume este un warn. Trimite ?domain=example.com.
GET/api/v1/tools/registration
Când expiră înregistrarea unui domeniu, conform RDAP. Mai puțin de 30 de zile rămase reprezintă un warn. O zonă fără serviciu RDAP răspunde cu skipped. Trimite ?domain=example.com.
POST/api/v1/tools/header
Antetele unui mesaj primit, trimise ca JSON {"headers": "..."} sau ca text/plain: ruta salt cu salt, cu întârzieri, TLS și decalajul ceasului, Authentication-Results propriu al destinatarului, alinierea domeniilor From, DKIM d= și Return-Path și antetele DKIM, ARC, de dezabonare și ale filtrelor de spam. Tot ce urmează după prima linie goală este eliminat fără a fi citit. Antetele sunt procesate în memorie și nu sunt stocate, păstrate în cache sau jurnalizate.
Verifică domeniul în fiecare noapte.
Testează e-mailul înainte să fie trimis.
Comune tuturor produselor
Accesul, cheile, formatul raportului, stările, erorile, plus OpenAPI și llms.txt pentru mașini.
Autentificare
Nu există. Nicio cheie de solicitat, niciun antet de setat, niciun cont de creat. Slugul pe care îl primești este capabilitatea: oricine îl deține poate citi raportul respectiv și nimeni altcineva nu îl poate ghici.
Chei API personale
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.
Citirea raportului
Câmpurile care conțin răspunsul, în ordinea în care probabil le dorești.
| score_ours | De la 0 la 100. Modelul nostru. Autentificarea și infrastructura au cea mai mare pondere, deoarece ele decid livrarea înainte ca un filtru să citească vreun cuvânt din text. |
| score_compat | De la 0 la 10. Reproduce valoarea în stil SpamAssassin pe care oamenii o compară deja, astfel încât raportul să poată fi comparat cu ceea ce a văzut cineva în altă parte. |
| subscores | Aceeași scară de la 0 la 100 pentru fiecare secțiune: auth, infra_spam, content, compliance. |
| checks[] | Toate cele 42, fiecare cu o stare, o constatare pe un singur rând, dovezile pe baza cărora a fost stabilită și impactul asupra celor două scoruri. |
| checks[].citations | De unde provine constatarea: secțiunea din RFC, citată textual, și pagina unde Google își precizează propria cerință. Selectate manual, nu generate, astfel încât să fie de încredere. |
| fixes[] | Ce trebuie schimbat, în ordine, împreună cu punctele pe care le valorează fiecare schimbare. Câștigurile sunt calculate prin reevaluarea raportului, nu estimate. |
| complete | Fals atunci când o verificare nu a putut rula. Un element neverificat nu este niciodată unul trecut, deci consideră scorul optimist până când această valoare devine adevărată. |
| report_url | Pagina într-un format ușor de citit. Dă-o unei persoane în locul unui zid de JSON. |
Stări
O verificare are una dintre cinci stări, iar diferența dintre două dintre ele contează mai mult decât pare.
| pass | Verificarea a rulat și nu a găsit nimic în neregulă. |
| warn | Merită remediat. Costă puncte. |
| fail | Va afecta livrarea. Costă mai multe puncte. |
| omis | Nu s-a aplicat. Niciun atașament de scanat, nicio parte HTML de evaluat. Nu este o trecere. |
| eroare | Nu am putut determina rezultatul. Este exclus din scor și semnalat, în loc să fie considerat o trecere. |
analysis_status trece prin received, analyzing, checks_ready, failed. ai_status trece prin pending, running, ready, fallback, error. Raportul determinist este final la checks_ready; ai_status doar adaugă planul.
Ce poate fi returnat
| 202 | Adresa este rezervată și nu a sosit niciun mesaj. Corpul răspunsului conține adresa, data expirării și limba, astfel încât un apelant care nu a creat rezervarea o poate afișa în continuare. |
| 404 | Nu există un astfel de slug. Fie nu a existat niciodată, fie rezervarea a fost uitată. |
| 410 | Adresa a expirat înainte de sosirea unui mesaj. |
| 409 | Ai încercat să schimbi limba după ce mesajul sosise deja. |
| 429 | Limita de teste gratuite pentru adresa ta. În prezent, acest serviciu nu are o limită per persoană; dacă va fi stabilită vreodată una, corpul răspunsului indică momentul la care se resetează. |
Patru lucruri de știut
Un mesaj per adresă
Al doilea este refuzat. Raportul anterior rămâne intact, acesta fiind scopul.
O oră pentru utilizare
Adresa expiră; raportul nu. Linkurile rapoartelor sunt permanente, astfel încât unul inserat într-un tichet continuă să funcționeze.
Trimite de pe platformă
Testarea unei campanii dintr-un cont personal măsoară acel cont. Aproape totul din secțiunea de autentificare se referă la infrastructura de trimitere, nu la text.
Retestează după remediere
Îmbunătățirile estimate sunt calculate pentru câte o remediere și nu se cumulează. Al doilea raport indică valoarea reală.
Pentru sisteme automate
- /api/openapi.json Descrierea OpenAPI, generată din același cod care deservește API-ul.
- /llms.txt, /llms-full.txt O hartă scurtă a acestui site pentru modelele lingvistice, conform convenției llms.txt, și o versiune mai lungă cu întreaga buclă și câmpurile raportului într-un singur fișier.
- /mcp Un server MCP cu aceeași funcționalitate și o așteptare blocantă, care este mai eficientă decât interogarea repetată din interiorul unui model.
- For agents Pagina pentru agenți: când să folosești acest instrument, cum să interpretezi o verificare omisă în raport cu una reușită și care constatări sunt înregistrări DNS pe care trebuie să le modifice o persoană, nu text pe care îl poate edita un agent.
GET/api/health
Stare activă. Fără autentificare, fără efecte secundare.
Încearcă mai întâi unul manual
Durează aproximativ un minut și îți arată exact ceea ce descrie JSON.
Obține o adresă de testSandbox.
Fiecare endpoint, cu un buton care îl rulează pe serviciul live. Nimic de aici nu necesită o cheie, așadar o solicitare pe care o trimiți de pe această pagină este una reală: rezervă o adresă reală și este contorizată.
Încearcă în sandbox