Email Spam Tester

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

  1. 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"
    }
  2. 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.com
  3. Spø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.

langSprå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_campaignSendes 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.

Poll dette i stedet for rapporten. analysis_status når checks_ready først, og KI-planen blir tilgjengelig under ai_status omtrent et minutt senere, slik at en klient som bare vil ha de deterministiske kontrollene, ikke trenger å vente på planen.

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.

Råmeldingen slettes etter sin egen tidsplan, tidligere enn rapporten. Etter det svarer dette endepunktet med årsaken i stedet for kilden.

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

  1. 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"}
        ]
      }
    }
  2. 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>, ...
  3. 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

  1. 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'
  2. 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"}
        ]
      }
    }
  3. 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)'
domainPåkrevd. Tar det samme som verktøyene tar: et domene, en URL, en e-postadresse.
ipAvsenderadressen din. Gjenta den for flere, opptil 6.
selectorEn DKIM-selektor. Gjenta den for flere, opptil 10. Hver selektor du sender inn, må finnes, ellers mislykkes dkim-delen.
heloNavnet serveren din oppgir i HELO, sammenlignet med dens PTR.
accountHvem forespørselen gjelder. Påkrevd med en nøkkel som betjener mange personer.
checksDeler som skal kjøres, atskilt med komma. Alle som standard.
difftrue sammenligner denne kjøringen med den siste kjøringen din av domenet.
since7d, 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.
baselineID-en til en av kjøringene dine som det skal sammenlignes med. Aktiverer diff.
freshtrue 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

  1. 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'
  2. 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

Alle svarer med 200, en status og en liste over funn, hvert med en kode og tilhørende parametere. Statusen er pass, warn, fail eller error, og et verktøy som deles med infrastruktursjekken, kan også svare unknown eller skipped. Et oppslag som fikk tidsavbrudd, eller en liste som avviste spørringen, regnes aldri som en pass. 30 forespørsler per minutt og 300 per dag per IP på tvers av verktøyene; over dette er svaret 429 med Retry-After.

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.

Det betyr også at en slug bør behandles som et passord. En rapport viser emnelinjen, avsenderen, returadressen og hele meldingskilden til alle som har lenken.

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_ours0 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_compat0 til 10. Gjengir tallet i SpamAssassin-stil som folk allerede sammenligner med, slik at rapporten kan sammenlignes med det noen så et annet sted.
subscoresDen 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[].citationsHvor 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.
completeFalse 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_urlDen 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.

passKontrollen ble kjørt og fant ingen feil.
warnVerdt å rette. Koster poeng.
failVil koste deg levering. Koster flere poeng.
hopp overVar ikke relevant. Ingen vedlegg å skanne, ingen HTML-del å vurdere. Ikke godkjent.
feilVi 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

202Adressen 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.
404Ingen slik slug. Den har aldri eksistert, eller reservasjonen ble glemt.
410Adressen utløp før en melding kom.
409Du prøvde å endre språket etter at meldingen allerede hadde kommet.
429Grensen 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

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 testadresse

Sandkasse.

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