didit-email-verification について
メールコードの送信・確認とアドレスのリスク検査を扱う Didit API のスキルです。到達性、既知の漏えい、使い捨てメール、重複利用に加え、任意でソーシャル情報も調べられます。
主な機能
- 01ワンタイムメールコードの送信
- 02入力コードの検証
- 03コード送信なしのメールリスク評価
- 04到達性と既知の漏えいの確認
- 05ソーシャル情報の任意調査
活用シーン
- 01アカウント作成時のメールアドレス確認
- 02使い捨て・漏えいアドレスの拒否または警告
- 03コードを使わないアドレスリスク評価
MCP 対応
このスキルは Didit Email Verification API の呼び出し方法を説明します。MCP サーバーや MCP 専用インターフェースについては記載されていません。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ didit-protocol/ skills --skill didit-email-verificationインストール後、Claude Code で/didit-email-verificationを入力して読み込まれたか確認します。
同梱ファイルscripts/verify_email.py
詳細
Didit メール認証 API
概要
単独で使用できる 3 つのエンドポイント:
- メールアドレスにワンタイムコードを送信します:
POST /v3/email/send/ - ユーザーが入力したコードを確認し、メールレポートを取得します:
POST /v3/email/check/ - コードを送信せず、1 回の呼び出しでアドレスをスコアリングするリスク評価:
POST /v3/email/risk/
主な制約(送信+確認):
- 確認では、アプリケーションと
emailアドレスを使って認証を検索します。request_idは指定しません。 - 保留中の認証は、最初の送信から5 分間有効です。再試行しても有効期間は延長されません。
- 1 件の認証につき、コードを試せるのは3 回です。コードが間違っている場合、1 回目と 2 回目は
"Failed"を返し、3 回目は"Declined"(EMAIL_CODE_ATTEMPTS_EXCEEDED)として確定します。 - 保留中の認証につき、再送信は1 回までです。有効期間内に同じアドレスへ 2 回目のコードを送信すると、同じ
request_idと新しいコードで"Retry"が返ります(前のコードは使えなくなります)。さらに送信すると、新しいrequest_idで新たな認証が開始されます。 - コードの照合では大文字と小文字を区別しません。有効なのは直近のコードのみです。
- 保留中の認証がない場合(未送信、すでに確定済み、送信時に配信不能、または送信から 5 分以上経過)、確認は HTTP
200とstatus: "Expired or Not Found"を返します。 - 新しい認証はそれぞれ API セッションとして保存されます。
request_idはGET /v3/session/{sessionId}/decision/で使用でき、ビジネスコンソールに表示され、進行状況に応じてstatus.updatedウェブフックが発行されます。リスク評価の呼び出しでも API セッションが作成されます。
機能: 既知のデータ侵害(breaches[])、使い捨てメールプロバイダー、配信可能性(構文と DNS/MX)、セッション間の重複(matches[])、独自のメールブロックリスト/許可リスト、任意のソーシャルフットプリント(enable_social)、不正利用シグナル。
サンドボックス: サンドボックス API キーでは、メール配信、請求、データ保存が省略されます。送信では静的な "Success" とランダムな request_id が返ります。確認ではコード 123456 を使用してください(形式が正しいコードであれば、簡略化された "Approved" ペイロードが返ります)。リスク評価では、決定的な承認データが返ります。形式が正しくない入力には、引き続き 400 が返ります。
料金: メール認証は、送信の成功("Success")1 回につき $0.03 です。"Retry" および "Undeliverable" の送信と確認は無料です(任意のソーシャルアドオンを除く)。単独の呼び出しに無料枠はありません。POST /v3/email/risk/ の価格表は公開されていません(ドキュメントではメール認証より安価と記載されています)。ソーシャルフットプリントのアドオン(enable_social)の価格表も公開されていません(エンドポイント料金に加えてリクエストごとに課金されますが、照会を完了できなかった場合は課金されません)。これらの価格表は 2026 年 11 月 1 日まで有効です。それ以降、Didit の料金体系が変更され、月 500 回の無料確認は月 $10 分の無料クレジットになります。最新の料金はdidit.me/pricingをご確認ください。
API リファレンス: コード送信 | コード確認 | メールリスク評価 機能ガイド: https://docs.didit.me/core-technology/email-verification/overview
認証
すべてのリクエストに x-api-key ヘッダーが必要です。アプリケーションの API キーは、Didit ビジネスコンソールの Developers > API keys から取得してください。または、アカウントとキーをプログラムで作成できます(「はじめに」を参照)。アクセス権限をカスタマイズした名前付きキーで単独の確認を実行するには、Sessions の書き込み権限が必要です。一部のワークフローまたは承認済みセッションのみに制限されたキーでは実行できません。
はじめに(まだアカウントをお持ちでない場合)
Didit API キーをお持ちでない場合は、API を 2 回呼び出して作成できます。
- 登録:
{"email": "[email protected]", "password": "MyStr0ng!Pass"}を指定してPOST https://apx.didit.me/auth/v2/programmatic/register/を実行します - メールを確認し、6 文字の確認コードを取得します
- 確認:
{"email": "[email protected]", "code": "A3K9F2"}を指定してPOST https://apx.didit.me/auth/v2/programmatic/verify-email/を実行します。キーはレスポンスのapplication.api_keyに含まれています。
クレジットを追加するには: GET /v3/billing/balance/ で残高を確認し、{"amount_in_dollars": 50} を指定して POST /v3/billing/top-up/ を実行すると、Stripe のチェックアウトリンクが発行されます。
プラットフォーム管理(ワークフロー、セッション、ユーザー、請求)の全容については、didit-verification-management スキルをご覧ください。
ステップ 1:メールコードを送信する
POST https://verification.didit.me/v3/email/send/
ヘッダー
| ヘッダー | 値 | 必須 |
|---|---|---|
x-api-key | API キー | はい |
Content-Type | application/json | はい |
本文(JSON)
| パラメーター | 型 | 必須 | デフォルト | 制約 | 説明 |
|---|---|---|---|---|---|
email | string | はい | - | 有効なメールアドレス、最大 254 文字 | コードの送信先アドレス |
options.code_size | integer | いいえ | 6 | 4~8 | コードの長さ |
options.alphanumeric_code | boolean | いいえ | false | - | true の場合、数字のみではなく大文字 A~Z と 0~9 を使用します |
options.locale | string | いいえ | en | 54 種類のコードのいずれか | テンプレートの言語。例:en、es、fr、pt-BR、zh-CN、zh-TW。サポート対象外の値を指定すると、サポート対象の一覧を示す 400 が返されます |
options.use_white_label_customization | boolean | いいえ | false | - | Didit のテンプレートではなく、アプリケーションのホワイトラベルブランディングを使用します |
signals.ip | string | いいえ | - | IPv4 または IPv6 | 不正検知用のエンドユーザーの IP アドレス |
signals.device_id | string | いいえ | - | 最大 255 文字 | Android の ANDROID_ID、iOS の identifierForVendor |
signals.device_platform | string | いいえ | - | android、ios、ipados、tvos、web | デバイスのプラットフォーム |
signals.device_model | string | いいえ | - | 最大 255 文字 | 例:iPhone17,2 |
signals.os_version | string | いいえ | - | 最大 64 文字 | 例:18.0.1 |
signals.app_version | string | いいえ | - | 最大 64 文字 | 例:1.2.34 |
signals.user_agent | string | いいえ | - | 最大 512 文字 | ブラウザーまたはアプリのユーザーエージェント |
vendor_data | string | いいえ | - | - | ユーザー ID。セッションに保存され(最初の送信時)、送信、確認、Webhook で返されます |
metadata | object | いいえ | null | JSON オブジェクト | セッションに保存され、返される任意のデータ |
例
import requests
response = requests.post(
"https://verification.didit.me/v3/email/send/",
headers={"x-api-key": "YOUR_API_KEY", "Content-Type": "application/json"},
json={
"email": "[email protected]",
"options": {"code_size": 6, "locale": "en"},
"signals": {"ip": "203.0.113.42"},
"vendor_data": "user-1234",
},
timeout=30,
)
print(response.status_code, response.json())
const response = await fetch("https://verification.didit.me/v3/email/send/", {
method: "POST",
headers: { "x-api-key": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
email: "[email protected]",
options: { code_size: 6, locale: "en" },
signals: { ip: "203.0.113.42" },
vendor_data: "user-1234",
}),
});
const data = await response.json(); // { request_id, status, reason, vendor_data, metadata }
レスポンス(200 OK)
{
"request_id": "e39cb057-92fc-4b59-b84e-02fec29a0f24",
"status": "Success",
"reason": null,
"vendor_data": "user-1234",
"metadata": null
}
ステータス値と処理方法
| ステータス | 意味 | 対応 |
|---|---|---|
"Success" | 新しい確認用のコードがメールで送信されました(課金対象) | ユーザーがコードを受け取るのを待ってから、Check を呼び出します |
"Retry" | 5 分間のウィンドウ内で 2 回目の送信が行われました。同じ確認用に新しいコードが送信され、request_id は同じまま、前のコードは無効になります(無料) | 新しいコードを待ってから、Check を呼び出します |
"Undeliverable" | アドレスの構文または DNS/MX 検証に失敗したか、メールを送信できませんでした。reason は "email_can_not_be_delivered" です。メールは送信されず、課金も発生しません。確認はすでに Declined として完了しており、確認すると "Expired or Not Found" が返されます | 別のアドレスをユーザーに尋ねます |
エラーレスポンス
| コード | 意味 | 対応 |
|---|---|---|
400 | リクエストが無効です | レスポンスボディのフィールドエラーを確認してください(不正なemail、4~8の範囲外のoptions.code_size、サポートされていないoptions.locale) |
401 | API キーの有効期限が切れています | Developers > API keysでキーをローテーションするか、新しいキーを作成してください |
403 | API キーがない、間違っている、または取り消されている、エンドポイントへのアクセス権がないスコープ付きキー、キーの IP 許可リスト外からのリクエスト、またはクレジット不足です | detailまたはerrorのメッセージを確認してください。x-api-keyヘッダーまたはキーのアクセス権を修正するか、クレジットを追加してください |
429 | レート制限:キーごとに1分あたりPOST/PATCH/DELETEリクエストは300件、GETリクエストは600件です | Retry-After秒待ってから再試行してください |
クレジットの確認は送信前に実行されます。403の場合は{"error": "You don't have enough credits to perform this request."}が返されます。
ステップ 2:メールコードを確認する
コードを検証し、メールレポートを返します。先に送信を呼び出してください。その際、同じemailを使用します。
POST https://verification.didit.me/v3/email/check/
ヘッダー:ステップ 1 と同じです。
ボディ(JSON)
| パラメーター | 型 | 必須 | デフォルト | 値 | 説明 |
|---|---|---|---|---|---|
email | string | はい | - | 有効なメールアドレス | ステップ 1 で使用したものと同じアドレスです(これにより確認と送信が紐付けられます) |
code | string | はい | - | 最大10文字 | ユーザーが受け取ったコードです(4~8文字、大文字と小文字を区別しません) |
duplicated_email_action | string | いいえ | "NO_ACTION" | "NO_ACTION" / "DECLINE" | アプリケーションの別ユーザー(異なるvendor_data)にすでに承認されているアドレスです |
breached_email_action | string | いいえ | "NO_ACTION" | "NO_ACTION" / "DECLINE" | 既知のデータ漏えいで見つかったアドレスです |
disposable_email_action | string | いいえ | "NO_ACTION" | "NO_ACTION" / "DECLINE" | ドメインが使い捨てまたは一時メールのプロバイダーです |
enable_social | boolean | いいえ | false | - | アドレスのソーシャルフットプリントも検索します(email.email_socialが追加され、リクエストごとにアドオンとして課金されます) |
email_no_social_presence_action | string | いいえ | "NO_ACTION" | "NO_ACTION" / "DECLINE" | ソーシャルフットプリントの確認で、どのプラットフォームにもアドレスが見つからない場合(profiles_registered: 0)に拒否します。enable_social: trueが必要です |
ポリシーに関する注記: リスクが見つかった場合、
DECLINEは正しいコードを"Declined"にします。NO_ACTIONはステータスを変更せず、リスクをemail.warnings(ログタイプinformation)に記録します。ブロックリストに登録されたアドレスと配信不能なアドレスは、常に拒否されます。ここで受け付けるのはNO_ACTIONとDECLINEのみです。
例
response = requests.post(
"https://verification.didit.me/v3/email/check/",
headers={"x-api-key": "YOUR_API_KEY", "Content-Type": "application/json"},
json={
"email": "[email protected]",
"code": "123456",
"breached_email_action": "DECLINE",
"disposable_email_action": "DECLINE",
},
timeout=30,
)
result = response.json()
if result["status"] in ("Approved", "Declined"):
print(result["email"]["is_breached"], result["email"]["is_disposable"])
const response = await fetch("https://verification.didit.me/v3/email/check/", {
method: "POST",
headers: { "x-api-key": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
email: "[email protected]",
code: "123456",
breached_email_action: "DECLINE",
disposable_email_action: "DECLINE",
}),
});
const result = await response.json(); // inspect result.status, not the HTTP code
レスポンス(200 OK)
{
"request_id": "e39cb057-92fc-4b59-b84e-02fec29a0f24",
"status": "Approved",
"message": "The verification code is correct.",
"email": {
"status": "Approved",
"email": "[email protected]",
"is_breached": false,
"breaches": [],
"is_disposable": false,
"is_undeliverable": false,
"verification_attempts": 1,
"verified_at": "2026-06-12T01:24:47.311323Z",
"warnings": [],
"lifecycle": [
{"type": "EMAIL_VERIFICATION_MESSAGE_SENT", "timestamp": "2026-06-12T01:23:39.580554+00:00", "details": {"status": "Success", "reason": null}, "fee": 0.03},
{"type": "VALID_CODE_ENTERED", "timestamp": "2026-06-12T01:24:47.311201+00:00", "details": {"code_tried": "123456", "status": "Approved"}, "fee": 0},
{"type": "EMAIL_VERIFICATION_APPROVED", "timestamp": "2026-06-12T01:24:47.384292+00:00", "details": null, "fee": 0}
],
"matches": []
},
"vendor_data": "user-1234",
"metadata": null,
"created_at": "2026-06-12T01:24:47.401719+00:00"
}
試行回数が残っている状態でコードが間違っている場合:
{
"request_id": "11111111-2222-3333-4444-555555555555",
"status": "Failed",
"message": "The verification code is incorrect. Attempts remaining: 2",
"email": null,
"vendor_data": "user-1234",
"metadata": null,
"created_at": "2026-06-12T01:24:21.512340+00:00"
}
ステータス値と対応
| ステータス | 意味 | request_id / email | 対応 |
|---|---|---|---|
"Approved" | 正しいコードで、拒否対象となるリスクはありません | 送信時のセッション ID / 完全なレポート | メールが確認されました。次に進んでください |
"Declined" | 終了状態:正しいコードですが、拒否対象となるリスクに該当した(DECLINEアクション、ブロックリスト登録、または配信不能なアドレス)、あるいは3回目のコード入力が間違っていました | 送信時のセッション ID / 完全なレポート | email.warningsを確認し、ブロックするか別のアドレスを尋ねてください |
"Failed" | コードが間違っています。試行回数が残っています(messageに残り回数が記載されます) | 1回限りのUUID / null | ユーザーにコードを再入力するよう依頼してください |
"Expired or Not Found" | 過去5分以内に、このアドレスに対する保留中の確認がありません | 1回限りのUUID / なし | 新しいコードを送信してください(ステップ 1) |
エラーレスポンス
| コード | 意味 | 対応 |
|---|---|---|
400 | リクエストが無効です | レスポンス本文のフィールドエラーを確認します(形式が正しくない email、code の欠落、NO_ACTION/DECLINE 以外のアクション) |
401 | API キーの有効期限が切れています | キーをローテーションするか、Developers > API keys で新しいキーを作成します |
403 | API キーが指定されていない、誤っている、または無効化されている、このエンドポイントへのアクセス権がないスコープ付きキー、キーの IP 許可リスト外からのリクエスト、またはクレジット不足です | detail または error のメッセージを確認し、x-api-key ヘッダーまたはキーのアクセス権を修正するか、クレジットを追加します |
429 | レート制限:キーごとに、1 分あたり POST/PATCH/DELETE リクエストは 300 件、GET リクエストは 600 件です | Retry-After の秒数だけ待ってから再試行します |
チェックは無料です。クレジットが確認されるのは enable_social アドオンのみです(残高で費用を賄えない場合は、error を含む 403 が返されます)。
メールリスク(コード送信なし)
1 回の同期呼び出しで、配信可能性、使い捨てドメイン、漏えい、重複、および正規化されたリスク情報を評価します。メールは送信されず、ユーザーの操作も必要ありません。API セッション(request_id)を作成します。
POST https://verification.didit.me/v3/email/risk/
本文(JSON)
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
email | string | はい | - | 評価するメールアドレス |
country_code | string | いいえ | - | インテリジェンスの対象範囲を指定する国コードのヒント。ISO 3166-1 alpha-2 または alpha-3(最大 3 文字) |
signals | object | いいえ | - | ステップ 1 の signals と同じフィールド(ip、device_id、device_platform、device_model、os_version、app_version、user_agent) |
enable_social | boolean | いいえ | false | email.email_social ブロックを追加します(アドオンとしてリクエストごとに課金されます) |
vendor_data | string | いいえ | - | 参照用の値です。保存され、レスポンスにも含まれます |
metadata | object | いいえ | null | JSON メタデータです。保存され、レスポンスにも含まれます |
例
response = requests.post(
"https://verification.didit.me/v3/email/risk/",
headers={"x-api-key": "YOUR_API_KEY", "Content-Type": "application/json"},
json={"email": "[email protected]", "country_code": "US", "vendor_data": "lead-123"},
timeout=30,
)
result = response.json()
print(result["status"], result["email"]["is_breached"], result["email"]["is_disposable"])
const response = await fetch("https://verification.didit.me/v3/email/risk/", {
method: "POST",
headers: { "x-api-key": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({ email: "[email protected]", country_code: "US", vendor_data: "lead-123" }),
});
const result = await response.json();
レスポンス(200 OK)
{
"request_id": "82397be9-5921-4970-a979-2d5b43e08b33",
"status": "Approved",
"email": {
"status": "Approved",
"email": "[email protected]",
"is_breached": false,
"breaches": [],
"is_disposable": false,
"is_undeliverable": false,
"verification_attempts": 0,
"verified_at": null,
"warnings": [],
"lifecycle": [],
"matches": [],
"email_intelligence": {
"score": 4.0,
"deliverable": "high",
"breach_risk_level": "Low",
"breach_risk_index": 4,
"is_recent_breach": false,
"is_frequent_breached": false,
"is_disposable": false,
"is_free_domain": false,
"is_breached": false,
"no_of_breaches": 0,
"reason_codes": []
},
"enrichment": {
"score": 4.0,
"deliverable": "high",
"breach_risk_level": "Low",
"breach_risk_index": 4,
"is_recent_breach": false,
"is_frequent_breached": false,
"is_disposable": false,
"is_free_domain": false,
"is_breached": false,
"no_of_breaches": 0,
"reason_codes": []
}
},
"vendor_data": "lead-123",
"metadata": null,
"created_at": "2026-09-01T10:30:00.123456+00:00"
}
status(トップレベルおよびemail.status):"Approved"、"In Review"、または"Declined"です。通常は"Approved"ですが、アプリケーションのメールリスクルールによって、ほかの値になる場合があります。完了した照会はすべて HTTP200です。email.email_intelligenceとemail.enrichmentは同じオブジェクトです(互換性のためのエイリアスです)。ベストエフォートで返されるため、利用可能なインテリジェンスを取得できなかった場合は、どちらのキーも含まれません。まずis_breached、is_disposable、is_undeliverableに基づいてルールを設定し、ブロックがない場合は「安全」ではなく「不明」として扱ってください。- ベストエフォートのフィールドが欠落していても、照会の開始時に課金されます。
エラー:ステップ 2 と同じ表を参照してください(400 フィールドエラー、401、呼び出しと enable_social アドオンのクレジットチェックを含む 403、429)。
レスポンスフィールドのリファレンス
email オブジェクト(チェックとリスク)
| フィールド | 型 | 説明 |
|---|---|---|
status | 文字列 | チェック:最終確定したチェックでは "Approved" または "Declined"。リスク:"Approved"、"In Review"、"Declined" |
email | 文字列 | メールアドレス |
is_breached | ブール値 | 既知のデータ侵害で見つかったかどうか |
breaches | 配列 | 最新の侵害を最大5件:{name, domain, breach_date, breach_emails_count, description, logo_path, data_classes, is_verified}。description には HTML が含まれる場合があります |
is_disposable | ブール値 | ドメインが使い捨てまたは一時メールのプロバイダーかどうか |
is_undeliverable | ブール値 | メールを受信できないかどうか(構文、DNS/MX、またはバウンスが原因) |
verification_attempts | 整数 | この認証でコードを送信した回数(1回、再試行後は2回)。リスク照会では 0 |
verified_at | 文字列または null | 正しいコードが入力された日時 |
warnings | 配列 | {feature, risk, additional_data, log_type, short_description, long_description}。log_type:error は拒否、warning は確認対象としてフラグ付け、information は記録のみ |
lifecycle | 配列 | {type, timestamp, details, fee}。種類:EMAIL_VERIFICATION_MESSAGE_SENT、EMAIL_VERIFICATION_RETRY_MESSAGE_SENT、VALID_CODE_ENTERED、INVALID_CODE_ENTERED、EMAIL_VERIFICATION_APPROVED、EMAIL_VERIFICATION_DECLINED、EMAIL_VERIFICATION_IN_REVIEW、EMAIL_VERIFICATION_EXPIRED。fee(USD)がゼロ以外になるのは、最初の送信が成功した場合のみです |
matches | 配列 | アプリケーションの他のセッションのうち、別のユーザー(vendor_data)がこのアドレスを使用したものを最大5件:{session_id, session_number, vendor_data, verification_date, email, status, is_blocklisted, api_service, source}。source は session、またはブロックリストのエントリーの場合は list_entry(session_id / session_number は null)です |
email_intelligence / enrichment | オブジェクト | リスクエンドポイントのみ。ベストエフォート:score(0~100。値が高いほどリスクが高い)、deliverable、breach_risk_level(Low / Medium / High)、breach_risk_index、is_recent_breach、is_frequent_breached、is_disposable、is_free_domain、is_breached、no_of_breaches、reason_codes(候補は限定されていません。不明なコードを拒否しないでください) |
email_social | オブジェクト | enable_social: true で、照会が完了した場合のみ。以下を参照してください |
email_social オブジェクト
| フィールド | 説明 |
|---|---|
profiles_registered / profiles_checked | 登録されているプラットフォーム数/確認したプラットフォーム数。登録数が 0 の場合も実際の回答であり、合成 ID の一般的な兆候です |
names_found、photos_found、communication_breadth、digital_footprint_diversity | 件数 |
digital_sophistication_index、engagement_depth_index、subscription_affordability_index | 0~10 の複合指標 |
free_platforms、full_paid_platforms、partial_paid_platforms | プラットフォームの料金モデル別の登録数 |
registered_platforms、not_registered_platforms | category と scope(global または local)を含むプラットフォームのリスト |
categories、profiles | カテゴリーごとの登録数と比率。公開されている場合はプラットフォームごとのプロフィール詳細 |
照会でデータが返されなかった場合、各件数は null になることがあります。
警告タグ
| タグ | 重大度 | 説明 |
|---|---|---|
EMAIL_CODE_ATTEMPTS_EXCEEDED | error(常に拒否) | 単独チェックで3回目に間違ったコードを入力した場合 |
EMAIL_IN_BLOCKLIST | error(常に拒否) | メールアドレスがメールブロックリスト(Lists API)に登録されているか、ブロックリスト登録済みの認証に一致しました。additional_data:blocklisted_session_id、blocklisted_session_number、api_service(リストのみで検出された場合はすべてnull) |
UNDELIVERABLE_EMAIL_DETECTED | error(常に拒否) | メールアドレスでメールを受信できません |
BREACHED_EMAIL_DETECTED | breached_email_actionに従います | 既知の漏えいに含まれています(breaches[]を参照) |
DISPOSABLE_EMAIL_DETECTED | disposable_email_actionに従います | 使い捨てまたは一時メールのドメインです |
DUPLICATED_EMAIL | duplicated_email_actionに従います | 別のユーザーですでに承認されています。additional_data:duplicated_session_id、duplicated_session_number、api_service |
EMAIL_IN_ALLOWLIST | information | メールアドレスがメール許可リストに登録されているため、重複時のアクションはスキップされました |
1回の試行でEMAIL_IN_BLOCKLIST、DUPLICATED_EMAIL、EMAIL_IN_ALLOWLISTのうち最大1つのみが発生します(ブロックリスト、重複、許可リストの順)。このAPIでは、DECLINEアクションのログタイプはerror、NO_ACTIONのログタイプはinformationです。
一般的なワークフロー
基本的なメール認証
1. POST /v3/email/send/ -> {"email": "[email protected]"}
If "Undeliverable" -> ask for another address (nothing billed)
2. Wait for the user to type the code (valid 5 minutes from the first send)
3. POST /v3/email/check/ -> {"email": "[email protected]", "code": "123456"}
4. If "Approved" -> email verified
If "Failed" -> ask the user to retry (3 attempts in total)
If "Declined" -> read email.warnings
If "Expired or Not Found" -> go back to step 1
厳格なセキュリティ認証
1. POST /v3/email/send/ -> include signals.ip, signals.device_id, signals.user_agent and vendor_data
2. Wait for the user's code
3. POST /v3/email/check/ -> duplicated_email_action, breached_email_action, disposable_email_action = "DECLINE"
4. If "Approved" -> safe to proceed
If "Declined" -> email.warnings[].risk says why; block or ask for another address
コードを使わない事前スクリーニング
1. POST /v3/email/risk/ -> {"email": "[email protected]", "vendor_data": "lead-123"}
2. If email.is_undeliverable or email.is_disposable -> reject before sending any OTP
3. Otherwise continue with the send/check flow above
ユーティリティスクリプト
verify_email.py:コマンドラインからコードを送信・確認し、メールのリスクを評価します。
# Requires: pip install requests
export DIDIT_API_KEY="your_api_key"
python scripts/verify_email.py send [email protected] --locale es
python scripts/verify_email.py check [email protected] 123456 --decline-breached --decline-disposable
python scripts/verify_email.py risk [email protected] --country-code US
ライブラリとしてインポートすることもできます。
from scripts.verify_email import send_code, check_code, score_email_risk
send_result = send_code("[email protected]")
check_result = check_code("[email protected]", "123456", decline_breached=True)
risk_result = score_email_risk("[email protected]")