Spamkontroll-API for e-post,
innboks og domene
Send oss én ekte melding, eller oppgi bare et domene. Alt besvares i JSON.
Ingen nøkkel, ingen konto.
Forespørsel
# 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'
Svar
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}]
}Forespørsel
# 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'
Svar
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"}
]}
}Forespørsel
# 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'
Svar
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"}]
}Velg den du trenger
På denne siden
E-posttest
Vi leser én ekte melding fra ende til ende: innhold, signatur, meldingshoder og serveren som sendte den. Du får en poengsum, en liste over rettelser og alle kontrollene bak dem.
Hurtigstart
Tre kall. Ingen nøkkel, ingen konto, ingen registrering. To forespørsler og én e-post. Det tredje kallet er bare nødvendig fordi analysen tar noen sekunder.
Reserver en adresse
Send en POST-forespørsel til innboks-endepunktet. Du får tilbake en adresse som godtar nøyaktig én melding og utløper etter en time, samt sluggen som alt annet identifiseres med.
Forespørsel
# 1. reserve a single-use address curl -sX POST 'https://email-spam-tester.com/api/v1/inbox?lang=en'Svar
{ "address": "test-<slug>@t.email-spam-tester.com", "slug": "<slug>", "expires_at": "2026-01-01T12:00:00Z" }Send den faktiske meldingen til den
Over SMTP, fra plattformen som skal sende kampanjen. Halvparten av kontrollene leser meldingshoder som sendeplattformen din legger til, så en melding som er skrevet manuelt, måler feil ting.
Forespørsel
# 2. send your message to that address, from your own platform To: test-<slug>@t.email-spam-tester.comSpør etter status, og les deretter rapporten
Status-endepunktet er på noen hundre byte og forteller deg om det er verdt å hente hele rapporten ennå. Selve rapporten består av flere tusen linjer.
Forespørsel
# 3. poll curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>/status'Svar
{ "slug": "<slug>", "analysis_status": "checks_ready", "ai_status": "running", "checks_done": 42, "checks_total": 42 }Forespørsel
# 4. read the report once analysis_status is checks_ready curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>'Svar
{ "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"}} ] }
Reserver en adresse, send meldingen du skulle til å sende til listen din, og les rapporten. Alt siden viser, finnes i JSON, inkludert poengsummen, alle de 42 kontrollene med dokumentasjonen deres og avsnittet i standarden som hvert funn bygger på.
De første 100 000 rapportene er gratis, uten nøkkel og uten konto. Hvis du setter opp en agent i stedet for et skript, passer MCP-serveren bedre enn polling.
Endepunkter
Basisadresse https://email-spam-tester.com. Alt svarer med JSON.
POST/api/v1/inbox
Reserverer en engangsadresse. Begge parameterne er valgfrie.
| lang | Språket som utbedringsplanen og funnene for hver kontroll skal skrives på, som en ISO-kode. Dette avgjøres nå fordi meldingen kommer via SMTP noen minutter senere og ikke inneholder noen indikasjon på hvem som venter på den. En ukjent kode bruker engelsk som reserve. |
| utm_source, utm_medium, utm_campaign | Sendes videre til analyseløsningen vår. Nyttig hvis du måler din egen integrasjon. |
GET/api/v1/tests/{slug}/status
Rimelig å polle. Returnerer de to statusfeltene og hvor langt kontrollene har kommet, og ingenting annet.
GET/api/v1/tests/{slug}
Hele rapporten. Svarer med 202 mens adressen er reservert og ingenting har kommet ennå, og med 200 når noe har kommet.
GET/api/v1/tests/{slug}/message
Meldingen nøyaktig slik den ble levert: alle headere i overføringsrekkefølge, begge meldingstekstene, vedleggslisten og råkilden. Hentes separat fordi rapporten polles, og denne kan bli opptil én megabyte.
PUT/api/v1/tests/{slug}/locale
Endrer språket for en reservasjon som ennå ikke er brukt. For en agent som finner ut hvilket språk brukeren leser etter at den allerede har bedt om adressen. Avvises når meldingen har ankommet, fordi analysen da kjører.
InnboksplasseringBeta
Send én melding til en liste over testinnbokser, og se hvor den havnet hos Gmail, Outlook, Yahoo og andre leverandører: Innboks, Kampanjer eller Søppelpost.
Hurtigstart
Opprett en test
Send en POST-forespørsel til endepunktet for plassering. Du får tilbake en markør og testinnboksene.
Forespørsel
# 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}'Svar
{ "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"} ] } }Send én melding til hver innboks
Legg markøren i emnefeltet, og send fra den vanlige plattformen din til alle adressene samtidig.
Forespørsel
# 2. one message to every address, with the marker in the subject Subject: October invoice est-3f9a1c7e2b4d6a80c5e1f2d3 To: <seed>, <mailbox>, ...Poll etter mappene
Hver adresse fylles ut med leverandør og mappe. Poll til statusen ikke lenger er waiting.
Forespørsel
# 3. poll for the folders curl -s 'https://email-spam-tester.com/api/v1/placement/<slug>'Svar
{ "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"} ] } }
Endepunkter
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.
Infrastruktursjekk
Én GET-forespørsel kontrollerer e-postoppsettet for et domene uten å sende noe, lagrer resultatet og forteller deg hva som er endret siden forrige kjøring. Ingen nøkkel kreves. I cron avsluttes linjen nedenfor med en kode ulik null når domenet er ugyldig eller oppsettet er endret på en måte som har betydning.
Hurtigstart
Gjør ett GET-kall
Send med domenet. ip legger til senderadressene dine, og selector angir DKIM-selektorene som skal leses.
Forespørsel
curl -s 'https://email-spam-tester.com/api/v1/infra/check?domain=example.com&selector=mail&diff=true'Les resultatet
ok er svaret for et skript, og sections viser hvilken del som mislyktes.
Svar
{ "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"} ] } }Legg det i cron
Med diff=true sammenlignes hver kjøring med den forrige, og jq gjør svaret om til en avslutningskode.
Forespørsel
# 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 | Påkrevd. Tar det samme som verktøyene tar: et domene, en URL, en e-postadresse. |
| ip | Avsenderadressen din. Gjenta den for flere, opptil 6. |
| selector | En DKIM-selektor. Gjenta den for flere, opptil 10. Hver selektor du sender inn, må finnes, ellers mislykkes dkim-delen. |
| helo | Navnet serveren din oppgir i HELO, sammenlignet med dens PTR. |
| account | Hvem forespørselen gjelder. Påkrevd med en nøkkel som betjener mange personer. |
| checks | Deler som skal kjøres, atskilt med komma. Alle som standard. |
| diff | true sammenligner denne kjøringen med den siste kjøringen din av domenet. |
| since | 7d, 12h eller en ISO 8601-dato. Sammenligner med kjøringen din nærmest dette tidspunktet innenfor 12 timer, ellers den siste før det. Aktiverer diff. |
| baseline | ID-en til en av kjøringene dine som det skal sammenlignes med. Aktiverer diff. |
| fresh | true hopper over hurtigbufferen på 60 sekunder. |
Lese svaret
En fullført kontroll svarer med 200, og utfallet ligger i brødteksten. status er den dårligste statusen blant de obligatoriske delene: spf, dkim, dmarc, ptr, blocklist_ip, blocklist_domain, mx og smtp. unknown i en obligatorisk del regnes som warn. ok er true når status er pass eller warn. score går fra 0 til 100 for de obligatoriske delene som svarte, og er null når feil og unknown gjør at mindre enn halvparten av den relevante vekten gjenstår. mta_sts, tls_rpt, bimi, dnssec, dane, ns og registration rapporteres og sammenlignes, men de påvirker ikke ok eller score.
En del kan være pass, warn, fail, error (vi kunne ikke kontrollere), unknown (for lite grunnlag) eller skipped (gjelder ikke). skipped påvirker ikke resultatet, og årsaken står i not_checked. dkim_signature og alignment er alltid med, fordi de trenger en ekte melding.
Hva ip og selector endrer
PTR og blokklister gjelder adresser, så en kjøring trenger noen. Den bruker ip-verdiene du sender inn. Uten noen bruker den opptil fire fra MX-vertene dine og fra ip4:- og ip6:-termer med én adresse i SPF-oppføringen på rotnivå. Adresser som tilhører en kjent e-postleverandør, oppføres som managed og kontrolleres ikke, og hvis ingen adresser gjenstår, svarer ptr og blocklist_ip med skipped. En selector kan ikke leses fra DNS, så en kjøring prøver din, dem tidligere kjøringer har funnet, og en liste over vanlige navn. At ingenting blir funnet, beviser ingenting, og dkim svarer med unknown. Hvis du sender fra din egen server, oppgi begge.
Hva som er endret
Hver oppføring i diff.changes har en path, en kind (added, removed, changed), en severity (critical, warning, info) og en effect (worsened, improved, neutral). Bare critical og warning setter diff.changed, så en rotert DKIM-nøkkel med samme lengde, en ny MX-adresse eller et fornyet sertifikat gjør ikke at cron-linjen feiler. diff.worsened følger effect for enhver endring. Ved en første kjøring finnes det ingenting å sammenligne med, og diff.first_run angir dette.
En baseline er alltid en av dine egne kjøringer, så det skjuler ingenting hvis noen andre kontrollerer domenet mellom to av kjøringene dine. Alt vi ikke kunne lese denne gangen, legges i diff.not_compared med den sist kjente verdien bevart, noe som betyr at en endring gjort under et avbrudd vises når oppslaget virker igjen. En kjøring med en annen ip eller selector forblir i samme serie, og det den ikke spurte om, blir heller ikke sammenlignet.
Hvorfor en planlagt kontroll bør bruke en nøkkel
Uten en nøkkel tilhører historikken din en nøkkelbasert hash av IP-adressen din, så den avsluttes når adressen endres, og personer bak samme adresse deler den: En kjøring fra en kollega flytter baseline for deg. Med en personlig API-nøkkel i Authorization: Bearer følger historikken nøkkelen. Kjøringer med en nøkkel oppbevares i 365 dager og kan bare åpnes med den nøkkelen. Kjøringer uten nøkkel oppbevares i 30 dager og kan åpnes av alle som har ID-en deres.
6 forespørsler per minutt og 50 per dag per IP, eller 30 og 500 per nøkkel. Over dette svarer tjenesten med 429 og Retry-After. En identisk forespørsel innen 60 sekunder kommer fra en hurtigbuffer, merkes med cached: true, skriver ingen kjøring og teller ikke. Lesing av lagrede kjøringer tillater 120 forespørsler per minutt per klient. 503 med Retry-After betyr at for mange kontroller kjører, eller, ved lesing av lagrede kjøringer, at lagringen er utilgjengelig. 401 betyr feil nøkkel. 422 inneholder detail.code: invalid_domain, invalid_ip, invalid_selector, invalid_check, invalid_since, unknown_baseline eller account_required.
Endepunkter
GET/api/v1/infra/check
Kjører kontrollen. Parameterne er i tabellen ovenfor.
GET/api/v1/infra/runs/{public_id}
Én lagret kjøring, i sin helhet. 404 hvis den ikke finnes eller tilhører en annen nøkkel.
GET/api/v1/infra/domains/{domain}/runs
Dine kjøringer for et domene, nyeste først: id, tidspunkt, status, poengsum og antall endringer. Tar limit (1 til 100, 30 som standard) og before, en kjørings-id.
GET/api/v1/infra/diff
Den samme sammenligningen mellom to lagrede kjøringer, ?from=<id>&to=<id>. Du må ha tilgang til begge.
GET/api/v1/infra/checks
Hver del med sin vekt, poengversjonen og grensene.
Enkeltkontroller
Hvert kall besvarer ett spørsmål og lagrer ingen historikk. Et verktøy kjører én del av infrastrukturkontrollen på egen hånd, med unntak av headerverktøyet, som leser en melding du allerede har mottatt.
Hurtigstart
Velg en kontroll
Velg verktøyet fra listen nedenfor, og oppgi domenet, adressen eller IP-en det ber om.
Forespørsel
curl -s 'https://email-spam-tester.com/api/v1/tools/spf?domain=example.com'Les status og funn
Hvert verktøy svarer med en status og sine funn. Feltene etter disse avhenger av verktøyet.
Svar
{ "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} }
Endepunkter
GET/api/v1/tools/spf
SPF-oppføringen for et domene: syntaksen, hver include og redirect som følges, og hvor mange DNS-oppslag hele treet bruker av grensen på ti. Bruk ?domain=example.com.
GET/api/v1/tools/dmarc
DMARC-oppføringen for et domene, eller for organisasjonsdomenet når domenet ikke har noen: taggene, policyen og om hver eksterne rapportadresse har samtykket til å motta rapporter. Bruk ?domain=example.com.
GET/api/v1/tools/dkim
DKIM-nøkkelen som er publisert for en selektor: om den finnes og kan dekodes, typen og størrelsen, og flaggene for tilbakekalling og testing. Bruk ?domain=example.com&selector=s1.
GET/api/v1/tools/blocklist
En IPv4-adresse, en IPv6-adresse eller et domene kontrollert mot DNS-blokkeringslistene som rapporten bruker, med svaret fra hver liste. Bruk ?target=203.0.113.5.
GET/api/v1/tools/mx
MX-postene for et domene i rekkefølgen avsendere prøver dem, med IPv4- og IPv6-adressene til hver vert. Null MX, et domene uten MX, verter som er IP-adresser eller CNAME-er, og verter som ikke kan slås opp, rapporteres, og det samme gjør MTA-STS- og TLS-RPT-postene. Send med ?domain=example.com.
GET/api/v1/tools/bimi
BIMI-oppsettet for et domene i fire trinn: DMARC-policyen BIMI krever, posten på default._bimi, SVG-logoen kontrollert mot Tiny PS-profilen, og merkesertifikatet med type, domener og utløpsdato. Send med ?domain=example.com, og &selector= for en annen selektor enn default.
GET/api/v1/tools/ptr
PTR-postene for en adresse og om noen av disse navnene peker tilbake til den. Et oppslag som mislyktes, gir statusen error; en manglende post gir statusen fail. Send ?ip=8.8.8.8.
GET/api/v1/tools/mta-sts
MTA-STS-oppføringen for et domene og policyfilen den peker til: modusen, vertene som er oppført, og eventuelle MX-verter som policyen utelater. Send inn ?domain=example.com.
GET/api/v1/tools/tls-rpt
TLS-RPT-oppføringen for et domene og adressene som mottar rapportene. Send inn ?domain=example.com.
GET/api/v1/tools/dnssec
Om sonen til et domene er signert, usignert eller ugyldig, basert på DNSKEY- og DS-oppføringene. En ugyldig signatur skilles fra et avbrudd i resolveren. Send inn ?domain=example.com.
GET/api/v1/tools/dane
TLSA-oppføringene for MX-vertene, sammenlignet med sertifikatet en vert presenterer når sertifikatet kunne leses. Send inn ?domain=example.com.
GET/api/v1/tools/smtp
STARTTLS og sertifikatet på de to første MX-vertene: TLS-versjon, utsteder, utløpsdato og om kjeden og navnet er gyldige. Vi kobler bare til verter under domenet du ba om og hopper over e-postleverandører, og ett resultat per adresse deles i 6 timer. Ingen e-post sendes. Send inn ?domain=example.com.
GET/api/v1/tools/ns
Navnetjenerne for et domene og om sonen har en SOA-oppføring. Én navnetjener er en warn. Send inn ?domain=example.com.
GET/api/v1/tools/registration
Når registreringen av et domene utløper, hentet fra RDAP. Under 30 dager igjen er en warn. En sone uten en RDAP-tjeneste svarer skipped. Send inn ?domain=example.com.
POST/api/v1/tools/header
Hodene i en mottatt melding, sendt som JSON {"headers": "..."} eller som text/plain: ruten hopp for hopp med forsinkelser, TLS og klokkeavvik, mottakerens egne Authentication-Results, samsvaret mellom domenene i From, DKIM d= og Return-Path, og hodene for DKIM, ARC, avmelding og spamfiltre. Alt etter den første tomme linjen forkastes uten å bli lest. Hodene behandles i minnet og blir ikke lagret, bufret eller loggført.
Sjekk domenet hver natt.
Test e-posten før den sendes.
Felles for alle produkter
Tilgang, nøkler, rapportformatet, statuser, feil samt OpenAPI og llms.txt for maskiner.
Autentisering
Det finnes ingen. Ingen nøkkel å be om, ingen header å angi, ingen konto å opprette. Sluggen du får tilbake, er tilgangen: Den som har den, kan lese rapporten, og ingen andre kan gjette den.
Personlige API-nøkler
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.
Lese rapporten
Feltene som inneholder svaret, i den rekkefølgen du sannsynligvis vil ha dem.
| score_ours | 0 til 100. Vår modell. Autentisering og infrastruktur veier tyngst, fordi de avgjør levering før et filter leser et eneste ord av teksten. |
| score_compat | 0 til 10. Gjengir tallet i SpamAssassin-stil som folk allerede sammenligner med, slik at rapporten kan sammenlignes med det noen så et annet sted. |
| subscores | Den samme skalaen fra 0 til 100 per del: auth, infra_spam, content, compliance. |
| checks[] | Alle 42, hver med en status, et funn på én linje, bevisgrunnlaget det ble avgjort ut fra, og utslaget det ga på de to poengsummene. |
| checks[].citations | Hvor funnet kommer fra: delen av RFC-en, sitert ordrett, og siden der Google oppgir sitt eget krav. Kuratert manuelt i stedet for generert, slik at kildene er pålitelige. |
| fixes[] | Hva som må endres, i riktig rekkefølge, med antall poeng hver endring er verdt. Gevinstene beregnes ved å beregne rapportens poengsum på nytt, ikke ved å anslå dem. |
| complete | False når en kontroll ikke kunne kjøres. Et ukontrollert element er aldri godkjent, så betrakt poengsummen som optimistisk frem til dette er true. |
| report_url | Den lesbare siden. Gi den til en person i stedet for en vegg med JSON. |
Statuser
En kontroll har én av fem statuser, og forskjellen mellom to av dem er viktigere enn den ser ut til.
| pass | Kontrollen ble kjørt og fant ingen feil. |
| warn | Verdt å rette. Koster poeng. |
| fail | Vil koste deg levering. Koster flere poeng. |
| hopp over | Var ikke relevant. Ingen vedlegg å skanne, ingen HTML-del å vurdere. Ikke godkjent. |
| feil | Vi kunne ikke fastslå det. Utelatt fra poengsummen og merket, i stedet for å bli regnet som godkjent. |
analysis_status går gjennom received, analyzing, checks_ready, failed. ai_status går gjennom pending, running, ready, fallback, error. Den deterministiske rapporten er endelig ved checks_ready; ai_status legger bare til planen.
Hva som kan returneres
| 202 | Adressen er reservert, og ingen melding har kommet. Brødteksten inneholder adressen, utløpstiden og språket, slik at en kallende klient som ikke opprettet reservasjonen, likevel kan vise den. |
| 404 | Ingen slik slug. Den har aldri eksistert, eller reservasjonen ble glemt. |
| 410 | Adressen utløp før en melding kom. |
| 409 | Du prøvde å endre språket etter at meldingen allerede hadde kommet. |
| 429 | Grensen for gratistester for adressen din. Det er ingen grense per person for denne tjenesten akkurat nå. Hvis en slik grense noen gang blir satt, angir brødteksten når den nullstilles. |
Fire ting det er verdt å vite
Én melding per adresse
Den andre blir avvist. Den tidligere rapporten din forblir intakt, som er poenget.
Én time til å bruke den
Adressen utløper; rapporten gjør det ikke. Rapportlenker er permanente, så en lenke som limes inn i en sak, fortsetter å fungere.
Send fra plattformen
Testing av en kampanje fra en personlig konto måler den kontoen. Nesten alt i autentiseringsdelen handler om sendeinfrastrukturen, ikke teksten.
Test på nytt etter retting
De forventede forbedringene beregnes for én retting om gangen, og de kan ikke kombineres. Den andre rapporten gir det ærlige tallet.
For maskiner
- /api/openapi.json OpenAPI-beskrivelsen, generert fra den samme koden som leverer API-et.
- /llms.txt, /llms-full.txt Et kort kart over dette nettstedet for språkmodeller, i llms.txt-konvensjonen, og en lengre versjon med hele forløpet og rapportfeltene i én fil.
- /mcp En MCP-server med samme funksjonalitet og blokkerende venting, som er bedre enn polling fra innsiden av en modell.
- For agents Agentsiden: når du bør bruke dette, hvordan du skiller en kontroll som ble hoppet over fra en som besto, og hvilke funn som er DNS-oppføringer en person må endre, i stedet for tekst en agent kan redigere.
GET/api/health
Livssjekk. Ingen autentisering, ingen bivirkninger.
Prøv én manuelt først
Det tar omtrent ett minutt og viser deg nøyaktig hva JSON beskriver.
Få en testadresseSandkasse.
Hvert endepunkt, med en knapp som kjører det mot den aktive tjenesten. Ingenting her krever en nøkkel, så en forespørsel du sender fra denne siden, er reell: Den reserverer en reell adresse og telles med.
Prøv det i sandkassen