Email Spam Tester

スパムチェックAPI:
メール、受信トレイ、ドメイン

実際のメッセージを1通送信するか、ドメインだけを指定してください。すべてJSONで応答します。

キーもアカウントも不要です。

リクエスト

# 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'

レスポンス

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

リクエスト

# 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'

レスポンス

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

リクエスト

# 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'

レスポンス

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"}]
}
このページの内容

メールテスト

実際のメッセージを1通、最初から最後まで確認します。対象は、内容、署名、ヘッダー、送信元サーバーです。スコア、修正項目のリスト、その根拠となるすべてのチェック結果を取得できます。

クイックスタート

3回の呼び出し。キー、アカウント、登録は不要です。 2回のリクエストと1通のメール。3回目の呼び出しが必要なのは、分析に数秒かかるためです。

  1. アドレスを予約

    inboxエンドポイントにPOSTします。正確に1通のメッセージだけを受信し、1時間で期限切れになるアドレスと、その他すべてのキーとなるスラッグが返されます。

    リクエスト

    # 1. reserve a single-use address
    curl -sX POST 'https://email-spam-tester.com/api/v1/inbox?lang=en'

    レスポンス

    {
      "address": "test-<slug>@t.email-spam-tester.com",
      "slug": "<slug>",
      "expires_at": "2026-01-01T12:00:00Z"
    }
  2. 実際のメッセージをそこに送信

    キャンペーンを送信するプラットフォームから、SMTP経由で送信します。チェックの半数は送信プラットフォームが追加するヘッダーを確認するため、手作業で作成したメッセージでは誤った対象を測定することになります。

    リクエスト

    # 2. send your message to that address, from your own platform
    To: test-<slug>@t.email-spam-tester.com
  3. ステータスをポーリングしてからレポートを取得

    statusエンドポイントのレスポンスは数百バイトで、完全なレポートを取得する段階かどうかを確認できます。レポート自体は数千行に及びます。

    リクエスト

    # 3. poll
    curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>/status'

    レスポンス

    {
      "slug": "<slug>",
      "analysis_status": "checks_ready",
      "ai_status": "running",
      "checks_done": 42,
      "checks_total": 42
    }

    リクエスト

    # 4. read the report once analysis_status is checks_ready
    curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>'

    レスポンス

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

アドレスを予約し、配信リストに送ろうとしていたメッセージを送信して、レポートを確認します。ページに表示されるすべての情報がJSONに含まれています。スコア、根拠を含む42項目すべてのチェック、および各検出結果の根拠となる標準のセクションも含まれます。

最初の100,000件のレポートは、キーもアカウントも不要で無料です。スクリプトではなくエージェントを接続する場合は、ポーリングよりもMCPサーバーの方が適しています。

エンドポイント

ベースアドレスは https://email-spam-tester.com です。すべてJSONで応答します。

POST/api/v1/inbox

1回限り使用できるアドレスを予約します。両方のパラメーターは任意です。

lang修正計画と各チェックの結果を記述する言語をISOコードで指定します。メッセージは数分後にSMTP経由で到着し、誰が待っているかを示す情報を持たないため、この時点で決定します。不明なコードの場合は英語にフォールバックします。
utm_source, utm_medium, utm_campaign当社の分析にそのまま渡されます。独自の連携を測定する場合に役立ちます。

GET/api/v1/tests/{slug}/status

低コストでポーリングできます。2つのステータスフィールドとチェックの進捗状況だけを返します。

レポートではなく、これをポーリングしてください。analysis_status は最初に checks_ready に到達し、AI計画はその1分ほど後に ai_status に入るため、決定論的なチェックだけを必要とする呼び出し元は計画を待つ必要がありません。

GET/api/v1/tests/{slug}

レポート全体です。アドレスが予約済みでまだ何も到着していない間は202で応答し、到着後は200で応答します。

GET/api/v1/tests/{slug}/message

配信されたとおりのメッセージです。ワイヤ上の順序どおりのすべてのヘッダー、両方の本文、添付ファイル一覧、未加工のソースが含まれます。レポートはポーリングされ、これは1メガバイトに達することがあるため、別途取得します。

生メッセージはレポートよりも早く、独自の期限で自動的に削除されます。その後、このエンドポイントはソースではなく理由を返します。

PUT/api/v1/tests/{slug}/locale

