mcpField
D
didit-id-document-verification

didit-id-document-verification

github.com/didit-protocolセキュリティ29266 回インストール2 週間前に更新
リポジトリ

didit-id-document-verification について

書類画像または PDF を使って Didit ID Verification API を呼び出すスキルです。開発者は本人確認書類の分類、項目抽出、データ検証を行い、判定と警告を取得できます。

主な機能

  1. 01書類の自動分類
  2. 02OCR・MRZ・バーコードの読み取り
  3. 03日付と番号形式の照合
  4. 04リプレイや画像改ざんの検出
  5. 05抽出項目と警告の返却

活用シーン

  1. 01提出された画像による本人確認書類の検証
  2. 02申請向けの書類情報抽出
  3. 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 呼び出しで作成できます。

  1. 登録: POST https://apx.didit.me/auth/v2/programmatic/register/ に {"email": "[email protected]", "password": "MyStr0ng!Pass"} を送信します
  2. メールを確認: 6 文字の確認コードを確認します
  3. 確認: 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-Typemultipart/form-data(HTTP クライアントによって設定)はい
リクエストパラメーター(multipart/form-data)
パラメーター型必須デフォルト説明
front_imagefileYes-書類の表面。JPEG/PNG/WebP/TIFF/PDF、最大 10 MB
front_image_passwordstringNo-暗号化された front_image PDF のパスワード
back_imagefileNo-書類の裏面。同じ形式と上限
back_image_passwordstringNo-暗号化された back_image PDF のパスワード
perform_document_livenessbooleanNotrue両方の画像について、画面のキャプチャ、印刷物、顔写真の加工を検出します。いずれかが検出されると却下されます。false にすると検出を省略し、レイテンシーが低下します
invalid_mrz_actionstringNoDECLINEMRZ_VALIDATION_FAILED に対する DECLINE または NO_ACTION
inconsistent_data_actionstringNoDECLINEDATA_INCONSISTENT および MRZ_AND_DATA_EXTRACTED_FROM_OCR_NOT_SAME に対する DECLINE または NO_ACTION
expiration_date_not_detected_actionstringNoNO_ACTIONEXPIRATION_DATE_NOT_DETECTED に対する DECLINE または NO_ACTION(有効期限が印字されていない書類も多くあります)。過去の有効期限が検出された場合は、常に却下されます
critical_field_occlusion_actionstringNoDECLINECRITICAL_FIELD_OCCLUSION_DETECTED に対する DECLINE または NO_ACTION
document_or_personal_number_format_mismatch_actionstringNoNO_ACTIONDOCUMENT_NUMBER_FORMAT_MISMATCH および PERSONAL_NUMBER_FORMAT_MISMATCH に対する DECLINE または NO_ACTION
preferred_charactersstringNolatinlatin または non_latin:両方の文字種が印字された書類で、氏名と住所をどちらの文字種で返すか
save_api_requestbooleanNotruetrue:呼び出しをセッションとして保存します(下記参照)。false:何も保存しません
vendor_datastringNo-ユーザーを識別するための値。応答に含まれ、セッションに保存されます
metadataJSON objectNo-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 を送信してください
401API キーの有効期限が切れていますDevelopers > API keys でキーをローテーションするか、新しいキーを作成してください
403API キーがない、誤っている、または取り消されている、このエンドポイントへのアクセス権がないスコープ付きキーを使用している、キーの 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(トップレベル)uuidsave_api_request=true の場合はセッション ID、それ以外の場合は一度限りの UUID
statusstring"Approved" または "Declined"
document_typestring or null"Passport"、"Identity Card"、"Driver's License"、"Residence Permit"、"Health Insurance Card"、"Tax Card"。書類を分類できなかった場合は null
document_subtypestring or nullより詳細なサブタイプ。例:ID_CARD_GENERIC、EPASSPORT
document_number、personal_numberstring or null書類番号と副次的な個人番号または国民識別番号
first_name、last_name、full_namestring or null所持者の氏名
date_of_birth、expiration_date、date_of_issuestring or nullYYYY-MM-DD
ageinteger or nulldate_of_birth から計算した年齢
genderstring or null"M"、"F"、または null
nationality、issuing_statestring or nullISO 3166-1 alpha-3。issuing_state_name は国名です
address、formatted_addressstring or null印字されている住所と、そのジオコーディング済み形式
parsed_addressobject or nullstreet_1、street_2、city、region、postal_code、country(alpha-2)、formatted_address、is_verified、document_location、label、category
place_of_birth、marital_statusstring or null印字されていない場合、marital_status は UNKNOWN です
extra_fieldsobject or null書類固有の追加情報(例:first_surname、second_surname)
mrzobjectパースされた 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 がない場合、または読み取れなかった場合は {}
barcodesarrayデコードされたバーコード:type(例:PDF417、QR_CODE)、data、data_raw、side、position
portrait_image、front_image、back_imagestring or nullメディア URL(保存済み)、または base64 JPEG(save_api_request=false の場合)。裏面の画像がアップロードされていない場合、back_image は null
front_image_quality_score、back_image_quality_scoreobject or nullfocus_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_scorenullこのエンドポイントでは常に null です(ホストされたセッションでのみ入力されます)
warningsarray{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 のみです。

本番環境で利用可能なウォレット(ドキュメントに基づく情報です。お使いのアプリケーションと環境で利用できるかどうかを返すカタログ呼び出しで、必ず確認してください):

ウォレット開始エンドポイント国操作方法本人確認済みサインインあたりの定価
MitIDPOST /v3/id-verification/wallets/mitid/DNKリダイレクト$0.25
BankID SwedenPOST /v3/id-verification/wallets/bankid-se/SWEリダイレクト$0.20
iDINPOST /v3/id-verification/wallets/idin/NLDリダイレクト$0.85(完全な本人確認)
Finnish Trust NetworkPOST /v3/id-verification/wallets/ftn/FINリダイレクト$0.25
Smart-IDPOST /v3/id-verification/wallets/smart-id/EST, LVA, LTU, BELアプリ内料金を参照
Mobile-IDPOST /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_codeSmart-ID、Mobile-IDはいユーザーの国民個人識別コード(数字とハイフンで、6~20 文字)。PIN は決して収集しないでください
phone_numberMobile-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.updated Webhook の 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キーが無効、ウォレットが利用可能になっていない、またはクレジットの追加が必要です
404not_foundこのアプリケーションのウォレット検証に、該当する request_id はありません
409idempotency_key_reused、idempotency_key_in_progress、verification_in_progress(ユーザーが手続きを完了中にキャンセルした場合)新しいキーを使用するか、Retry-After 秒待ってください
502wallet_provider_unavailableウォレットを開始できませんでした。作成も請求も行われていません
503wallet_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"}'

コメント