didit-id-document-verification について
書類画像または PDF を使って Didit ID Verification API を呼び出すスキルです。開発者は本人確認書類の分類、項目抽出、データ検証を行い、判定と警告を取得できます。
主な機能
- 01書類の自動分類
- 02OCR・MRZ・バーコードの読み取り
- 03日付と番号形式の照合
- 04リプレイや画像改ざんの検出
- 05抽出項目と警告の返却
活用シーン
- 01提出された画像による本人確認書類の検証
- 02申請向けの書類情報抽出
- 03登録前の書類有効性チェック
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ didit-protocol/ skills --skill didit-id-document-verificationインストール後、Claude Code で/didit-id-document-verificationを入力して読み込まれたか確認します。
同梱ファイルscripts/verify_id.py
詳細
Didit ID Verification API
概要
本人確認書類の表面と裏面の画像(または PDF)を使って、1 回の同期呼び出しで本人確認を行います。書類の種類を自動で判定するため、国や種類を指定する必要はありません。OCR で可視領域を読み取り、MRZ とバーコードをデコードし、日付、番号の形式、MRZ のチェックディジットを照合します。また、デフォルトで両方の画像を検査し、画面の再撮影、印刷したコピー、顔写真の加工を検出します。抽出したフィールド、Approved または Declined のステータス、および warnings リストを返します。
主な制約:
- 対応形式:JPEG、PNG、WebP、TIFF、PDF(拡張子は
jpg、jpeg、png、webp、tiff、pdf)。暗号化された PDF にはfront_image_password/back_image_passwordが必要です - 最大アップロードサイズ:片面あたり 10 MB(これを超えるファイルは
400を返します)。画像はサーバー側で圧縮されます - 4 つの角すべてが見える、切り抜いていない全体の画像を送信してください。サービスが書類を検出し、位置合わせと切り抜きを行います
- 書類に裏面がある場合は、必ず
back_imageを送信してください。多くの ID カードでは裏面に MRZ またはバーコードがあり、裏面がないと警告なしで該当フィールドが空になります
対応範囲: 220 以上の国と地域の 14,000 種類以上の書類に対応しています。パスポート、国民 ID カード、運転免許証、在留許可証などが含まれます。
料金: 200 を返す呼び出し 1 回につき $0.20(Approved または Declined)。400 のレスポンスは課金されず、単独の呼び出しに無料枠はありません。これらの表示価格は 2026 年 11 月 1 日まで適用されます。同日より Didit の料金が変更され、月 500 回の無料チェックは、月 $10 分の無料クレジットになります。最新の料金は didit.me/pricing をご確認ください。デジタル ID ウォレットは別途課金されます(デジタル ID ウォレットを参照)。
サンドボックス: サンドボックス API キーでは処理と課金が行われず、リクエストの検証後、固定の Approved モック(架空の「Sandbox User」の米国 ID カード)が返されます。データは保存されません。
API リファレンス: https://docs.didit.me/standalone-apis/id-verification 機能ガイド: https://docs.didit.me/core-technology/id-verification/overview 警告: https://docs.didit.me/core-technology/id-verification/warnings-id-verification 対応書類: https://docs.didit.me/core-technology/id-verification/supported-documents-id-verification
認証
すべてのリクエストには x-api-key ヘッダーが必要です。Didit Business Console の Developers > API keys にあるアプリケーションの API キーを使用するか、アカウントとキーをプログラムで作成してください(「はじめに」を参照)。カスタムアクセス権を持つ名前付きキーで単独チェックを実行するには、Sessions の書き込み権限が必要です。一部のワークフローに制限されたキー、または承認済みセッションに限定されたキーでは実行できません。
はじめに(まだアカウントをお持ちでない場合)
Didit API キーをお持ちでない場合は、2 回の API 呼び出しで作成できます。
- 登録:
POST https://apx.didit.me/auth/v2/programmatic/register/に{"email": "[email protected]", "password": "MyStr0ng!Pass"}を送信します - メールを確認: 6 文字の確認コードを確認します
- 確認:
POST https://apx.didit.me/auth/v2/programmatic/verify-email/に{"email": "[email protected]", "code": "A3K9F2"}を送信します。キーはレスポンスのapplication.api_keyに含まれています。
クレジットの追加: 残高を確認するには GET /v3/billing/balance/、Stripe の決済リンクを取得するには POST /v3/billing/top-up/ に {"amount_in_dollars": 50} を送信します。
プラットフォーム管理(ワークフロー、セッション、ユーザー、請求)の詳細については、didit-verification-management スキルをご覧ください。
エンドポイント
POST https://verification.didit.me/v3/id-verification/
ヘッダー
| ヘッダー | 値 | 必須 |
|---|---|---|
x-api-key | ご利用の API キー | はい |
Content-Type | multipart/form-data(HTTP クライアントによって設定) | はい |
リクエストパラメーター(multipart/form-data)
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
front_image | file | Yes | - | 書類の表面。JPEG/PNG/WebP/TIFF/PDF、最大 10 MB |
front_image_password | string | No | - | 暗号化された front_image PDF のパスワード |
back_image | file | No | - | 書類の裏面。同じ形式と上限 |
back_image_password | string | No | - | 暗号化された back_image PDF のパスワード |
perform_document_liveness | boolean | No | true | 両方の画像について、画面のキャプチャ、印刷物、顔写真の加工を検出します。いずれかが検出されると却下されます。false にすると検出を省略し、レイテンシーが低下します |
invalid_mrz_action | string | No | DECLINE | MRZ_VALIDATION_FAILED に対する DECLINE または NO_ACTION |
inconsistent_data_action | string | No | DECLINE | DATA_INCONSISTENT および MRZ_AND_DATA_EXTRACTED_FROM_OCR_NOT_SAME に対する DECLINE または NO_ACTION |
expiration_date_not_detected_action | string | No | NO_ACTION | EXPIRATION_DATE_NOT_DETECTED に対する DECLINE または NO_ACTION(有効期限が印字されていない書類も多くあります)。過去の有効期限が検出された場合は、常に却下されます |
critical_field_occlusion_action | string | No | DECLINE | CRITICAL_FIELD_OCCLUSION_DETECTED に対する DECLINE または NO_ACTION |
document_or_personal_number_format_mismatch_action | string | No | NO_ACTION | DOCUMENT_NUMBER_FORMAT_MISMATCH および PERSONAL_NUMBER_FORMAT_MISMATCH に対する DECLINE または NO_ACTION |
preferred_characters | string | No | latin | latin または non_latin:両方の文字種が印字された書類で、氏名と住所をどちらの文字種で返すか |
save_api_request | boolean | No | true | true:呼び出しをセッションとして保存します(下記参照)。false:何も保存しません |
vendor_data | string | No | - | ユーザーを識別するための値。応答に含まれ、セッションに保存されます |
metadata | JSON object | No | - | JSON 文字列としてエンコードした値を送信します(例:{"flow":"onboarding"})。応答に含まれ、セッションに保存されます |
アクションフィールドで受け付ける値は DECLINE または NO_ACTION のみです。REVIEW を指定すると 400 が返されます。minimum_age は受け付けられますが、このエンドポイントでは適用されません。返された date_of_birth / age に基づいて年齢ルールを適用するか、年齢制限付きのワークフローを使用してください。
save_api_request=true(デフォルト): 呼び出しは API セッションとして保存され、Business Console に表示されます。request_id は実際のセッション ID であり、GET /v3/session/{sessionId}/decision/ で使用できます。切り抜かれた画像は有効期限が短いメディア URL として返され、status.updated webhook が webhook の送信先に送信されます。false: 何も保存されず、request_id は一度限りの UUID になります。また、portrait_image、front_image、back_image は base64 JPEG 文字列としてインラインで返されます。
例
import json
import requests
with open("front.jpg", "rb") as front, open("back.jpg", "rb") as back:
response = requests.post(
"https://verification.didit.me/v3/id-verification/",
headers={"x-api-key": "YOUR_API_KEY"},
files={
"front_image": ("front.jpg", front, "image/jpeg"),
"back_image": ("back.jpg", back, "image/jpeg"),
},
data={
"vendor_data": "user-123",
"perform_document_liveness": "true",
"metadata": json.dumps({"flow": "onboarding"}),
},
timeout=120,
)
if response.status_code != 200:
raise SystemExit(f"{response.status_code}: {response.text}")
id_v = response.json()["id_verification"]
print(id_v["status"], id_v.get("full_name"), [w["risk"] for w in id_v["warnings"]])
const formData = new FormData();
formData.append("front_image", frontImageFile);
formData.append("back_image", backImageFile);
formData.append("vendor_data", "user-123");
formData.append("metadata", JSON.stringify({ flow: "onboarding" }));
const response = await fetch("https://verification.didit.me/v3/id-verification/", {
method: "POST",
headers: { "x-api-key": "YOUR_API_KEY" },
body: formData,
});
const body = await response.json();
console.log(body.id_verification.status, body.id_verification.warnings.map((w) => w.risk));
応答(200 OK)
ここでは save_api_request が true だったため、画像はメディア URL です。
{
"request_id": "11111111-2222-3333-4444-555555555555",
"id_verification": {
"status": "Approved",
"document_type": "Identity Card",
"document_subtype": "ID_CARD_GENERIC",
"document_number": "YZA123456",
"personal_number": "X9876543L",
"portrait_image": "https://<media-host>/ocr/11111111-2222-3333-4444-555555555555-portrait_image.jpg?signature=...",
"front_image": "https://<media-host>/ocr/11111111-2222-3333-4444-555555555555-front_image.jpg?signature=...",
"back_image": "https://<media-host>/ocr/11111111-2222-3333-4444-555555555555-back_image.jpg?signature=...",
"front_image_camera_front": null,
"back_image_camera_front": null,
"front_image_camera_front_face_match_score": null,
"back_image_camera_front_face_match_score": null,
"front_image_quality_score": {
"focus_score": 78.0,
"brightness_score": 83.2,
"brightness_issue": "ok",
"is_document_fully_visible": true,
"resolution_score": 40.7,
"overall_score": 70.2
},
"back_image_quality_score": null,
"date_of_birth": "1985-03-15",
"age": 41,
"expiration_date": "2030-08-21",
"date_of_issue": "2020-08-21",
"issuing_state": "ESP",
"issuing_state_name": "Spain",
"first_name": "Elena",
"last_name": "Martinez Sanchez",
"full_name": "Elena Martinez Sanchez",
"gender": "F",
"address": "Calle Mayor 10, Madrid",
"formatted_address": "Calle Mayor 10, 28013 Madrid, Spain",
"place_of_birth": "Valencia",
"marital_status": "UNKNOWN",
"nationality": "ESP",
"extra_fields": {"first_surname": "Martinez", "second_surname": "Sanchez"},
"mrz": {
"surname": "MARTINEZ SANCHEZ",
"name": "ELENA",
"country": "ESP",
"nationality": "ESP",
"birth_date": "850315",
"expiry_date": "300821",
"sex": "F",
"document_type": "ID",
"document_number": "YZA123456",
"personal_number": "X9876543L",
"mrz_type": "TD1",
"warnings": [],
"errors": []
},
"parsed_address": {
"street_1": "Calle Mayor 10",
"street_2": null,
"city": "Madrid",
"region": "Comunidad de Madrid",
"postal_code": "28013",
"country": "ES",
"formatted_address": "Calle Mayor 10, 28013 Madrid, Spain",
"is_verified": true
},
"warnings": [],
"barcodes": []
},
"vendor_data": "user-123",
"metadata": {"flow": "onboarding"},
"created_at": "2026-06-12T02:21:56.013573+00:00"
}
却下された結果も同じ形式で、"status": "Declined" となり、理由は warnings に含まれます。例:
{
"risk": "DOCUMENT_EXPIRED",
"feature": "ID_VERIFICATION",
"additional_data": null,
"log_type": "error",
"short_description": "Document expired",
"long_description": "The document's expiration date has passed, rendering it no longer valid for use."
}
ステータス値
| ステータス | 意味 |
|---|---|
"Approved" | 却下につながる警告はありません |
"Declined" | 少なくとも 1 つの警告の log_type: "error" があります(warnings を参照) |
このエンドポイントが In Review を返すことはありません。読み取り可能でも問題のある書類の場合、HTTP 200 と Declined が返されます。HTTP コードだけでなく、必ず id_verification.status を確認してください。
エラーレスポンス
| コード | 意味 | 対処方法 |
|---|---|---|
400 | 無効なリクエスト | レスポンス本文のフィールドエラーを確認してください |
400 | {"error": "COULD_NOT_RECOGNIZE_DOCUMENT"} | 画像から書類が見つかりません。四隅すべてが見える状態で撮り直してください |
400 | {"detail": "The PDF is encrypted..."} または {"detail": "The PDF password is incorrect..."} | front_image_password / back_image_password または写真を送信してください |
400 | {"error": "Failed to convert front image PDF."}(または back) | 画像または有効な PDF を送信してください |
401 | API キーの有効期限が切れています | Developers > API keys でキーをローテーションするか、新しいキーを作成してください |
403 | API キーがない、誤っている、または取り消されている、このエンドポイントへのアクセス権がないスコープ付きキーを使用している、キーの IP 許可リスト外からのリクエスト、またはクレジット不足 | detail または error のメッセージを確認してください。x-api-key ヘッダーまたはキーのアクセス権を修正するか、クレジットを補充してください |
429 | レート制限:キーごとに、1 分あたり POST/PATCH/DELETE は 300 件、GET は 600 件 | Retry-After の秒数だけ待ってから再試行してください |
クレジットの確認は画像の処理前に行われます。残高が空の場合、{"error": "You don't have enough credits to perform this request. ..."} とともに 403 が返されます。
レスポンスフィールドのリファレンス
特に記載がない限り、すべてのフィールドは id_verification 内にあります。
| フィールド | 型 | 説明 |
|---|---|---|
request_id(トップレベル) | uuid | save_api_request=true の場合はセッション ID、それ以外の場合は一度限りの UUID |
status | string | "Approved" または "Declined" |
document_type | string or null | "Passport"、"Identity Card"、"Driver's License"、"Residence Permit"、"Health Insurance Card"、"Tax Card"。書類を分類できなかった場合は null |
document_subtype | string or null | より詳細なサブタイプ。例:ID_CARD_GENERIC、EPASSPORT |
document_number、personal_number | string or null | 書類番号と副次的な個人番号または国民識別番号 |
first_name、last_name、full_name | string or null | 所持者の氏名 |
date_of_birth、expiration_date、date_of_issue | string or null | YYYY-MM-DD |
age | integer or null | date_of_birth から計算した年齢 |
gender | string or null | "M"、"F"、または null |
nationality、issuing_state | string or null | ISO 3166-1 alpha-3。issuing_state_name は国名です |
address、formatted_address | string or null | 印字されている住所と、そのジオコーディング済み形式 |
parsed_address | object or null | street_1、street_2、city、region、postal_code、country(alpha-2)、formatted_address、is_verified、document_location、label、category |
place_of_birth、marital_status | string or null | 印字されていない場合、marital_status は UNKNOWN です |
extra_fields | object or null | 書類固有の追加情報(例:first_surname、second_surname) |
mrz | object | パースされた MRZ:surname、name、country、nationality、birth_date/expiry_date(生データの YYMMDD)、sex、document_type、document_number、personal_number、optional_data、チェックデジット、mrz_type(TD1/TD2/TD3)、mrz_string、errors、warnings。書類に MRZ がない場合、または読み取れなかった場合は {} |
barcodes | array | デコードされたバーコード:type(例:PDF417、QR_CODE)、data、data_raw、side、position |
portrait_image、front_image、back_image | string or null | メディア URL(保存済み)、または base64 JPEG(save_api_request=false の場合)。裏面の画像がアップロードされていない場合、back_image は null |
front_image_quality_score、back_image_quality_score | object or null | focus_score、brightness_score、brightness_issue、is_document_fully_visible、resolution_score、overall_score(0~100) |
front_image_camera_front、back_image_camera_front と、それらの *_face_match_score | null | このエンドポイントでは常に null です(ホストされたセッションでのみ入力されます) |
warnings | array | {risk, feature, additional_data, log_type, short_description, long_description}。log_type は error(却下)または information です |
vendor_data、metadata、created_at(トップレベル) | 指定した値のエコーとレスポンスのタイムスタンプ |
警告タグ
このエンドポイントにあるのは DECLINE または NO_ACTION のみです。警告の log_type が "error" の場合は(ステータスが Declined になり)、"information" の場合は報告されるだけで、ステータスには影響しません。
常に却下
| タグ | 説明 |
|---|---|
DOCUMENT_EXPIRED | 有効期限が過去です |
SCREEN_CAPTURE_DETECTED | 物理的な書類ではなく、画面を撮影した写真です(perform_document_liveness=true の場合のみ) |
PRINTED_COPY_DETECTED | 原本ではなく、印刷されたコピーです(perform_document_liveness=true の場合のみ) |
PORTRAIT_MANIPULATION_DETECTED | 顔写真が差し替えられている、または改変されています(perform_document_liveness=true の場合のみ) |
PUBLIC_DOCUMENT_IMAGE_DETECTED | 既知のインターネット上の公開書類画像(見本、報道用写真、ストックフォト)と一致する画像です |
NAME_NOT_DETECTED | 名および/または姓を読み取れませんでした |
DATE_OF_BIRTH_NOT_DETECTED | 生年月日が記載されている書類で、生年月日を読み取れませんでした |
DOCUMENT_NUMBER_NOT_DETECTED | 書類番号も個人番号も読み取れませんでした |
COULD_NOT_DETECT_DOCUMENT_TYPE | アップロードされた画像から何も読み取れませんでした。顔写真も検出されなかった場合は、PORTRAIT_IMAGE_NOT_DETECTED も併せて返されます |
リクエストごとに設定可能
| リクエストパラメーター(デフォルト) | タグ |
|---|---|
invalid_mrz_action (DECLINE) | MRZ_VALIDATION_FAILED(MRZ のチェックディジットまたは形式の検証に失敗しました)。MRZ がない場合、ここでは警告は発生しません |
inconsistent_data_action (DECLINE) | DATA_INCONSISTENT(表面と裏面の内容が一致しません)、MRZ_AND_DATA_EXTRACTED_FROM_OCR_NOT_SAME(可視領域の内容が MRZ と一致しません) |
critical_field_occlusion_action (DECLINE) | CRITICAL_FIELD_OCCLUSION_DETECTED:本人確認番号、氏名、生年月日、有効期限が物理的に覆われていました。additional_data.covered_fields に該当する項目が列挙されます。通常、対応する *_NOT_DETECTED 警告も続けて発生します |
expiration_date_not_detected_action (NO_ACTION) | EXPIRATION_DATE_NOT_DETECTED |
document_or_personal_number_format_mismatch_action (NO_ACTION) | DOCUMENT_NUMBER_FORMAT_MISMATCH、PERSONAL_NUMBER_FORMAT_MISMATCH(additional_data に expected_format と extracted_value が含まれます) |
このエンドポイントでは情報提供のみ(却下されません)
| タグ | 説明 |
|---|---|
POSSIBLE_DUPLICATED_USER | アプリケーション内の別の書類に、同じ生年月日、発行国、非常によく似た氏名があり、vendor_data が異なります。additional_data.duplicated_session_id |
ID_DOCUMENT_IN_BLOCKLIST | この書類は書類ブロックリストに一致します。ここでは情報提供のみです(ワークフローでは自動的に却下されます)。検出して、ご自身で判断してください |
ID_DOCUMENT_IN_ALLOWLIST | 書類番号が許可リストに登録されています |
DOCUMENT_SIDES_MISMATCH | 表面と裏面が同じ書類のものではありません |
UNPARSED_ADDRESS | 書類に住所欄がありますが、解析またはジオコーディングできませんでした |
ワークフロー専用のタグ(ここでは生成されません):DOCUMENT_NOT_SUPPORTED_FOR_APPLICATION、MINIMUM_AGE_NOT_MET、MRZ_NOT_DETECTED、INVALID_DATE、*_MISMATCH_WITH_PROVIDED ファミリー(セッションに expected_details が必要)、前面カメラのセルフィータグ。
デジタル ID ウォレット(単独利用)
独自のアプリから、ユーザーがすでに保有している国または銀行のデジタル ID を使って本人確認できます。ワークフローは不要です。ユーザーは常にウォレットで認証し、共有を承認します。識別子だけで本人確認することはできません。エンドポイントは v3 のみです。
本番環境で利用可能なウォレット(ドキュメントに基づく情報です。お使いのアプリケーションと環境で利用できるかどうかを返すカタログ呼び出しで、必ず確認してください):
| ウォレット | 開始エンドポイント | 国 | 操作方法 | 本人確認済みサインインあたりの定価 |
|---|---|---|---|---|
| MitID | POST /v3/id-verification/wallets/mitid/ | DNK | リダイレクト | $0.25 |
| BankID Sweden | POST /v3/id-verification/wallets/bankid-se/ | SWE | リダイレクト | $0.20 |
| iDIN | POST /v3/id-verification/wallets/idin/ | NLD | リダイレクト | $0.85(完全な本人確認) |
| Finnish Trust Network | POST /v3/id-verification/wallets/ftn/ | FIN | リダイレクト | $0.25 |
| Smart-ID | POST /v3/id-verification/wallets/smart-id/ | EST, LVA, LTU, BEL | アプリ内 | 料金を参照 |
| Mobile-ID | POST /v3/id-verification/wallets/mobile-id/ | EST, LTU | アプリ内 | 料金を参照 |
その他のウォレットには開始エンドポイントがありますが、近日公開予定です。利用できない場合は 403 wallet_unavailable を返し、処理を拒否します。課金はリクエストごとに、本人確認が成功した場合に限り発生します。キャンセル、期限切れ、または失敗したサインインは無料です。また、無料の書類チェック 500 件は適用されません。
| 操作 | エンドポイント |
|---|---|
カタログ:id、name、path、countries、interaction、required_fields、available を含むすべてのウォレット | GET /v3/id-verification/wallets/ |
| サインインを開始 | POST /v3/id-verification/wallets/<wallet>/(カタログの path) |
| ステータスと結果を取得 | GET /v3/id-verification/wallets/verifications/{request_id}/ |
| 電話での承認をウォレットに要求(Smart-ID、Mobile-ID) | POST /v3/id-verification/wallets/verifications/{request_id}/poll/ |
| 保留中のサインインをキャンセル(課金なし) | POST /v3/id-verification/wallets/verifications/{request_id}/cancel/ |
開始リクエスト
| フィールド | ウォレット | 必須 | 説明 |
|---|---|---|---|
return_url | リダイレクト型ウォレット | はい | ブラウザーの戻り先となる HTTPS URL。request_id と result が追加されます。事前にホストを登録する必要があります(以下を参照) |
device | リダイレクト型ウォレット | いいえ | same_device(デフォルト)または cross_device(例:スマートフォンでスキャンする QR コード) |
country | すべて | Smart-ID と Mobile-ID では必須 | ISO 3166-1 alpha-3。単一の国でのみ利用できるウォレットでは、その国がデフォルトになります |
personal_code | Smart-ID、Mobile-ID | はい | ユーザーの国民個人識別コード(数字とハイフンで、6~20 文字)。PIN は決して収集しないでください |
phone_number | Mobile-ID | はい | その国で Mobile-ID に登録された E.164 形式の番号 |
vendor_data | すべて | いいえ | お客様の参照情報。最大 2,000 UTF-8 バイト |
metadata | すべて | いいえ | 結果と webhook とともに返される JSON オブジェクト |
sandbox_scenario | すべて | いいえ | サンドボックスアプリケーションのみ:wallet_cancelled、wallet_timeout、または wallet_provider_error。それ以外は本人確認に成功します。本番アプリケーションでは拒否されます |
ヘッダー Idempotency-Key(任意、最大 255 文字):試行ごとに新しいキーを使用し、再試行時には同じキーを再送信してください。同じキーを別のウォレットまたは本文とともに使用すると、409 idempotency_key_reused が返されます。
戻り先ホストを一度登録してください(リダイレクト型ウォレット):PATCH https://verification.didit.me/v3/webhook/ に {"allowed_return_hosts": ["app.example.com"]} を指定します。ホスト名のみ(スキーム、パス、ワイルドカードは不可)を最大 20 個指定できます。更新のたびにリストは置き換えられ、GET /v3/webhook/ で確認できます。お客様のホワイトラベルドメインは常に許可されます。
開始時は 201、読み取り・ポーリング・キャンセル時は 200 のレスポンス
{
"request_id": "00000000-0000-4000-8000-000000000001",
"wallet_verification": {
"wallet": {"id": "ftn", "name": "Finnish Trust Network", "issuing_authority": "Finnish banks and mobile operators (FTN)"},
"country": "FIN",
"status": "Not Finished",
"outcome": "pending",
"error": null,
"interaction": "redirect",
"simulated": false,
"expires_at": "2026-01-01T10:10:00Z",
"next_action": {"type": "redirect", "url": "https://wallet.example.com/authorize"},
"identity": null,
"attributes": null,
"level_of_assurance": null,
"verified_at": null,
"signature_valid": null,
"credential_type": "person_identification"
},
"vendor_data": "user-123",
"metadata": null,
"created_at": "2026-01-01T10:00:00Z"
}
next_action.type:redirect(ブラウザーをurlに移動)またはconfirm_in_app(ウォレットアプリにも表示される4桁のコードverification_codeを表示します。ユーザーはアプリ内で確認し、poll_interval_secondsごとにポーリングします)。Didit もバックグラウンドでポーリングするため、ポーリングを停止しても Webhook が呼び出されます。outcome:pending、verified、cancelled、timeout、failed。statusはNot Finishedの後、Approved(検証済み)またはDeclinedになります。- 検証完了後の
identity:full_name、first_name、last_name、date_of_birth、nationality(ウォレットがこれを申告した場合のみ)、issuing_state。attributesにはウォレット固有の申告内容が格納され、ウォレットによって異なります。 outcomeがverifiedで、simulatedがfalseの場合にのみ、identity を使用してください。return_urlのresultクエリパラメーターは決して信頼せず、バックエンドから結果を読み取ってください。status.updatedWebhook のsession_idはrequest_idと同じ値です。identity はverification_method: "wallet"を伴ってdecision.id_verificationsに含まれます。
ウォレットのエラー
| コード | error | 意味 |
|---|---|---|
400 | フィールドエラー、return_url_invalid、return_url_not_allowed、invalid_personal_code、invalid_phone_number、idempotency_key_invalid | リクエストを修正し、return_url のホストを登録してください |
403 | {"detail": ...}、wallet_unavailable、insufficient_credits | キーが無効、ウォレットが利用可能になっていない、またはクレジットの追加が必要です |
404 | not_found | このアプリケーションのウォレット検証に、該当する request_id はありません |
409 | idempotency_key_reused、idempotency_key_in_progress、verification_in_progress(ユーザーが手続きを完了中にキャンセルした場合) | 新しいキーを使用するか、Retry-After 秒待ってください |
502 | wallet_provider_unavailable | ウォレットを開始できませんでした。作成も請求も行われていません |
503 | wallet_not_configured | この環境からウォレットに接続できません |
import uuid
import requests
BASE = "https://verification.didit.me/v3/id-verification/wallets"
headers = {"x-api-key": "YOUR_API_KEY"}
catalog = requests.get(f"{BASE}/", headers=headers, timeout=30).json()
live = {w["id"]: w for w in catalog["wallets"] if w["available"]}
if "ftn" in live:
start = requests.post(
f"{BASE}/ftn/",
headers={**headers, "Idempotency-Key": str(uuid.uuid4())},
json={"return_url": "https://app.example.com/identity/complete", "vendor_data": "user-123"},
timeout=30,
).json()
request_id = start["request_id"]
print("Send the browser to:", start["wallet_verification"]["next_action"]["url"])
# After the user returns (or on the webhook), read the result server-side
result = requests.get(f"{BASE}/verifications/{request_id}/", headers=headers, timeout=30).json()
wv = result["wallet_verification"]
if wv["outcome"] == "verified" and not wv["simulated"]:
print("Verified:", wv["identity"]["full_name"], wv["identity"]["date_of_birth"])
API リファレンス: https://docs.didit.me/standalone-apis/digital-id-wallets
ワークフロー専用の ID 検証方法
以下はスタンドアロンエンドポイントでは利用できません。ワークフローとセッションを使用してください(didit-kyc-onboarding スキルを参照)。
- NFC チップの読み取り: ワークフロー機能
NFCをOCRの後に配置します。セッション中にネイティブの iOS/Android SDK がチップを読み取ります。Web ブラウザーではスキップされます。読み取り完了ごとに $0.15 です。 - ワークフロー内での非ドキュメント照会とウォレット:
OCR機能で国ごとにconfig.methodsを設定します(書類の撮影、政府機関の登録簿またはその他の信頼できる情報源との照合、デジタル ID ウォレット、フォールバックルール)。https://docs.didit.me/management-api/workflows/feature-configs および https://docs.didit.me/core-technology/id-verification/non-doc-lookup を参照してください。
一般的なワークフロー
基本的な ID 検証
1. POST /v3/id-verification/ -> front_image (+ back_image if the document has a back)
2. If 400 COULD_NOT_RECOGNIZE_DOCUMENT -> ask for a new photo with all corners visible
3. If "Approved" -> use first_name, last_name, date_of_birth, document_number, issuing_state
If "Declined" -> read warnings with log_type "error":
DOCUMENT_EXPIRED -> ask for a valid document
SCREEN_CAPTURE_DETECTED / PRINTED_COPY_DETECTED -> ask for a photo of the physical document
MRZ_VALIDATION_FAILED / NAME_NOT_DETECTED -> ask for a sharper image (and the back side)
4. Check informational warnings too: ID_DOCUMENT_IN_BLOCKLIST, POSSIBLE_DUPLICATED_USER
本人確認の完全なパイプライン(スタンドアロン)
1. POST /v3/id-verification/ -> verify document, keep portrait_image
2. POST /v3/passive-liveness/ -> verify a real person took the selfie
3. POST /v3/face-match/ -> compare selfie to the document portrait
4. POST /v3/aml/ -> screen the extracted name, date of birth and nationality; convert nationality
from alpha-3 (ESP) to alpha-2 (ES) first, or /v3/aml/ returns 400
5. All Approved -> verified identity
書類とセルフィーを収集するホスト型フローを利用する場合は、ワークフローセッションを使用してください(didit-kyc-onboarding スキル)。
ユーティリティスクリプト
export DIDIT_API_KEY="your_api_key"
python scripts/verify_id.py front.jpg
python scripts/verify_id.py front.jpg back.jpg --vendor-data user-123
python scripts/verify_id.py scan.pdf --front-password secret --no-document-liveness
python scripts/verify_id.py front.jpg back.jpg --preferred-characters non_latin --no-save
python scripts/verify_id.py front.jpg --format-mismatch-action DECLINE --metadata '{"flow": "onboarding"}'