API pemeriksaan spam: email,
kotak masuk, dan domain
Kirim satu pesan nyata kepada kami, atau berikan hanya domain. Semua respons dalam JSON.
Tanpa kunci, tanpa akun.
Permintaan
# 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'
Respons
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}]
}Permintaan
# 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'
Respons
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"}
]}
}Permintaan
# 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'
Respons
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"}]
}Pilih yang Anda perlukan
Di halaman ini
Pengujian email
Kami membaca satu pesan nyata secara menyeluruh: konten, tanda tangan, header, dan server yang mengirimkannya. Anda mendapatkan skor, daftar perbaikan, dan setiap pemeriksaan yang mendasarinya.
Mulai cepat
Tiga panggilan. Tanpa kunci, tanpa akun, tanpa pendaftaran. Dua permintaan dan satu email. Panggilan ketiga hanya diperlukan karena analisis memerlukan waktu beberapa detik.
Pesan alamat
Kirim POST ke endpoint kotak masuk. Anda akan menerima alamat yang menerima tepat satu pesan dan kedaluwarsa dalam satu jam, beserta slug yang menjadi kunci untuk semua hal lainnya.
Permintaan
# 1. reserve a single-use address curl -sX POST 'https://email-spam-tester.com/api/v1/inbox?lang=en'Respons
{ "address": "test-<slug>@t.email-spam-tester.com", "slug": "<slug>", "expires_at": "2026-01-01T12:00:00Z" }Kirim pesan asli ke alamat tersebut
Melalui SMTP, dari platform yang akan mengirim kampanye. Separuh pemeriksaan membaca header yang ditambahkan platform pengiriman Anda, sehingga pesan yang dibuat secara manual mengukur hal yang salah.
Permintaan
# 2. send your message to that address, from your own platform To: test-<slug>@t.email-spam-tester.comLakukan polling status, lalu baca laporan
Endpoint status berukuran beberapa ratus byte dan memberi tahu Anda apakah laporan lengkap sudah layak diambil. Laporan itu sendiri terdiri dari beberapa ribu baris.
Permintaan
# 3. poll curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>/status'Respons
{ "slug": "<slug>", "analysis_status": "checks_ready", "ai_status": "running", "checks_done": 42, "checks_total": 42 }Permintaan
# 4. read the report once analysis_status is checks_ready curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>'Respons
{ "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"}} ] }
Pesan alamat, kirim pesan yang hendak Anda kirim ke daftar Anda, baca laporannya. Semua yang ditampilkan halaman tersedia dalam JSON, termasuk skor, seluruh 42 pemeriksaan beserta buktinya, dan bagian standar yang mendasari setiap temuan.
100.000 laporan pertama gratis, tanpa kunci dan tanpa akun. Jika Anda menghubungkan agen alih-alih skrip, server MCP lebih cocok daripada polling.
Endpoint
Alamat dasar https://email-spam-tester.com. Semuanya merespons dengan JSON.
POST/api/v1/inbox
Mencadangkan alamat sekali pakai. Kedua parameter bersifat opsional.
| lang | Bahasa yang akan digunakan untuk menulis rencana perbaikan dan temuan per pemeriksaan, dalam bentuk kode ISO. Diputuskan sekarang karena pesan tiba melalui SMTP beberapa menit kemudian dan tidak membawa petunjuk tentang siapa yang menunggunya. Kode yang tidak dikenal akan kembali menggunakan bahasa Inggris. |
| utm_source, utm_medium, utm_campaign | Diteruskan ke analitik kami. Berguna jika Anda mengukur integrasi Anda sendiri. |
GET/api/v1/tests/{slug}/status
Ringan untuk dipolling. Mengembalikan dua bidang status dan sejauh mana pemeriksaan telah berjalan, tanpa yang lain.
GET/api/v1/tests/{slug}
Seluruh laporan. Merespons 202 selama alamat dicadangkan dan belum ada yang tiba, lalu 200 setelah ada yang tiba.
GET/api/v1/tests/{slug}/message
Pesan persis seperti saat dikirimkan: setiap header dalam urutan wire, kedua isi pesan, daftar lampiran, dan sumber mentah. Diambil secara terpisah karena laporan dipolling dan data ini dapat mencapai satu megabita.
PUT/api/v1/tests/{slug}/locale
Mengubah bahasa reservasi yang belum digunakan. Untuk agen yang mengetahui bahasa yang dibaca penggunanya setelah agen tersebut meminta alamat. Ditolak setelah pesan tiba, karena pada saat itu analisis sedang berjalan.
Penempatan kotak masukBeta
Kirim satu pesan ke daftar kotak masuk pengujian dan lihat tempat pesan tersebut masuk di Gmail, Outlook, Yahoo, dan penyedia lainnya: Kotak Masuk, Promosi, atau Spam.
Mulai cepat
Buat pengujian
Lakukan POST ke endpoint penempatan. Anda akan mendapatkan penanda dan kotak masuk pengujian.
Permintaan
# 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}'Respons
{ "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"} ] } }Kirim satu pesan ke setiap kotak masuk
Masukkan penanda dalam subjek dan kirim dari platform yang biasa Anda gunakan, ke semua alamat sekaligus.
Permintaan
# 2. one message to every address, with the marker in the subject Subject: October invoice est-3f9a1c7e2b4d6a80c5e1f2d3 To: <seed>, <mailbox>, ...Lakukan polling untuk folder
Setiap alamat akan terisi dengan penyedia dan foldernya. Lakukan polling hingga status tidak lagi waiting.
Permintaan
# 3. poll for the folders curl -s 'https://email-spam-tester.com/api/v1/placement/<slug>'Respons
{ "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"} ] } }
Endpoint
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.
Pemeriksaan infrastruktur
Satu permintaan GET memeriksa konfigurasi email suatu domain tanpa mengirim apa pun, menyimpan hasilnya, dan memberi tahu Anda apa yang berubah sejak eksekusi terakhir. Tidak memerlukan kunci. Di cron, baris di bawah menghasilkan kode keluar bukan nol ketika domain rusak atau konfigurasinya berubah secara signifikan.
Mulai cepat
Lakukan satu GET
Berikan domain. ip menambahkan alamat pengiriman Anda, dan selector menentukan selector DKIM yang akan dibaca.
Permintaan
curl -s 'https://email-spam-tester.com/api/v1/infra/check?domain=example.com&selector=mail&diff=true'Baca hasilnya
ok adalah jawaban untuk skrip, dan sections menunjukkan bagian mana yang gagal.
Respons
{ "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"} ] } }Masukkan ke cron
Dengan diff=true, setiap proses dibandingkan dengan proses terakhir Anda, dan jq mengubah jawaban menjadi kode keluar.
Permintaan
# 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 | Wajib. Menerima input yang diterima alat: domain, URL, alamat email. |
| ip | Alamat pengiriman Anda. Ulangi untuk menambahkan lebih banyak, hingga 6. |
| selector | Selector DKIM. Ulangi untuk menambahkan lebih banyak, hingga 10. Setiap selector yang Anda berikan harus ada, atau bagian dkim gagal. |
| helo | Nama yang diberikan server Anda dalam HELO, dibandingkan dengan PTR-nya. |
| account | Untuk siapa permintaan ini dibuat. Wajib dengan kunci yang melayani banyak orang. |
| checks | Bagian yang akan dijalankan, dipisahkan koma. Semuanya secara default. |
| diff | true membandingkan proses ini dengan proses terakhir Anda untuk domain tersebut. |
| since | 7d, 12h atau tanggal ISO 8601. Membandingkan dengan proses Anda yang paling dekat dengan waktu tersebut dalam rentang 12 jam, atau proses terakhir sebelumnya. Mengaktifkan diff. |
| baseline | ID salah satu proses Anda yang akan dibandingkan. Mengaktifkan diff. |
| fresh | true melewati cache 60 detik. |
Membaca jawaban
Pemeriksaan yang selesai mengembalikan 200, dan verdict ada di body. status adalah status terburuk dari bagian wajib: spf, dkim, dmarc, ptr, blocklist_ip, blocklist_domain, mx, dan smtp. unknown dalam bagian wajib dihitung sebagai warn. ok bernilai true saat status adalah pass atau warn. score berkisar dari 0 hingga 100 untuk bagian wajib yang memberikan jawaban, dan bernilai null saat error dan unknown menyisakan kurang dari setengah bobot yang berlaku. mta_sts, tls_rpt, bimi, dnssec, dane, ns, dan registration dilaporkan dan dibandingkan, tetapi tidak memengaruhi ok atau score.
Sebuah bagian dapat berstatus pass, warn, fail, error (kami tidak dapat memeriksanya), unknown (informasi tidak cukup), atau skipped (tidak berlaku). skipped tidak memengaruhi hasil, dan alasannya ada di not_checked. dkim_signature dan alignment selalu ada, karena keduanya memerlukan pesan nyata.
Apa yang diubah oleh ip dan selector
PTR dan blocklist berkaitan dengan alamat, jadi sebuah run memerlukan beberapa alamat. Run menggunakan nilai ip yang Anda berikan. Jika tidak ada, run mengambil hingga empat alamat dari host MX Anda dan dari term ip4: dan ip6: beralamat tunggal dalam rekaman SPF root. Alamat milik penyedia email yang dikenal dicantumkan sebagai managed dan tidak diperiksa, dan jika tidak ada alamat yang tersisa, ptr dan blocklist_ip menjawab skipped. selector tidak dapat dibaca dari DNS, jadi sebuah run mencoba selector Anda, selector yang ditemukan oleh run Anda sebelumnya, dan daftar nama umum. Tidak menemukan apa pun tidak membuktikan apa pun, dan dkim menjawab unknown. Jika Anda mengirim dari server sendiri, berikan keduanya.
Apa yang berubah
Setiap entri dalam diff.changes memiliki path, kind (added, removed, changed), severity (critical, warning, info), dan effect (worsened, improved, neutral). Hanya critical dan warning yang menetapkan diff.changed, sehingga kunci DKIM yang dirotasi dengan panjang yang sama, alamat MX baru, atau sertifikat yang diperpanjang tidak menyebabkan baris cron gagal. diff.worsened mengikuti effect dari setiap perubahan. Pada proses pertama, tidak ada yang dapat dibandingkan, dan diff.first_run menyatakannya.
Baseline selalu merupakan run milik Anda sendiri, jadi orang lain yang memeriksa domain di antara dua run Anda tidak menyembunyikan apa pun. Apa pun yang tidak dapat kami baca kali ini masuk ke diff.not_compared dengan nilai terakhir yang diketahui tetap disimpan, yang berarti perubahan yang dibuat selama gangguan akan muncul setelah lookup kembali berfungsi. Run dengan ip atau selector yang berbeda tetap berada dalam seri yang sama, dan hal yang tidak diperiksanya juga tidak dibandingkan.
Mengapa pemeriksaan terjadwal harus menggunakan kunci
Tanpa kunci, riwayat Anda terikat pada hash berkunci dari alamat IP Anda, jadi riwayat berakhir saat alamat berubah, dan orang-orang di balik satu alamat berbagi riwayat tersebut: run milik kolega memindahkan baseline Anda. Dengan kunci API pribadi dalam Authorization: Bearer, riwayat mengikuti kunci tersebut. Run dengan kunci disimpan selama 365 hari dan hanya dapat dibuka dengan kunci tersebut. Run tanpa kunci disimpan selama 30 hari dan dapat dibuka oleh siapa pun yang memiliki ID-nya.
6 permintaan per menit dan 50 per hari per IP, atau 30 dan 500 per kunci. Di atas batas tersebut, jawaban adalah 429 dengan Retry-After. Permintaan identik dalam waktu 60 detik berasal dari cache, ditandai cached: true, tidak menulis run, dan tidak dihitung. Membaca run yang disimpan mengizinkan 120 permintaan per menit per klien. 503 dengan Retry-After berarti terlalu banyak pemeriksaan sedang berjalan, atau, saat membaca run yang disimpan, penyimpanan tidak tersedia. 401 berarti kunci salah. 422 membawa detail.code: invalid_domain, invalid_ip, invalid_selector, invalid_check, invalid_since, unknown_baseline, atau account_required.
Endpoint
GET/api/v1/infra/check
Menjalankan pemeriksaan. Parameter ada dalam tabel di atas.
GET/api/v1/infra/runs/{public_id}
Satu eksekusi tersimpan, lengkap. 404 jika tidak ada atau milik kunci lain.
GET/api/v1/infra/domains/{domain}/runs
Eksekusi Anda untuk suatu domain, yang terbaru terlebih dahulu: id, waktu, status, skor, dan jumlah perubahan. Menerima limit (1 hingga 100, 30 secara default) dan before, sebuah id eksekusi.
GET/api/v1/infra/diff
Perbandingan yang sama antara dua eksekusi tersimpan, ?from=<id>&to=<id>. Anda memerlukan akses ke keduanya.
GET/api/v1/infra/checks
Setiap bagian dengan bobotnya, versi skor, dan batasnya.
Pemeriksaan tunggal
Setiap panggilan menjawab satu pertanyaan dan tidak menyimpan riwayat. Sebuah alat menjalankan satu bagian pemeriksaan infrastruktur secara mandiri, kecuali alat header, yang membaca pesan yang sudah Anda terima.
Mulai cepat
Pilih pemeriksaan
Pilih alat dari daftar di bawah dan berikan domain, alamat, atau IP yang diminta.
Permintaan
curl -s 'https://email-spam-tester.com/api/v1/tools/spf?domain=example.com'Baca status dan temuan
Setiap alat memberikan status dan temuannya. Kolom setelahnya bergantung pada alat tersebut.
Respons
{ "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} }
Endpoint
GET/api/v1/tools/spf
Data SPF suatu domain: sintaksnya, setiap include dan redirect yang diikuti, serta jumlah pencarian DNS yang digunakan seluruh pohon terhadap batas sepuluh. Kirimkan ?domain=example.com.
GET/api/v1/tools/dmarc
Data DMARC suatu domain, atau domain organisasinya jika tidak memilikinya: tag, kebijakan, dan apakah setiap alamat laporan eksternal telah menyetujui untuk menerima laporan. Kirimkan ?domain=example.com.
GET/api/v1/tools/dkim
Kunci DKIM yang dipublikasikan untuk suatu selector: apakah kunci tersebut ada dan dapat didekodekan, jenis dan ukurannya, serta flag pencabutan dan pengujian. Kirimkan ?domain=example.com&selector=s1.
GET/api/v1/tools/blocklist
Alamat IPv4, alamat IPv6, atau domain yang diperiksa terhadap daftar blokir DNS yang digunakan laporan, beserta jawaban dari setiap daftar. Kirimkan ?target=203.0.113.5.
GET/api/v1/tools/mx
Record MX suatu domain dalam urutan yang dicoba oleh pengirim, beserta alamat IPv4 dan IPv6 setiap host. Null MX, domain tanpa MX, host yang berupa alamat IP atau CNAME, dan host yang tidak dapat di-resolve dilaporkan, demikian pula record MTA-STS dan TLS-RPT. Berikan ?domain=example.com.
GET/api/v1/tools/bimi
Konfigurasi BIMI suatu domain dalam empat langkah: kebijakan DMARC yang diwajibkan BIMI, record di default._bimi, logo SVG yang diperiksa terhadap profil Tiny PS, dan sertifikat merek beserta jenis, domain, dan masa berlakunya. Berikan ?domain=example.com, dan &selector= untuk selector selain default.
GET/api/v1/tools/ptr
Record PTR dari suatu alamat dan apakah salah satu nama tersebut di-resolve kembali ke alamat itu. Pencarian yang gagal menghasilkan status error; record yang tidak ada menghasilkan status fail. Gunakan ?ip=8.8.8.8.
GET/api/v1/tools/mta-sts
Record MTA-STS dari suatu domain dan file kebijakan yang dirujuknya: mode, host yang tercantum, dan setiap host MX yang tidak disertakan oleh kebijakan. Berikan ?domain=example.com.
GET/api/v1/tools/tls-rpt
Record TLS-RPT dari suatu domain dan alamat yang menerima laporannya. Berikan ?domain=example.com.
GET/api/v1/tools/dnssec
Apakah zona suatu domain ditandatangani, tidak ditandatangani, atau rusak, berdasarkan record DNSKEY dan DS. Tanda tangan yang tidak valid dibedakan dari gangguan resolver. Berikan ?domain=example.com.
GET/api/v1/tools/dane
Record TLSA dari host MX, dibandingkan dengan sertifikat yang disajikan oleh host jika sertifikat tersebut dapat dibaca. Berikan ?domain=example.com.
GET/api/v1/tools/smtp
STARTTLS dan sertifikat pada dua host MX pertama: versi TLS, penerbit, tanggal kedaluwarsa, serta apakah rantai dan namanya valid. Kami hanya terhubung ke host di bawah domain yang Anda minta dan melewati penyedia email, dan satu hasil per alamat digunakan bersama selama 6 jam. Tidak ada email yang dikirim. Berikan ?domain=example.com.
GET/api/v1/tools/ns
Server nama dari suatu domain dan apakah zonanya memiliki record SOA. Satu server nama menghasilkan warn. Berikan ?domain=example.com.
GET/api/v1/tools/registration
Kapan pendaftaran suatu domain berakhir, berdasarkan RDAP. Sisa waktu kurang dari 30 hari menghasilkan warn. Zona tanpa layanan RDAP menghasilkan skipped. Berikan ?domain=example.com.
POST/api/v1/tools/header
Header pesan yang diterima, dikirim sebagai JSON {"headers": "..."} atau sebagai text/plain: rute dari hop ke hop beserta penundaan, TLS, dan penyimpangan waktu, Authentication-Results milik penerima sendiri, alignment domain From, DKIM d=, dan Return-Path, serta header DKIM, ARC, berhenti berlangganan, dan filter spam. Semua setelah baris kosong pertama dibuang tanpa dibaca. Header diproses dalam memori dan tidak disimpan, di-cache, atau dicatat.
Periksa domain setiap malam.
Uji email sebelum dikirim.
Digunakan bersama oleh setiap produk
Akses, kunci, format laporan, status, kesalahan, serta OpenAPI dan llms.txt untuk mesin.
Autentikasi
Tidak ada. Tidak ada kunci yang perlu diminta, tidak ada header yang perlu ditetapkan, tidak ada akun yang perlu dibuat. Slug yang Anda terima adalah kapabilitasnya: siapa pun yang memilikinya dapat membaca laporan tersebut, dan tidak ada orang lain yang dapat menebaknya.
Kunci API pribadi
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.
Membaca laporan
Bidang yang memuat jawaban, dalam urutan yang mungkin Anda inginkan.
| score_ours | 0 hingga 100. Model kami. Autentikasi dan infrastruktur memiliki bobot terbesar, karena keduanya menentukan pengiriman sebelum filter membaca satu kata pun dari salinan. |
| score_compat | 0 hingga 10. Mereproduksi angka bergaya SpamAssassin yang sudah biasa dibandingkan, sehingga laporan dapat dibandingkan dengan apa yang dilihat seseorang di tempat lain. |
| subscores | Skala 0 hingga 100 yang sama per bagian: auth, infra_spam, content, compliance. |
| checks[] | Semua 42 pemeriksaan, masing-masing dengan status, temuan satu baris, bukti yang menjadi dasar keputusan, dan dampaknya terhadap kedua skor. |
| checks[].citations | Asal temuan: bagian RFC, dikutip secara verbatim, dan halaman tempat Google menyatakan persyaratannya sendiri. Disusun secara manual alih-alih dihasilkan, sehingga dapat diandalkan. |
| fixes[] | Hal yang perlu diubah, secara berurutan, beserta poin yang diperoleh dari setiap perubahan. Peningkatan dihitung dengan menghitung ulang skor laporan, bukan diperkirakan. |
| complete | False ketika suatu pemeriksaan tidak dapat dijalankan. Item yang tidak diperiksa tidak pernah dianggap lulus, jadi anggap skor terlalu optimistis hingga nilainya true. |
| report_url | Halaman yang dapat dibaca manusia. Berikan halaman tersebut kepada seseorang, bukan setumpuk JSON. |
Status
Sebuah pemeriksaan memiliki satu dari lima status, dan perbedaan antara dua di antaranya lebih penting daripada yang terlihat.
| pass | Pemeriksaan dijalankan dan tidak menemukan masalah. |
| warn | Perlu diperbaiki. Mengurangi poin. |
| fail | Akan merugikan pengiriman Anda. Mengurangi lebih banyak poin. |
| lewati | Tidak berlaku. Tidak ada lampiran untuk dipindai, tidak ada bagian HTML untuk dinilai. Bukan status lulus. |
| kesalahan | Kami tidak dapat mengetahuinya. Dikecualikan dari skor dan ditandai, alih-alih dihitung sebagai status lulus. |
analysis_status menjalankan received, analyzing, checks_ready, failed. ai_status menjalankan pending, running, ready, fallback, error. Laporan deterministik bersifat final pada checks_ready; ai_status hanya menambahkan rencana.
Respons yang mungkin diterima
| 202 | Alamat telah dicadangkan dan belum ada pesan yang tiba. Isi respons memuat alamat, waktu kedaluwarsa, dan bahasa, sehingga pemanggil yang tidak membuat pencadangan tetap dapat menampilkannya. |
| 404 | Slug tersebut tidak ada. Tidak pernah ada, atau pencadangannya telah dilupakan. |
| 410 | Alamat kedaluwarsa sebelum pesan tiba. |
| 409 | Anda mencoba mengubah bahasa setelah pesan tiba. |
| 429 | Batas pengujian gratis untuk alamat Anda. Saat ini tidak ada batas per orang pada layanan ini; jika batas tersebut ditetapkan, isi respons menyatakan kapan batas itu direset. |
Empat hal yang perlu diketahui
Satu pesan per alamat
Pesan kedua ditolak. Laporan Anda sebelumnya tetap utuh, dan memang itulah tujuannya.
Satu jam untuk menggunakannya
Alamat tersebut kedaluwarsa; laporannya tidak. Tautan laporan bersifat permanen, jadi tautan yang ditempelkan ke tiket akan tetap berfungsi.
Kirim dari platform
Menguji kampanye dari akun pribadi mengukur akun tersebut. Hampir semua hal di bagian autentikasi berkaitan dengan infrastruktur pengiriman, bukan teksnya.
Uji ulang setelah memperbaiki
Perkiraan peningkatan dihitung untuk satu perbaikan pada satu waktu dan tidak dapat digabungkan. Laporan kedua adalah angka yang sebenarnya.
Untuk mesin
- /api/openapi.json Deskripsi OpenAPI, yang dihasilkan dari kode yang sama dengan yang melayani API.
- /llms.txt, /llms-full.txt Peta singkat situs ini untuk model bahasa, dalam konvensi llms.txt, dan versi yang lebih panjang dengan seluruh alur dan kolom laporan dalam satu file.
- /mcp Server MCP dengan kemampuan yang sama dan mekanisme tunggu yang memblokir, yang lebih baik daripada polling dari dalam model.
- For agents Halaman agen: kapan menggunakannya, cara membedakan pemeriksaan yang dilewati dari pemeriksaan yang lulus, dan temuan mana yang merupakan catatan DNS yang harus diubah oleh seseorang, bukan teks yang dapat diedit oleh agen.
GET/api/health
Keaktifan. Tanpa autentikasi, tanpa efek samping.
Coba satu secara manual terlebih dahulu
Prosesnya memerlukan waktu sekitar satu menit dan menunjukkan dengan tepat apa yang dijelaskan oleh JSON.
Dapatkan alamat pengujianSandbox.
Setiap endpoint, dengan tombol yang menjalankannya pada layanan aktif. Tidak ada yang memerlukan kunci di sini, jadi permintaan yang Anda kirim dari halaman ini adalah permintaan nyata: permintaan tersebut mencadangkan alamat nyata dan dihitung.
Coba di sandbox