まだ使用されていない予約の言語を変更します。アドレスをすでに要求した後で、ユーザーが読む言語を把握するエージェント向けです。メッセージの到着後は、その時点ですでに分析が実行中であるため拒否されます。

受信トレイ配置ベータ

テスト用受信トレイのリストにメッセージを1通送信し、Gmail、Outlook、Yahooなどのプロバイダーで受信トレイ、プロモーション、迷惑メールのどこに届いたかを確認できます。

クイックスタート

  1. テストを作成

    placementエンドポイントにPOSTします。マーカーとテスト用受信トレイが返されます。

    リクエスト

    # 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}'

    レスポンス

    {
      "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. すべての受信トレイに1通ずつ送信

    件名にマーカーを入れ、通常使用しているプラットフォームからすべてのアドレスに一括で送信します。

    リクエスト

    # 2. one message to every address, with the marker in the subject
    Subject: October invoice est-3f9a1c7e2b4d6a80c5e1f2d3
    To: <seed>, <mailbox>, ...
  3. フォルダーをポーリング

    各アドレスにプロバイダーとフォルダーが入力されます。statusがwaitingでなくなるまでポーリングします。

    リクエスト

    # 3. poll for the folders
    curl -s 'https://email-spam-tester.com/api/v1/placement/<slug>'

    レスポンス

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

エンドポイント

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.

インフラストラクチャチェック

1回のGETで、何も送信せずにドメインのメール設定を確認し、結果を保持して、前回の実行から変更された内容を通知します。キーは不要です。cronでは、ドメインが破損している場合や、その設定が重要な形で変更されている場合、以下の行はゼロ以外で終了します。

クイックスタート

  1. GETを1回実行します

    ドメインを渡します。ipには送信元アドレスを追加し、selectorには読み取るDKIMセレクターを指定します。

    リクエスト

    curl -s 'https://email-spam-tester.com/api/v1/infra/check?domain=example.com&selector=mail&diff=true'
  2. 判定を確認します

    スクリプト用の結果はokで、sectionsはどの部分が失敗したかを示します。

    レスポンス

    {
      "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. cronに追加します

    diff=trueを指定すると、各実行結果が前回の結果と比較され、jqがその結果を終了コードに変換します。

    リクエスト

    # 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必須です。ツールと同じもの(ドメイン、URL、メールアドレス)を受け取ります。
ip送信元アドレスです。複数指定する場合は繰り返し指定でき、最大6件です。
selectorDKIMセレクターです。複数指定する場合は繰り返し指定でき、最大10件です。渡すセレクターはすべて存在している必要があり、存在しないものがあればdkimが失敗します。
heloサーバーがHELOで提示する名前を、そのPTRと比較します。
accountリクエストの対象者です。複数のユーザーに提供されるキーでは必須です。
checks実行するセクションをカンマ区切りで指定します。デフォルトではすべてです。
difftrueの場合、この実行をそのドメインの前回の実行と比較します。
since7d、12h、またはISO 8601形式の日付です。その時点から12時間以内で最も近い実行と比較し、該当するものがなければ、その時点より前の最後の実行と比較します。diffを有効にします。
baseline比較対象となる実行のいずれかの id です。diff を有効にします。
freshtrue にすると、60 秒間のキャッシュを使用しません。

応答の読み方

完了したチェックは 200 を返し、判定結果は本文に含まれます。status は必須セクションである spf、dkim、dmarc、ptr、blocklist_ip、blocklist_domain、mx、smtp のうち最も悪いものです。必須セクションの unknown は warn として扱われます。status が pass または warn の場合、ok は true です。score は、応答が得られた必須セクションを対象に 0 から 100 までの値になり、error と unknown によって該当する重みの半分未満しか残らない場合は null です。mta_sts、tls_rpt、bimi、dnssec、dane、ns、registration は報告および比較されますが、ok や score には影響しません。

セクションの状態は pass、warn、fail、error (チェックできませんでした)、unknown (判断材料が不足しています)、skipped (該当しません) のいずれかです。skipped は結果に影響せず、理由は not_checked に含まれます。dkim_signature と alignment は実際のメッセージを必要とするため、常に存在します。

ip と selector による違い

PTR とブロックリストはアドレスに関するため、実行にはアドレスが必要です。渡された ip 値を使用します。指定がない場合は、MX ホスト、およびルート SPF レコード内の単一アドレスの ip4: と ip6: の項目から最大 4 件を取得します。既知のメールプロバイダーのアドレスは managed として一覧に記載され、チェックされません。対象が何も残らない場合、ptr と blocklist_ip は skipped を返します。selector は DNS から読み取れないため、実行時には指定されたもの、以前の実行で見つかったもの、一般的な名前のリストを試します。何も見つからなくても何も証明されないため、dkim は unknown を返します。独自のサーバーから送信する場合は、両方を渡してください。

変更内容

diff.changes の各エントリには、path、kind (added、removed、changed)、severity (critical、warning、info)、effect (worsened、improved、neutral) があります。diff.changed が設定されるのは critical と warning の場合だけなので、同じ長さの DKIM キーへのローテーション、新しい MX アドレス、更新された証明書では cron は反応しません。diff.worsened は、いずれかの変更の effect に従います。初回の実行では比較対象がなく、diff.first_run がそのことを示します。

ベースラインは常に自分の実行のいずれかであるため、自分の 2 回の実行の間に別の人がそのドメインをチェックしても、何も見落とされません。今回読み取れなかったものはすべて、最後に確認できた値を保持したまま diff.not_compared に入ります。つまり、障害中に行われた変更は、検索が再び機能すると表示されます。異なる ip または selector を使用した実行も同じ系列に残り、その実行で確認を要求しなかったものも比較されません。

定期チェックでキーを使う理由

キーがない場合、履歴は IP アドレスのキー付きハッシュに紐づくため、アドレスが変わると途切れます。また、同じアドレスを使用する人同士で履歴が共有されるため、同僚の実行によってベースラインが移動します。Authorization: Bearer に個人用 API キーを指定すると、履歴はそのキーに紐づきます。キーを使用した実行は 365 日間保持され、そのキーでのみ開けます。キーを使用しない実行は 30 日間保持され、id を知っている人なら誰でも開けます。

上限は IP ごとに 1 分あたり 6 リクエスト、1 日あたり 50 リクエスト、またはキーごとに 1 分あたり 30 リクエスト、1 日あたり 500 リクエストです。これを超えると、Retry-After を伴う 429 が返されます。60 秒以内の同一リクエストはキャッシュから返され、cached: true とマークされます。実行は書き込まれず、リクエスト数にもカウントされません。保存済みの実行の読み取りは、クライアントごとに 1 分あたり 120 リクエストまで可能です。Retry-After を伴う 503 は、実行中のチェックが多すぎることを示します。また、保存済みの実行を読み取る場合は、ストレージを利用できないことを示します。401 はキーが正しくないことを示します。422 には detail.code として invalid_domain、invalid_ip、invalid_selector、invalid_check、invalid_since、unknown_baseline、account_required のいずれかが含まれます。

エンドポイント

GET/api/v1/infra/check

チェックを実行します。パラメータは上の表にあります。

GET/api/v1/infra/runs/{public_id}

保存された1回の実行全体です。存在しない場合、または別のキーに属する場合は404です。

GET/api/v1/infra/domains/{domain}/runs

ドメインに対する実行を新しい順に返します: id、時刻、ステータス、スコア、変更数。limit (1~100、デフォルトは30) と、実行idであるbeforeを受け取ります。

GET/api/v1/infra/diff

保存された2回の実行間で同じ比較を行います、?from=<id>&to=<id>。両方へのアクセス権が必要です。

GET/api/v1/infra/checks

各セクションとその重み、スコアのバージョン、制限です。

個別チェック

各呼び出しは1つの問いに答え、履歴を保持しません。ヘッダーツールを除き、各ツールはインフラチェックの一部を単独で実行します。ヘッダーツールは、すでに受信したメッセージを読み取ります。

クイックスタート

  1. チェックを選択

    以下のリストからツールを選択し、そのツールが要求するドメイン、アドレス、または IP を渡します。

    リクエスト

    curl -s 'https://email-spam-tester.com/api/v1/tools/spf?domain=example.com'
  2. ステータスと検出事項を確認

    すべてのツールは、ステータスと検出事項を返します。それ以降のフィールドはツールによって異なります。

    レスポンス

    {
      "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}
    }

エンドポイント

すべてのツールは、ステータスと検出事項のリストを含む200を返します。各検出事項にはコードとそのパラメーターが含まれます。ステータスはpass、warn、fail、errorのいずれかで、インフラストラクチャチェックと共有されるツールはunknownまたはskippedを返すこともあります。タイムアウトした検索や、クエリを拒否したリストがpassとして扱われることはありません。ツール全体でIPごとに1分あたり30リクエスト、1日あたり300リクエストに制限されます。これを超えると、Retry-After付きの429が返されます。

GET/api/v1/tools/spf

ドメインの SPF レコード。その構文、たどったすべての include と redirect、およびツリー全体で発生する DNS ルックアップ数と上限 10 との比較。?domain=example.com を渡します。

GET/api/v1/tools/dmarc

ドメインの DMARC レコード、またはレコードがない場合はその組織ドメインの DMARC レコード。タグ、ポリシー、および各外部レポートアドレスがレポートの受信に同意しているかどうか。?domain=example.com を渡します。

GET/api/v1/tools/dkim

セレクターに対して公開されている DKIM キー。キーが存在してデコードできるか、そのタイプとサイズ、および失効フラグとテストフラグ。?domain=example.com&selector=s1 を渡します。

GET/api/v1/tools/blocklist

レポートで使用する DNS ブロックリストに対して照合した IPv4 アドレス、IPv6 アドレス、またはドメインと、各リストの応答。?target=203.0.113.5 を渡します。

GET/api/v1/tools/mx

送信者が試行する順序でドメインのMXレコードを示し、各ホストのIPv4およびIPv6アドレスも示します。Null MX、MXがないドメイン、IPアドレスまたはCNAMEであるホスト、名前解決できないホストが報告され、MTA-STSおよびTLS-RPTレコードも報告されます。?domain=example.comを指定します。

GET/api/v1/tools/bimi

ドメインのBIMI設定を4つの手順で確認します。BIMIに必要なDMARCポリシー、default._bimiのレコード、Tiny PSプロファイルに照らして検証されたSVGロゴ、ならびに種類、ドメイン、有効期限を含むマーク証明書です。?domain=example.comを指定し、default以外のセレクターを使用する場合は&selector=も指定します。

GET/api/v1/tools/ptr

アドレスのPTRレコードと、それらの名前のいずれかがそのアドレスに正引きできるかを確認します。検索に失敗した場合はerror、レコードがない場合はfailです。?ip=8.8.8.8 を渡します。

GET/api/v1/tools/mta-sts

ドメインのMTA-STSレコードと、その参照先のポリシーファイル(モード、記載されているホスト、ポリシーから除外されているMXホスト)を確認します。?domain=example.com を渡します。

GET/api/v1/tools/tls-rpt

ドメインのTLS-RPTレコードと、そのレポートを受信するアドレスを確認します。?domain=example.com を渡します。

GET/api/v1/tools/dnssec

ドメインのゾーンが署名済み、未署名、破損のいずれであるかを、DNSKEYレコードとDSレコードから確認します。不正な署名とリゾルバーの停止は区別されます。?domain=example.com を渡します。

GET/api/v1/tools/dane

MXホストのTLSAレコードを、そのホストが提示する証明書を読み取れた場合に、その証明書と比較します。?domain=example.com を渡します。

GET/api/v1/tools/smtp

最初の2つのMXホストについて、STARTTLSと証明書(TLSバージョン、発行者、有効期限、証明書チェーンと名前が有効かどうか)を確認します。指定されたドメイン配下のホストにのみ接続し、メールプロバイダーはスキップします。また、アドレスごとに1つの結果が6時間共有されます。メールは送信されません。?domain=example.com を渡します。

GET/api/v1/tools/ns

ドメインのネームサーバーと、そのゾーンにSOAレコードがあるかどうかを確認します。ネームサーバーが1つの場合はwarnです。?domain=example.com を渡します。

GET/api/v1/tools/registration

RDAPから、ドメインの登録期限を確認します。残り30日未満の場合はwarnです。RDAPサービスのないゾーンはskippedになります。?domain=example.com を渡します。

POST/api/v1/tools/header

受信メッセージのヘッダーを、JSON {"headers": "..."}またはtext/plainとして送信します。遅延、TLS、クロックスキューを含むホップごとの経路、受信側独自のAuthentication-Results、From、DKIM d=、Return-Pathの各ドメインのアライメント、およびDKIM、ARC、配信停止、スパムフィルターの各ヘッダーを確認します。最初の空行より後のすべての内容は、読まずに破棄されます。ヘッダーはメモリ内で処理され、保存、キャッシュ、ログ記録はされません。

毎晩ドメインをチェックします。
送信前にメールをテストします。

全製品共通

アクセス、キー、レポート形式、ステータス、エラーに加え、マシン向けのOpenAPIとllms.txtです。

認証

ありません。要求するキーも、設定するヘッダーも、作成するアカウントもありません。返されるスラッグ自体がアクセス権です。それを保持する人は誰でもそのレポートを読むことができ、それ以外の人が推測することはできません。

これは同時に、スラッグをパスワードのように扱う必要があることも意味します。リンクを保持する人には、レポートで件名、送信者、バウンスアドレス、メッセージの完全なソースが表示されます。

個人用 API キー

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.

レポートを読む

回答を含むフィールドを、おそらく必要になる順に示します。

score_ours0から100。独自モデル。認証とインフラストラクチャが重みの大部分を占めます。これは、フィルターが本文の単語を読む前に配信の可否が決まるためです。
score_compat0から10。すでに比較に使われているSpamAssassin形式の数値を再現するため、このレポートを他の場所で確認した結果と比較できます。
subscoresセクションごとに同じ0から100の尺度:auth、infra_spam、content、compliance。
checks[]全42件。それぞれにステータス、1行の所見、判断の根拠となった証拠、および2つのスコアへの影響が含まれます。
checks[].citations検出結果の根拠: RFCの該当セクションからの原文どおりの引用、およびGoogleが独自の要件を記載しているページ。自動生成ではなく手作業で選定されているため、信頼できます。
fixes[]変更すべき内容を、各変更で得られるポイントとともに順番に示します。増加ポイントは推定ではなく、レポートを再採点して計算されます。
completeチェックを実行できなかった場合はFalseです。未チェックの項目が合格になることはないため、trueになるまではスコアを楽観的な値として扱ってください。
report_url人が読めるページです。大量のJSONではなく、こちらを担当者に渡してください。

ステータス

チェックには5つの状態があり、そのうち2つの違いは見た目以上に重要です。

passチェックが実行され、問題は見つかりませんでした。
warn修正する価値があります。ポイントが減点されます。
fail配信到達性を損ないます。より多くのポイントを失います。
スキップ該当しませんでした。スキャンする添付ファイルがなく、評価するHTMLパートもありません。合格ではありません。
エラー判定できませんでした。合格として数えるのではなく、スコアから除外してフラグを付けます。

analysis_statusはreceived、analyzing、checks_ready、failedの順に進みます。ai_statusはpending、running、ready、fallback、errorの順に進みます。確定的なレポートはchecks_readyの時点で最終版となり、ai_statusはプランを追加するだけです。

返される可能性があるもの

202アドレスは予約済みで、メッセージはまだ到着していません。本文にはアドレス、有効期限、言語が含まれるため、予約を作成していない呼び出し元でもそれを表示できます。
404そのようなスラッグはありません。存在したことがないか、予約が破棄されています。
410メッセージが到着する前にアドレスの有効期限が切れました。
409メッセージがすでに到着した後で言語を変更しようとしました。
429あなたのアドレスに対する無料テストの上限です。現在、このサービスには個人ごとの上限はありません。今後設定された場合は、本文にリセット時刻が示されます。

知っておくべき4つのこと

アドレスごとに1通

2通目は拒否されます。以前のレポートはそのまま残り、それが狙いです。

利用できるのは1時間

アドレスには有効期限がありますが、レポートにはありません。レポートのリンクは永続的なので、チケットに貼り付けたリンクは引き続き機能します。

プラットフォームから送信

個人アカウントからキャンペーンをテストすると、そのアカウントを測定することになります。認証セクションのほぼすべては、テキストではなく送信インフラストラクチャに関するものです。

修正後に再テスト

予想される改善幅は修正ごとに個別に計算され、合算できません。2回目のレポートが実際の数値です。

マシン向け

GET/api/health

死活監視。認証なし、副作用なし。

まずは1件、手動で試す

約1分で完了し、JSONが記述する内容を正確に確認できます。

テスト用アドレスを取得

サンドボックス。

すべてのエンドポイントに、ライブサービスに対して実行するボタンがあります。ここではキーは不要なので、このページから送信するリクエストは実際のものです。実際のアドレスを予約し、件数にカウントされます。

サンドボックスで試す