Email Spam Tester

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

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

langBahasa 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_campaignDiteruskan 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.

Polling ini, bukan laporan. analysis_status mencapai checks_ready terlebih dahulu, dan rencana AI tersedia di bawah ai_status sekitar satu menit kemudian, sehingga pemanggil yang hanya menginginkan pemeriksaan deterministik tidak perlu menunggu rencana tersebut.

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.

Pesan mentah dihapus sesuai jadwalnya sendiri, lebih cepat daripada laporan. Setelah itu endpoint ini menjawab dengan alasannya, bukan sumbernya.

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

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

  1. 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'
  2. 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"}
        ]
      }
    }
  3. 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)'
domainWajib. Menerima input yang diterima alat: domain, URL, alamat email.
ipAlamat pengiriman Anda. Ulangi untuk menambahkan lebih banyak, hingga 6.
selectorSelector DKIM. Ulangi untuk menambahkan lebih banyak, hingga 10. Setiap selector yang Anda berikan harus ada, atau bagian dkim gagal.
heloNama yang diberikan server Anda dalam HELO, dibandingkan dengan PTR-nya.
accountUntuk siapa permintaan ini dibuat. Wajib dengan kunci yang melayani banyak orang.
checksBagian yang akan dijalankan, dipisahkan koma. Semuanya secara default.
difftrue membandingkan proses ini dengan proses terakhir Anda untuk domain tersebut.
since7d, 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.
baselineID salah satu proses Anda yang akan dibandingkan. Mengaktifkan diff.
freshtrue 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

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

Semuanya memberikan respons 200 dengan status dan daftar temuan, masing-masing dengan kode dan parameternya. Statusnya adalah pass, warn, fail, atau error, dan alat yang juga digunakan dalam pemeriksaan infrastruktur dapat memberikan unknown atau skipped. Pencarian yang kehabisan waktu atau daftar yang menolak kueri tidak pernah dihitung sebagai pass. Batasnya 30 permintaan per menit dan 300 per hari per IP untuk seluruh alat; di atas batas tersebut, responsnya adalah 429 dengan Retry-After.

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.

Itu juga berarti slug perlu diperlakukan seperti kata sandi. Laporan menampilkan baris subjek, pengirim, alamat pantulan, dan sumber lengkap pesan kepada siapa pun yang memiliki tautannya.

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_ours0 hingga 100. Model kami. Autentikasi dan infrastruktur memiliki bobot terbesar, karena keduanya menentukan pengiriman sebelum filter membaca satu kata pun dari salinan.
score_compat0 hingga 10. Mereproduksi angka bergaya SpamAssassin yang sudah biasa dibandingkan, sehingga laporan dapat dibandingkan dengan apa yang dilihat seseorang di tempat lain.
subscoresSkala 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[].citationsAsal 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.
completeFalse ketika suatu pemeriksaan tidak dapat dijalankan. Item yang tidak diperiksa tidak pernah dianggap lulus, jadi anggap skor terlalu optimistis hingga nilainya true.
report_urlHalaman 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.

passPemeriksaan dijalankan dan tidak menemukan masalah.
warnPerlu diperbaiki. Mengurangi poin.
failAkan merugikan pengiriman Anda. Mengurangi lebih banyak poin.
lewatiTidak berlaku. Tidak ada lampiran untuk dipindai, tidak ada bagian HTML untuk dinilai. Bukan status lulus.
kesalahanKami 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

202Alamat 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.
404Slug tersebut tidak ada. Tidak pernah ada, atau pencadangannya telah dilupakan.
410Alamat kedaluwarsa sebelum pesan tiba.
409Anda mencoba mengubah bahasa setelah pesan tiba.
429Batas 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

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 pengujian

Sandbox.

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