使い捨て、入力ミス、メールサーバーなしのサインアップメールを検出する
サインアップフォームで、すべてのアドレスを早い段階でチェックしましょう:構文、既知の使い捨て/一時的なドメイン、ドメインにそもそもメールサーバーがあるか、入力ミスの可能性、ロールアドレスを確認し、理由を添えたaccept、review、rejectの判定として返します。フォーム自身のJavaScriptからPOST /v1/email/validateを呼び出すか、バックエンドやダッシュボードからリストを一括でチェックできます。
リクエストと認証
X-Api-Keyヘッダーにオリジンロックされた公開可能キーを指定して、{ "email": "user@example.com" }というJSON本文をPOST /v1/email/validateに送信します — GET /v1/geoと同じキー種別と許可オリジンのモデルなので、訪問者の入力中や送信時にサインアップフォームから直接呼び出しても安全です。サーバーサイドでは、シークレットキーでPOST /v1/email/batch(1リクエストあたり最大100件)、最大100,000件の非同期リストジョブ(APIまたはダッシュボードのEmail listsページ、CSVで入力しCSVで出力)、そしてメールチェックとサインアップ元IPのネットワーク指標を1つのスコアにまとめるPOST /v1/signup/checkが利用できます。
まず判定を、次に理由を読む
verdictは最も重い結果です:無効な構文、存在しないドメイン、メールサーバーのないドメイン、使い捨てドメインならreject。入力ミスの疑い、info@のようなロールアドレス、暗黙のメールサーバーしかないドメイン、完了しなかったDNS検索ならreview。それ以外はaccept。reasonsには該当したすべての条件が列挙されるので、フォームで具体的なメッセージを表示できます — didYouMeanが設定されている場合は、エラーではなく修正候補を提示してください。
いつ呼び出すか
キー入力のたびではなく、フォーカスが外れたときか送信時に呼び出してください — 入力途中のアドレスを1文字ごとにチェックしても有用なシグナルは得られずリクエストが増えるだけで、訪問者の入力中にエラーメッセージがちらつく原因にもなります。呼び出し1回につき1リクエストとして計上されます。
リクエストが失敗した場合
フェイルオープンにしてください:クライアント側の障害ですべての訪問者をブロックするのではなく、ネットワークリクエストがエラーやタイムアウトになった場合はサインアップを続行させます。サーバーサイドでは、DNS検索の失敗はエラーやrejectではなく、理由dns_unavailable(判定review)として報告されます。チェックが失敗しても入力内容が失われないよう、訪問者がすでに入力した内容は保持してください。
使い捨てドメインの検出方法
既知の使い捨て/一時的なドメインは、コミュニティが管理する3つのオープンソースリスト(データソースを参照)を統合したもので、数時間ごとに更新されます。上流の誤った掲載で大手プロバイダーが検出されないよう、許可リストも併用しています。掲載ドメインのサブドメインも該当します。まだどのリストにも載っていない新しい使い捨てドメインは、メールサーバーから検出されることがよくあります:使い捨てサービスは多数のドメインを同じ少数のメールホストに向けており、掲載ドメインを扱っていることが知られているメールサーバーを使うドメインはdisposableSource: mx_hostとして検出されます。新しいメールサーバー上の非常に新しいプロバイダーは、まだ検出されない場合があります。
利用量とクォータ
チェックしたアドレスはすべて、プラン共通の月間上限に対して1リクエストとして計上されます — 単一チェック、一括チェックの各アドレス、リストジョブの重複を除いた各アドレス — 他のトラフィックと合算され、1分あたりのレート制限も共通です。メール専用のプランや料金はありません。1分あたりのレート制限はアイテム数ではなくHTTP呼び出し数で数えます。最大100件のIPまたはメールアドレスを含むバッチは1リクエストとして数えられ、各アイテムは引き続き月間リクエスト上限に個別に計上されます。
これが確認しないこと
すべてのチェックはドメインまたはアドレスのレベルで行われます。Watch-IPは受信者のメールサーバーに一切接続しないため、結果はメールボックスの存在、メールが届くこと、サインアップした本人のものであることを証明しません。accept判定は「問題が見つからなかった」ことを意味し、動作が確認されたアドレスという意味ではありません — それには確認メールを使用してください。
レスポンスフィールド
- syntaxValid
- アドレスが構文上有効かどうか。
- isDisposable
- ドメインが既知の使い捨て/一時的なプロバイダーに、直接、親ドメイン経由、またはメールサーバー経由で該当するかどうか。syntaxValidがfalseの場合は常にfalse。
- disposableSource
- list、parent_domain、mx_host — isDisposableがtrueになった理由。それ以外はnull。
- mx
- ドメインのメールサーバーのステータス(found、implicit、none、null_mx、no_domain、unknown)とプライマリMXホスト。
- didYouMean
- gmial.com → gmail.comのような入力ミスの修正候補、またはnull。
- isRoleAccount / isFreeProvider
- ロールアドレス(admin@、info@、noreply@…)と一般消費者向けメールボックスプロバイダーの判定。フリーメール判定は参考情報のみです。
- normalizedEmail / canonicalEmail
- 小文字化したアドレスと、重複アカウントを見つけるために+タグ(とGmailのドット)を除いたアドレス。
- verdict / reasons
- accept、review、rejectと、該当したすべての理由コード — 全一覧はリファレンスを参照してください。
判定に応じて対応する
サインアップフォームのJavaScript
async function checkEmail(email) {
const response = await fetch('https://api.watch-ip.com/v1/email/validate', {
method: 'POST',
headers: { 'X-Api-Key': 'YOUR_PUBLISHABLE_KEY', 'Content-Type': 'application/json' },
body: JSON.stringify({ email }),
});
if (!response.ok) return { state: 'unknown' }; // フェイルオープン — ネットワークエラーでサインアップをブロックしない
const result = await response.json();
if (result.didYouMean) return { state: 'suggest', suggestion: result.didYouMean };
if (result.verdict === 'reject') return { state: 'reject', reasons: result.reasons };
return { state: 'ok' }; // acceptまたはreview:サインアップを通し、バックエンドでフラグを立てる
}理由ごとに異なるメッセージを表示してください — invalid_syntax、disposable_domain、no_mail_serverでは訪問者に求める修正が異なります — また、didYouMeanをワンクリックの修正として提示してください。
よくある質問
メールボックスの存在を確認しますか?
いいえ。構文、ドメインのリストとDNSのメールサーバーレコード、アドレスの形式をチェックします。メールサーバーに接続したり、個々のメールボックスの実在を確認したりすることはありません — no_mail_serverによるrejectはドメイン全体に関するものです。
acceptはメールが使えることの証明ですか?
いいえ。acceptは、どのチェックでも問題が見つからなかったことを意味し、そのアドレスが確実にメールを受信できることや、サインアップした本人のものであることを意味しません。それが必要な場合は確認メールを使用してください。
利用者はブラウザ側の検証を回避できますか?
はい。このチェックを含め、ブラウザ側のチェックはJavaScriptを無効にしたり、サインアップ用エンドポイントを直接呼び出したりすることで回避できます。重要な判断はバックエンドで強制してください — POST /v1/signup/checkはそのために用意されています。
既存のリストをクリーニングできますか?
はい。ダッシュボードのEmail listsページでCSVをアップロードするか、シークレットキーでPOST /v1/email/jobsに最大100,000件のアドレスを送信し、行ごとの判定と理由を含む結果CSVをダウンロードします。重複の課金は1回のみで、アップロードと結果は7日後に削除されます。
リクエストはどのようにカウントされますか?
チェックしたアドレスごとに1リクエストとして、プラン共通の月間上限に計上されます。リストジョブ内の重複は1回として数えられ、サインアップチェックは1リクエストとして計上されます。