Spamprüfungs-API für E-Mail,
Posteingang und Domain
Senden Sie uns eine echte Nachricht oder geben Sie uns nur eine Domain. Alles wird als JSON zurückgegeben.
Kein Schlüssel, kein Konto.
Anfrage
# 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'
Antwort
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}]
}Anfrage
# 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'
Antwort
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"}
]}
}Anfrage
# 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'
Antwort
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"}]
}Wählen Sie, was Sie brauchen
Auf dieser Seite
E-Mail-Test
Wir prüfen eine echte Nachricht vollständig: Inhalt, Signatur, Header und den Server, der sie gesendet hat. Sie erhalten eine Bewertung, eine Liste mit Korrekturen und jede zugrunde liegende Prüfung.
Schnellstart
Drei Aufrufe. Kein Schlüssel, kein Konto, keine Registrierung. Zwei Anfragen und eine E-Mail. Der dritte Aufruf ist nur erforderlich, weil die Analyse einige Sekunden dauert.
Eine Adresse reservieren
Senden Sie eine POST-Anfrage an den Posteingangs-Endpunkt. Sie erhalten eine Adresse zurück, die genau eine Nachricht akzeptiert und nach einer Stunde abläuft, sowie den Slug, über den alles Weitere zugeordnet wird.
Anfrage
# 1. reserve a single-use address curl -sX POST 'https://email-spam-tester.com/api/v1/inbox?lang=en'Antwort
{ "address": "test-<slug>@t.email-spam-tester.com", "slug": "<slug>", "expires_at": "2026-01-01T12:00:00Z" }Die echte Nachricht dorthin senden
Über SMTP, von der Plattform, die die Kampagne versenden wird. Die Hälfte der Prüfungen liest Header, die Ihre Versandplattform hinzufügt, daher misst eine manuell verfasste Nachricht das Falsche.
Anfrage
# 2. send your message to that address, from your own platform To: test-<slug>@t.email-spam-tester.comDen Status abfragen, dann den Bericht lesen
Der Status-Endpunkt ist einige Hundert Byte groß und teilt Ihnen mit, ob es sich bereits lohnt, den vollständigen Bericht abzurufen. Der Bericht selbst umfasst mehrere Tausend Zeilen.
Anfrage
# 3. poll curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>/status'Antwort
{ "slug": "<slug>", "analysis_status": "checks_ready", "ai_status": "running", "checks_done": 42, "checks_total": 42 }Anfrage
# 4. read the report once analysis_status is checks_ready curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>'Antwort
{ "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"}} ] }
Reservieren Sie eine Adresse, senden Sie die Nachricht, die Sie gerade an Ihre Liste senden wollten, und lesen Sie den Bericht. Alles, was die Seite anzeigt, ist im JSON enthalten, einschließlich der Bewertung, aller 42 Prüfungen mit ihren Belegen und des Abschnitts des Standards, auf dem jedes Ergebnis beruht.
Die ersten 100.000 Berichte sind kostenlos, ohne Schlüssel und ohne Konto. Wenn Sie einen Agenten statt eines Skripts anbinden, ist der MCP-Server besser geeignet als Polling.
Endpunkte
Basisadresse https://email-spam-tester.com. Alles antwortet mit JSON.
POST/api/v1/inbox
Reserviert eine einmalig verwendbare Adresse. Beide Parameter sind optional.
| lang | Sprache, in der der Maßnahmenplan und die Ergebnisse der einzelnen Prüfungen verfasst werden, als ISO-Code. Dies wird jetzt festgelegt, weil die Nachricht Minuten später über SMTP eintrifft und keinen Hinweis darauf enthält, wer auf sie wartet. Bei einem unbekannten Code wird Englisch verwendet. |
| utm_source, utm_medium, utm_campaign | Werden an unsere Analysen weitergegeben. Nützlich, wenn Sie Ihre eigene Integration messen. |
GET/api/v1/tests/{slug}/status
Kann kostengünstig abgefragt werden. Gibt die beiden Statusfelder und den Fortschritt der Prüfungen zurück, sonst nichts.
GET/api/v1/tests/{slug}
Der vollständige Bericht. Antwortet mit 202, solange die Adresse reserviert ist und noch nichts eingetroffen ist, und mit 200, sobald etwas eingetroffen ist.
GET/api/v1/tests/{slug}/message
Die Nachricht genau so, wie sie zugestellt wurde: jeder Header in der Übertragungsreihenfolge, beide Nachrichtentexte, die Liste der Anhänge und der rohe Quelltext. Wird separat abgerufen, weil der Bericht regelmäßig abgefragt wird und dies bis zu einem Megabyte groß sein kann.
PUT/api/v1/tests/{slug}/locale
Ändert die Sprache einer Reservierung, die noch nicht verwendet wurde. Für einen Agenten, der erst erfährt, welche Sprache sein Benutzer liest, nachdem er bereits nach der Adresse gefragt hat. Wird abgelehnt, sobald die Nachricht eingetroffen ist, weil die Analyse dann bereits läuft.
PosteingangsplatzierungBeta
Senden Sie eine Nachricht an eine Liste von Testpostfächern und sehen Sie, wo sie bei Gmail, Outlook, Yahoo und anderen Anbietern gelandet ist: Posteingang, Werbung oder Spam.
Schnellstart
Test erstellen
Senden Sie einen POST an den Platzierungsendpunkt. Sie erhalten eine Markierung und die Test-Posteingänge zurück.
Anfrage
# 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}'Antwort
{ "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"} ] } }Eine Nachricht an jeden Posteingang senden
Fügen Sie die Markierung in die Betreffzeile ein und senden Sie die Nachricht über Ihre normale Plattform in einem Durchgang an alle Adressen.
Anfrage
# 2. one message to every address, with the marker in the subject Subject: October invoice est-3f9a1c7e2b4d6a80c5e1f2d3 To: <seed>, <mailbox>, ...Ordner abfragen
Für jede Adresse werden Anbieter und Ordner eingetragen. Fragen Sie den Status ab, bis er nicht mehr waiting lautet.
Anfrage
# 3. poll for the folders curl -s 'https://email-spam-tester.com/api/v1/placement/<slug>'Antwort
{ "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"} ] } }
Endpunkte
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.
Infrastrukturprüfung
Eine GET-Anfrage prüft die E-Mail-Konfiguration einer Domain, ohne etwas zu senden, speichert das Ergebnis und teilt Ihnen mit, was sich seit Ihrem letzten Durchlauf geändert hat. Kein Schlüssel erforderlich. In cron beendet sich die folgende Zeile mit einem von null verschiedenen Status, wenn die Domain fehlerhaft ist oder sich ihre Konfiguration auf relevante Weise geändert hat.
Schnellstart
Führen Sie einen GET-Aufruf aus
Übergeben Sie die Domain. ip fügt Ihre Versandadressen hinzu, und selector gibt die zu lesenden DKIM-Selektoren an.
Anfrage
curl -s 'https://email-spam-tester.com/api/v1/infra/check?domain=example.com&selector=mail&diff=true'Lesen Sie das Ergebnis
ok ist die Antwort für ein Skript, und sections zeigt, welcher Teil fehlgeschlagen ist.
Antwort
{ "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"} ] } }Tragen Sie es in cron ein
Mit diff=true wird jeder Lauf mit Ihrem letzten Lauf verglichen, und jq wandelt die Antwort in einen Exit-Code um.
Anfrage
# 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 | Erforderlich. Akzeptiert, was die Tools akzeptieren: eine Domain, eine URL, eine E-Mail-Adresse. |
| ip | Ihre Absenderadresse. Wiederholen Sie sie für weitere Adressen, bis zu 6. |
| selector | Ein DKIM-Selektor. Wiederholen Sie ihn für weitere Selektoren, bis zu 10. Jeder übergebene Selektor muss vorhanden sein, sonst schlägt dkim fehl. |
| helo | Der Name, den Ihr Server in HELO angibt, verglichen mit seinem PTR. |
| account | Für wen die Anfrage bestimmt ist. Erforderlich bei einem Schlüssel, der vielen Personen dient. |
| checks | Auszuführende Abschnitte, durch Kommas getrennt. Standardmäßig alle. |
| diff | true vergleicht diesen Durchlauf mit Ihrem letzten Durchlauf der Domain. |
| since | 7d, 12h oder ein ISO-8601-Datum. Vergleicht mit Ihrem Durchlauf, der diesem Zeitpunkt innerhalb von 12 Stunden am nächsten liegt, andernfalls mit dem letzten davor. Aktiviert diff. |
| baseline | Die ID eines Ihrer Läufe, mit dem verglichen werden soll. Aktiviert diff. |
| fresh | true überspringt den 60-Sekunden-Cache. |
Antwort auswerten
Eine abgeschlossene Prüfung antwortet mit 200, und das Ergebnis steht im Body. status ist der schlechteste Status der erforderlichen Abschnitte: spf, dkim, dmarc, ptr, blocklist_ip, blocklist_domain, mx und smtp. unknown in einem erforderlichen Abschnitt zählt als warn. ok ist true, wenn status pass oder warn ist. score reicht von 0 bis 100 und basiert auf den erforderlichen Abschnitten, die geantwortet haben, und ist null, wenn durch errors und unknowns weniger als die Hälfte der zutreffenden Gewichtung übrig bleibt. mta_sts, tls_rpt, bimi, dnssec, dane, ns und registration werden gemeldet und verglichen, wirken sich aber nicht auf ok oder score aus.
Ein Abschnitt kann pass, warn, fail, error (wir konnten ihn nicht prüfen), unknown (zu wenige Anhaltspunkte) oder skipped (nicht zutreffend) sein. skipped hat keine Auswirkung auf das Ergebnis, und der Grund steht in not_checked. dkim_signature und alignment sind immer vorhanden, weil sie eine echte Nachricht benötigen.
Was sich durch ip und selector ändert
PTR und Sperrlisten beziehen sich auf Adressen, daher benötigt ein Lauf einige davon. Er verwendet die von Ihnen übergebenen ip-Werte. Wenn keine vorhanden sind, übernimmt er bis zu vier von Ihren MX-Hosts sowie aus ip4:- und ip6:-Termen mit einer einzelnen Adresse im SPF-Root-Eintrag. Adressen eines bekannten E-Mail-Anbieters werden als managed aufgeführt und nicht geprüft, und wenn danach keine Adressen übrig bleiben, antworten ptr und blocklist_ip mit skipped. Ein selector kann nicht aus DNS ausgelesen werden, daher probiert ein Lauf Ihren selector, die von früheren Läufen gefundenen selector und eine Liste gebräuchlicher Namen aus. Wenn nichts gefunden wird, beweist das nichts, und dkim antwortet mit unknown. Wenn Sie von Ihrem eigenen Server senden, übergeben Sie beides.
Was sich geändert hat
Jeder Eintrag in diff.changes hat einen path, eine kind (added, removed, changed), eine severity (critical, warning, info) und einen effect (worsened, improved, neutral). Nur critical und warning setzen diff.changed, daher bleibt cron bei einem rotierten DKIM-Schlüssel gleicher Länge, einer neuen MX-Adresse oder einem erneuerten Zertifikat still. diff.worsened folgt dem effect einer beliebigen Änderung. Bei einem ersten Lauf gibt es nichts zu vergleichen, und diff.first_run gibt dies an.
Eine Vergleichsbasis ist immer ein eigener Lauf von Ihnen, daher wird nichts verborgen, wenn jemand anderes die Domain zwischen zwei Ihrer Läufe prüft. Alles, was wir dieses Mal nicht auslesen konnten, wird in diff.not_compared aufgenommen, wobei der letzte bekannte Wert beibehalten wird, was bedeutet, dass eine während eines Ausfalls vorgenommene Änderung angezeigt wird, sobald die Abfrage wieder funktioniert. Ein Lauf mit einer anderen ip oder einem anderen selector bleibt in derselben Serie, und was er nicht abgefragt hat, wird ebenfalls nicht verglichen.
Warum eine geplante Prüfung einen Schlüssel verwenden sollte
Ohne Schlüssel gehört Ihr Verlauf zu einem schlüsselbasierten Hash Ihrer IP-Adresse, daher endet er, wenn sich die Adresse ändert, und Personen hinter derselben Adresse teilen ihn: Der Lauf eines Kollegen verschiebt Ihre Vergleichsbasis. Mit einem persönlichen API-Schlüssel in Authorization: Bearer folgt der Verlauf dem Schlüssel. Läufe mit einem Schlüssel werden 365 Tage aufbewahrt und können nur mit diesem Schlüssel geöffnet werden. Läufe ohne Schlüssel werden 30 Tage aufbewahrt und können von jedem geöffnet werden, der ihre ID kennt.
6 Anfragen pro Minute und 50 pro Tag je IP oder 30 und 500 je Schlüssel. Darüber hinaus lautet die Antwort 429 mit Retry-After. Eine identische Anfrage innerhalb von 60 Sekunden stammt aus einem Cache, ist mit cached: true gekennzeichnet, schreibt keinen Lauf und wird nicht gezählt. Das Lesen gespeicherter Läufe erlaubt 120 Anfragen pro Minute und Client. 503 mit Retry-After bedeutet, dass zu viele Prüfungen ausgeführt werden oder, beim Lesen gespeicherter Läufe, dass der Speicher nicht verfügbar ist. 401 bedeutet einen falschen Schlüssel. 422 enthält detail.code: invalid_domain, invalid_ip, invalid_selector, invalid_check, invalid_since, unknown_baseline oder account_required.
Endpunkte
GET/api/v1/infra/check
Führt die Prüfung aus. Die Parameter stehen in der obigen Tabelle.
GET/api/v1/infra/runs/{public_id}
Ein gespeicherter Lauf, vollständig. 404, wenn er nicht existiert oder zu einem anderen Schlüssel gehört.
GET/api/v1/infra/domains/{domain}/runs
Ihre Läufe für eine Domain, neueste zuerst: ID, Zeitpunkt, Status, Bewertung und Anzahl der Änderungen. Akzeptiert limit (1 bis 100, standardmäßig 30) und before, eine Lauf-ID.
GET/api/v1/infra/diff
Derselbe Vergleich zwischen zwei gespeicherten Läufen, ?from=<id>&to=<id>. Sie benötigen Zugriff auf beide.
GET/api/v1/infra/checks
Jeder Abschnitt mit seiner Gewichtung, der Bewertungsversion und den Grenzwerten.
Einzelprüfungen
Jeder Aufruf beantwortet eine Frage und speichert keinen Verlauf. Ein Tool führt einen Teil der Infrastrukturprüfung selbstständig aus, mit Ausnahme des Header-Tools, das eine Nachricht liest, die Sie bereits erhalten haben.
Schnellstart
Prüfung auswählen
Wählen Sie das Tool aus der folgenden Liste aus und übergeben Sie die Domain, die Adresse oder die IP, nach der es fragt.
Anfrage
curl -s 'https://email-spam-tester.com/api/v1/tools/spf?domain=example.com'Status und Ergebnisse lesen
Jedes Tool antwortet mit einem Status und seinen Ergebnissen. Die darauf folgenden Felder hängen vom Tool ab.
Antwort
{ "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} }
Endpunkte
GET/api/v1/tools/spf
Der SPF-Eintrag einer Domain: seine Syntax, alle verfolgten include- und redirect-Verweise und die DNS-Abfragen, die der gesamte Baum auf das Limit von zehn anrechnet. Übergeben Sie ?domain=example.com.
GET/api/v1/tools/dmarc
Der DMARC-Eintrag einer Domain oder, wenn sie keinen hat, ihrer Organisationsdomain: die Tags, die Richtlinie und ob jede externe Berichtsadresse dem Empfang von Berichten zugestimmt hat. Übergeben Sie ?domain=example.com.
GET/api/v1/tools/dkim
Der für einen Selektor veröffentlichte DKIM-Schlüssel: ob er vorhanden ist und dekodiert werden kann, sein Typ und seine Größe sowie die Widerrufs- und Test-Flags. Übergeben Sie ?domain=example.com&selector=s1.
GET/api/v1/tools/blocklist
Eine IPv4-Adresse, eine IPv6-Adresse oder eine Domain, geprüft anhand der DNS-Blocklisten, die der Bericht verwendet, mit der Antwort jeder Liste. Übergeben Sie ?target=203.0.113.5.
GET/api/v1/tools/mx
Die MX-Einträge einer Domain in der Reihenfolge, in der Absender sie ausprobieren, mit den IPv4- und IPv6-Adressen jedes Hosts. Null MX, eine Domain ohne MX, Hosts, die IP-Adressen oder CNAMEs sind, und Hosts, die nicht aufgelöst werden können, werden ebenso gemeldet wie die MTA-STS- und TLS-RPT-Einträge. Übergeben Sie ?domain=example.com.
GET/api/v1/tools/bimi
Die BIMI-Konfiguration einer Domain in vier Schritten: die von BIMI vorausgesetzte DMARC-Richtlinie, der Eintrag unter default._bimi, das anhand des Tiny-PS-Profils geprüfte SVG-Logo und das Markenzertifikat mit seinem Typ, seinen Domains und seinem Ablaufdatum. Übergeben Sie ?domain=example.com und &selector= für einen anderen Selektor als default.
GET/api/v1/tools/ptr
Die PTR-Einträge einer Adresse und ob einer dieser Namen wieder zu ihr aufgelöst wird. Eine fehlgeschlagene Abfrage ist ein error; ein fehlender Eintrag ist ein fail. Übergeben Sie ?ip=8.8.8.8.
GET/api/v1/tools/mta-sts
Der MTA-STS-Eintrag einer Domain und die Richtliniendatei, auf die er verweist: der Modus, die aufgeführten Hosts und alle MX-Hosts, die von der Richtlinie nicht erfasst werden. Übergeben Sie ?domain=example.com.
GET/api/v1/tools/tls-rpt
Der TLS-RPT-Eintrag einer Domain und die Adressen, die ihre Berichte empfangen. Übergeben Sie ?domain=example.com.
GET/api/v1/tools/dnssec
Ob die Zone einer Domain signiert, unsigniert oder fehlerhaft ist, ermittelt anhand ihrer DNSKEY- und DS-Einträge. Eine ungültige Signatur wird von einem Resolver-Ausfall unterschieden. Übergeben Sie ?domain=example.com.
GET/api/v1/tools/dane
Die TLSA-Einträge der MX-Hosts, verglichen mit dem Zertifikat, das ein Host vorlegt, sofern dieses Zertifikat gelesen werden konnte. Übergeben Sie ?domain=example.com.
GET/api/v1/tools/smtp
STARTTLS und das Zertifikat auf den ersten beiden MX-Hosts: TLS-Version, Aussteller, Ablaufdatum und ob die Zertifikatskette und der Name gültig sind. Wir stellen nur Verbindungen zu Hosts unter der von Ihnen abgefragten Domain her und überspringen E-Mail-Anbieter, und ein Ergebnis pro Adresse wird 6 Stunden lang gemeinsam genutzt. Es wird keine E-Mail gesendet. Übergeben Sie ?domain=example.com.
GET/api/v1/tools/ns
Die Nameserver einer Domain und ob ihre Zone einen SOA-Eintrag hat. Ein einzelner Nameserver ist eine Warnung. Übergeben Sie ?domain=example.com.
GET/api/v1/tools/registration
Wann die Registrierung einer Domain abläuft, ermittelt über RDAP. Weniger als 30 verbleibende Tage sind eine Warnung. Eine Zone ohne RDAP-Dienst antwortet mit skipped. Übergeben Sie ?domain=example.com.
POST/api/v1/tools/header
Die Header einer empfangenen Nachricht, gesendet als JSON {"headers": "..."} oder als text/plain: die Route von Hop zu Hop mit Verzögerungen, TLS und Uhrabweichung, die eigenen Authentication-Results des Empfängers, die Übereinstimmung der Domains von From, DKIM d= und Return-Path sowie die DKIM-, ARC-, Abmelde- und Spamfilter-Header. Alles nach der ersten Leerzeile wird ungelesen verworfen. Die Header werden im Arbeitsspeicher verarbeitet und weder gespeichert noch zwischengespeichert oder protokolliert.
Prüfen Sie die Domain jede Nacht.
Testen Sie die E-Mail, bevor sie versendet wird.
Allen Produkten gemeinsam
Zugriff, Schlüssel, das Berichtsformat, Status, Fehler sowie OpenAPI und llms.txt für Maschinen.
Authentifizierung
Es gibt keine. Kein Schlüssel muss angefordert, kein Header gesetzt und kein Konto erstellt werden. Der zurückgegebene Slug ist die Zugriffsberechtigung: Wer ihn besitzt, kann diesen Bericht lesen, und niemand sonst kann ihn erraten.
Persönliche API-Schlüssel
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.
Bericht lesen
Die Felder, die die Antwort enthalten, in der Reihenfolge, in der Sie sie wahrscheinlich benötigen.
| score_ours | 0 bis 100. Unser Modell. Authentifizierung und Infrastruktur haben das größte Gewicht, weil sie über die Zustellung entscheiden, bevor ein Filter ein Wort des Nachrichtentexts liest. |
| score_compat | 0 bis 10. Bildet die SpamAssassin-ähnliche Zahl nach, die bereits für Vergleiche verwendet wird, sodass der Bericht mit dem vergleichbar ist, was jemand anderswo gesehen hat. |
| subscores | Dieselbe Skala von 0 bis 100 pro Abschnitt: auth, infra_spam, content, compliance. |
| checks[] | Alle 42, jeweils mit einem Status, einem einzeiligen Ergebnis, den Belegen, auf deren Grundlage entschieden wurde, und den Auswirkungen auf die beiden Bewertungen. |
| checks[].citations | Woher der Befund stammt: der Abschnitt des RFC, wörtlich zitiert, und die Seite, auf der Google seine eigene Anforderung nennt. Von Hand kuratiert statt generiert, sodass Sie sich darauf verlassen können. |
| fixes[] | Was in welcher Reihenfolge zu ändern ist und wie viele Punkte jede Änderung wert ist. Die Zugewinne werden durch eine erneute Bewertung des Berichts berechnet, nicht geschätzt. |
| complete | False, wenn eine Prüfung nicht ausgeführt werden konnte. Ein ungeprüfter Punkt gilt niemals als bestanden. Betrachten Sie die Punktzahl daher als optimistisch, bis dieser Wert true ist. |
| report_url | Die für Menschen lesbare Seite. Geben Sie diese einer Person statt einer Wand aus JSON. |
Status
Eine Prüfung hat einen von fünf Status, und der Unterschied zwischen zweien davon ist wichtiger, als es scheint.
| pass | Die Prüfung wurde ausgeführt und hat keinen Fehler gefunden. |
| warn | Sollte behoben werden. Kostet Punkte. |
| fail | Beeinträchtigt die Zustellung. Kostet mehr Punkte. |
| übersprungen | Nicht zutreffend. Keine Anhänge zum Scannen, kein HTML-Teil zum Gewichten. Gilt nicht als bestanden. |
| Fehler | Wir konnten es nicht feststellen. Wird von der Bewertung ausgeschlossen und gekennzeichnet, statt als bestanden gewertet zu werden. |
analysis_status durchläuft received, analyzing, checks_ready, failed. ai_status durchläuft pending, running, ready, fallback, error. Der deterministische Bericht ist bei checks_ready endgültig; ai_status fügt immer nur den Plan hinzu.
Was zurückkommen kann
| 202 | Die Adresse ist reserviert und es ist keine Nachricht eingegangen. Der Antworttext enthält die Adresse, den Ablaufzeitpunkt und die Sprache, sodass ein Aufrufer, der die Reservierung nicht erstellt hat, sie dennoch anzeigen kann. |
| 404 | Kein solcher Slug. Hat nie existiert oder die Reservierung wurde vergessen. |
| 410 | Die Adresse ist abgelaufen, bevor eine Nachricht eingegangen ist. |
| 409 | Sie haben versucht, die Sprache zu ändern, nachdem die Nachricht bereits eingegangen war. |
| 429 | Das Limit für kostenlose Tests für Ihre Adresse. Derzeit gibt es bei diesem Dienst kein Limit pro Person; falls jemals eines festgelegt wird, gibt der Antworttext an, wann es zurückgesetzt wird. |
Vier wissenswerte Dinge
Eine Nachricht pro Adresse
Die zweite wird abgelehnt. Ihr vorheriger Bericht bleibt unverändert, und genau das ist der Zweck.
Eine Stunde zur Nutzung
Die Adresse läuft ab; der Bericht nicht. Berichtslinks sind dauerhaft, sodass ein in ein Ticket eingefügter Link weiterhin funktioniert.
Von der Plattform senden
Wenn Sie eine Kampagne über ein persönliches Konto testen, messen Sie dieses Konto. Fast alles im Abschnitt zur Authentifizierung betrifft die Sendeinfrastruktur, nicht den Text.
Nach der Korrektur erneut testen
Die erwarteten Verbesserungen werden jeweils für eine einzelne Korrektur berechnet und lassen sich nicht kombinieren. Der zweite Bericht liefert den tatsächlichen Wert.
Für Maschinen
- /api/openapi.json Die OpenAPI-Beschreibung, generiert aus demselben Code, der die API bereitstellt.
- /llms.txt, /llms-full.txt Eine kurze Übersicht dieser Website für Sprachmodelle gemäß der llms.txt-Konvention und eine längere Version mit dem gesamten Ablauf und den Berichtsfeldern in einer Datei.
- /mcp Ein MCP-Server mit derselben Funktion und blockierendem Warten, was besser ist als Polling aus einem Modell heraus.
- For agents Die Agentenseite: wann dies verwendet werden sollte, wie eine übersprungene Prüfung im Vergleich zu einer bestandenen zu lesen ist und bei welchen Ergebnissen es sich um DNS-Einträge handelt, die eine Person ändern muss, statt um Text, den ein Agent bearbeiten kann.
GET/api/health
Erreichbarkeitsprüfung. Keine Authentifizierung, keine Seiteneffekte.
Probieren Sie zuerst einen Test manuell aus
Es dauert etwa eine Minute und zeigt Ihnen genau, was das JSON beschreibt.
Testadresse anfordernSandbox.
Jeder Endpunkt mit einer Schaltfläche, die ihn im Live-Dienst ausführt. Hier ist kein Schlüssel erforderlich, daher ist eine Anfrage, die Sie von dieser Seite senden, eine echte Anfrage: Sie reserviert eine echte Adresse und wird gezählt.
In der Sandbox testen