mcpField
D
didit-proof-of-address

didit-proof-of-address

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

didit-proof-of-address について

個人の住所を確認する必要があるアプリ向けに、Didit の住所証明書類検証 API を案内するスキルです。書類情報や真正性のシグナルを調べ、抽出値を期待値と照合できます。

主な機能

  1. 01住所証明書類を分類して情報を抽出
  2. 02住所を解析してジオコーディング
  3. 03日付、氏名、住所、国を照合
  4. 04PDF と EXIF の改ざんシグナルを検査
  5. 05QR コードとバーコードを検出

活用シーン

  1. 01登録時の住所書類の確認
  2. 02提出書類と期待する本人情報の照合
  3. 03書類の日付や改ざんの可能性を確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/didit-protocol/skills --skill didit-proof-of-address

インストール後、Claude Code で/didit-proof-of-addressを入力して読み込まれたか確認します。

同梱ファイルscripts/verify_address.py

詳細

Didit Proof of Address API

概要

住所書類(画像または PDF)を 1 回の呼び出しで検証します。書類を分類(種類とサブタイプ)し、発行元、日付、所有者の氏名と住所を抽出します。住所を解析してジオコーディングし、PDF/EXIF のフォレンジックで改ざんを確認し、オプションの expected_* 値と照合します。結果は Approved または Declined で、見つかった問題をすべて説明する warnings リストが含まれます。

料金: 1 回の呼び出しにつき $0.20(200 レスポンスはすべて課金対象で、Approved と Declined のどちらも含みます。単独の呼び出しに無料枠はありません)。これらは 2026 年 11 月 1 日までの標準価格です。同日、Didit の料金体系が変更され、月 500 件の無料チェックは月 $10 分の無料クレジットになります。最新の料金は didit.me/pricing をご確認ください。

主な制約:

  • 形式:JPG、JPEG、PNG、TIFF、PDF、WEBP。複数ページの PDF に対応しています。暗号化された PDF には document_password が必要です。
  • 最大アップロードサイズ:PDF は 50 MB、画像は 6 MB(これを超えるファイルは 400 を返します)
  • 応答時間:通常 5~15 秒、複数ページの PDF は最大 約 30 秒。クライアントのタイムアウトは少なくとも 45 秒に設定し、呼び出しが完了する前に再試行しないでください。
  • 書類の最大経過期間(デフォルト):公共料金の請求書と銀行取引明細書は 3 か月、政府発行書類およびその他の書類は 12 か月です。1 か月は 30 日として計算されます。リクエストごとに poa_document_age_months(1~120、年齢チェックを無効にする場合は -1)で変更できます。印字された有効期限が過ぎている場合も、書類は期限切れとみなされます。
  • 撮影のガイダンス:フルカラーで、すべての角とページが見えるようにし、デジタル編集はしないでください。

機能: 書類の分類、LLM ベースの抽出、住所の解析とジオコーディング(緯度/経度)、言語検出、発行日と経過期間のチェック、氏名/住所/国の照合、PDF および EXIF の改ざんフォレンジック、銀行情報の抽出、QR コードとバーコードの検出。

受け付ける書類の種類(document_type):

種類例(document_subtype)
UTILITY_BILL電気、水道、ガス、インターネット、電話、複合公共料金の請求書
BANK_STATEMENT口座取引明細書、クレジットカード利用明細書、住宅ローンまたはローンの明細書
GOVERNMENT_ISSUED_DOCUMENT納税通知書、居住証明書、選挙人登録カード
OTHER_POA_DOCUMENT賃貸契約書、保険証券、雇用主からのレター

分類できない書類は document_type: "UNKNOWN" となり、INVALID_DOCUMENT_TYPE とともに却下されます。

API リファレンス: https://docs.didit.me/standalone-apis/proof-of-address 機能ガイド: https://docs.didit.me/core-technology/proof-of-address/overview 警告: https://docs.didit.me/core-technology/proof-of-address/warnings-proof-of-address


認証

すべてのリクエストに 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/ で残高を確認し、POST /v3/billing/top-up/ に {"amount_in_dollars": 50} を送信して Stripe のチェックアウトリンクを取得します。

プラットフォーム管理(ワークフロー、セッション、ユーザー、請求)の全容については、didit-verification-management スキルをご覧ください。


エンドポイント

POST https://verification.didit.me/v3/poa/
ヘッダー
ヘッダー値必須
x-api-keyお使いの API キーはい
Content-Typemultipart/form-dataはい
リクエストパラメーター(multipart/form-data)
パラメーター型必須デフォルト説明
documentfileはい-PoA 文書:tiff、jpg、jpeg、png、pdf、webp。PDF は最大 50 MB、画像は最大 6 MB
document_passwordstringいいえ-暗号化された PDF のパスワード。パスワードが未指定または誤っている場合は 400 を返します
expected_addressstringいいえ-照合する住所です。ジオコーディングして文書内の住所と比較します。不一致の場合、または指定した住所を検証できない場合は、ADDRESS_MISMATCH_WITH_PROVIDED が追加されます
expected_countrystringいいえ-ISO 3166-1 alpha-2 または alpha-3 コード(ES または ESP)。文書の国が異なる場合は POA_COUNTRY_MISMATCH_WITH_PROVIDED が追加されます
expected_first_namestringいいえ-name_on_document と照合する名です(あいまい一致、翻字を考慮)。expected_last_name と併せて送信してください。両方が設定されている場合のみ氏名照合が実行されます
expected_last_namestringいいえ-同じ照合に使用する姓です。スコアが 86(0~100)未満の場合は NAME_MISMATCH_WITH_PROVIDED が追加されます
poa_languages_allowedstringいいえサポート対象の全 51 言語ISO 639-1 コードをカンマ区切りで指定します(例:en,es)。別の言語の場合は UNSUPPORTED_DOCUMENT_LANGUAGE が追加されます。不明なコードの場合は、サポート対象の一覧とともに 400 を返します
poa_document_age_monthsstringいいえutility_bill:3,bank_statement:3,government_issued_document:12,other_poa_document:12key:value ペアで指定する、種類ごとの最大経過月数です。値は 1~120、または年齢チェックを行わない場合は -1 を指定します。このパラメーターを送信する場合は、受け入れる種類をすべて指定してください:省略した種類は受け入れ対象外と見なされ(情報通知 POA_DOCUMENT_NOT_SUPPORTED_FOR_APPLICATION)、年齢チェックも行われません
poa_address_mismatch_actionDECLINE / NO_ACTIONいいえDECLINEADDRESS_MISMATCH_WITH_PROVIDED、NAME_MISMATCH_WITH_PROVIDED、POA_COUNTRY_MISMATCH_WITH_PROVIDED に適用されます
poa_document_issues_actionDECLINE / NO_ACTIONいいえDECLINEDOCUMENT_METADATA_MISMATCH に適用されます
poa_document_authenticity_actionDECLINE / NO_ACTIONいいえDECLINESUSPECTED_DOCUMENT_MANIPULATION に適用されます
poa_unsupported_language_actionDECLINE / NO_ACTIONいいえDECLINEUNSUPPORTED_DOCUMENT_LANGUAGE に適用されます
poa_issuer_not_identified_actionDECLINE / NO_ACTIONいいえDECLINEISSUER_NOT_IDENTIFIED に適用されます
poa_name_mismatch_actionDECLINE / NO_ACTIONいいえDECLINE受け付けられますが、適用されません。氏名の不一致には poa_address_mismatch_action が適用されます
save_api_requestbooleanいいえtruetrue:セッションとして保存されます(Business Console、返された request_id を使用する GET /v3/session/{sessionId}/decision/、status.updated ウェブフック)。false:何も保存されず、request_id を使った検索もできません
vendor_datastringいいえ-ユーザーを識別するための値です。レスポンスに含まれ、セッションに保存されます
metadataJSON stringいいえ-文字列フィールドとして送信する JSON オブジェクトです(例:{"flow":"onboarding"})。レスポンスに含まれ、保存されます

サンドボックス: サンドボックス API キーでは、処理と課金がスキップされます。リクエストの検証後(入力が不正な場合は引き続き 400 を返します)、固定の Approved モックレスポンスが返され、何も保存されません。

例
import requests

with open("bill.pdf", "rb") as f:
    response = requests.post(
        "https://verification.didit.me/v3/poa/",
        headers={"x-api-key": "YOUR_API_KEY"},
        files={"document": ("bill.pdf", f, "application/pdf")},
        data={
            "expected_first_name": "Jane",
            "expected_last_name": "Doe",
            "expected_country": "ESP",
            "poa_languages_allowed": "en,es",
            "vendor_data": "user-123",
        },
        timeout=60,  # extraction takes 5-15 s, up to ~30 s for multi-page PDFs
    )
response.raise_for_status()
poa = response.json()["poa"]
print(poa["status"], poa["poa_formatted_address"], [w["risk"] for w in poa["warnings"]])
const formData = new FormData();
formData.append("document", documentFile); // File or Blob
formData.append("expected_first_name", "Jane");
formData.append("expected_last_name", "Doe");
formData.append("expected_country", "ESP");
formData.append("vendor_data", "user-123");

const response = await fetch("https://verification.didit.me/v3/poa/", {
  method: "POST",
  headers: { "x-api-key": "YOUR_API_KEY" },
  body: formData,
  signal: AbortSignal.timeout(60_000),
});
if (!response.ok) throw new Error(`PoA failed: ${response.status} ${await response.text()}`);
const { poa } = await response.json();
console.log(poa.status, poa.warnings.map((w: { risk: string }) => w.risk));
レスポンス(200 OK)
{
  "request_id": "4b523a8d-ed32-45e4-8aa8-a89eda459d88",
  "poa": {
    "issuing_state": "ESP",
    "document_type": "UTILITY_BILL",
    "document_subtype": "ELECTRICITY_BILL",
    "document_language": "es",
    "issuer": "Acme Energy",
    "issue_date": "2026-09-15",
    "expiration_date": null,
    "poa_address": "C/ Mayor 10, 2B, 28013 Madrid",
    "poa_formatted_address": "Calle Mayor 10, 2B, 28013 Madrid, Spain",
    "poa_parsed_address": {
      "street_1": "Calle Mayor 10",
      "street_2": "2B",
      "city": "Madrid",
      "region": "Comunidad de Madrid",
      "country": "ES",
      "postal_code": "28013",
      "document_location": {"latitude": 40.4155, "longitude": -3.7074}
    },
    "expected_details_address": null,
    "expected_details_formatted_address": null,
    "expected_details_parsed_address": null,
    "name_on_document": "JANE DOE",
    "extra_fields": {
      "bank_account_number": null,
      "bank_iban": null,
      "bank_sort_code": null,
      "bank_routing_number": null,
      "bank_swift_bic": null,
      "bank_branch_name": null,
      "bank_branch_address": null,
      "document_phone_number": null,
      "additional_names": []
    },
    "detected_codes": [],
    "status": "Approved",
    "warnings": []
  },
  "vendor_data": "user-123",
  "metadata": null,
  "created_at": "2026-10-12T09:30:00.000000+00:00"
}

文書が却下された場合でも 200 を返します。許容される経過期間を超えた請求書に対する警告の例:

{
  "risk": "POA_DOCUMENT_EXPIRED",
  "feature": "PROOF_OF_ADDRESS",
  "additional_data": {
    "expiration_reason": "age_window",
    "max_age_months": 3,
    "document_subtype": "ELECTRICITY_BILL",
    "document_type": "UTILITY_BILL",
    "issue_date": "2026-02-10"
  },
  "log_type": "error",
  "short_description": "Document expired",
  "long_description": "The submitted document is older than the maximum accepted age of 3 months from its issue date, which exceeds the acceptable time period for validity."
}

レスポンスには文書ファイルやフォレンジックメタデータは含まれません。save_api_request=true の場合、GET /v3/session/{request_id}/decision/ はそれらを poa_verifications[] で返します(document_file は約 4 時間後に期限切れとなる一時 URL です)。

ステータス値と処理
ステータス意味対応
"Approved"却下につながる警告はありません解析された住所を使用します。information 警告が含まれる場合があります
"Declined"少なくとも1つの警告に log_type: "error" がありますwarnings[].risk を確認し、別の書類を求めるか、expected_* 入力を修正します

このエンドポイントが In Review または Not Finished を返すことはありません。HTTP コードだけでなく、必ず poa.status と poa.warnings を確認してください。

エラーレスポンス
コード意味対応
400リクエストが無効ですレスポンス本文のフィールドエラーを確認します
401API キーの有効期限が切れていますキーをローテーションするか、Developers > API keys で新しいキーを作成します
403API キーがない、誤っている、または取り消されている、このエンドポイントへのアクセス権がないスコープ付きキー、キーの IP 許可リスト外からのリクエスト、またはクレジット不足ですdetail または error のメッセージを確認し、x-api-key ヘッダーまたはキーのアクセス権を修正するか、クレジットを追加します
429レート制限:キーごとに1分あたり POST/PATCH/DELETE リクエスト300件、GET リクエスト600件Retry-After の秒数だけ待ってから再試行します

このエンドポイントで 400 となる原因:document がない、許可リスト外の拡張子、50 MB を超える PDF または6 MB を超える画像、暗号化された PDF に document_password がない(または誤っている)、poa_languages_allowed に不明なコードがある、poa_document_age_months の組み合わせが不正、または抽出処理で処理できない書類({"error": ["Error extracting POA information"]})。クレジットの確認は処理の前に行われます。クレジット不足の場合の 403 の本文は {"error": "You don't have enough credits to perform this request. ..."} です。


応答フィールドのリファレンス

フィールド型説明
request_iduuidsave_api_request=true の場合はセッション ID、それ以外の場合は一時的な相関 ID
poa.statusstring"Approved" または "Declined"
poa.issuing_statestring/null書類の発行国。通常は ISO 3166-1 alpha-3(ESP)
poa.document_typestringUTILITY_BILL、BANK_STATEMENT、GOVERNMENT_ISSUED_DOCUMENT、OTHER_POA_DOCUMENT または UNKNOWN
poa.document_subtypestring例:ELECTRICITY_BILL、WATER_BILL、ACCOUNT_STATEMENT、CREDIT_CARD_STATEMENT、TAX_ASSESSMENT。判定できない場合は UNKNOWN
poa.document_languagestring/nullISO 639-1 コード
poa.issuerstring/null発行会社または組織。null の場合は ISSUER_NOT_IDENTIFIED が追加されます
poa.issue_datedate/nullYYYY-MM-DD。null の場合は UNABLE_TO_EXTRACT_ISSUE_DATE で却下されます
poa.expiration_datedate/null書類に印字されている有効期限(該当する場合)
poa.poa_addressstring/null印字されている住所。null の場合は MISSING_ADDRESS_INFORMATION で却下されます
poa.poa_formatted_addressstring/nullジオコーディングで正規化された住所
poa.poa_parsed_addressobject/null{street_1, street_2, city, region, country, postal_code, document_location}。country は ISO alpha-2
poa.poa_parsed_address.document_locationobject/null書類上の住所の {latitude, longitude}
poa.expected_details_addressstring/nullexpected_address のエコー
poa.expected_details_formatted_addressstring/nullジオコーディングされた expected_address
poa.expected_details_parsed_addressobject/nullexpected_address のジオコーディング結果。is_verified フラグを含みます
poa.name_on_documentstring/null主たる名義人の名前。null の場合は POA_NAME_NOT_DETECTED で却下されます
poa.extra_fieldsobjectbank_account_number、bank_iban、bank_sort_code、bank_routing_number、bank_swift_bic、bank_branch_name、bank_branch_address、document_phone_number(存在しない場合は null)、additional_names(配列)
poa.detected_codesarrayQR コードとバーコード:type、page_number、position、x、y、width、height、page_width、page_height、raw_payload(base64)、parsed_payload(デコードできない場合は null)
poa.warningsarray{risk, feature, additional_data, log_type, short_description, long_description}。feature は常に PROOF_OF_ADDRESS です
vendor_datastring/nullvendor_data のエコー
metadataobject/nullmetadata のエコー
created_atstringISO 8601 UTC タイムスタンプ

警告タグ

log_type は error(Declined に設定)または information(影響なし)です。このエンドポイントでは warning は生成されません。

常に却下
タグ原因
MISSING_ADDRESS_INFORMATION住所を抽出できませんでした
POA_DOCUMENT_EXPIRED該当する種類の許容期間を超えているか、印字された有効期限を過ぎています。additional_data:expiration_reason(age_window または printed_expiration)、document_type、document_subtype、issue_date、および max_age_months または expiration_date
INVALID_DOCUMENT_TYPEPoA 書類として分類できません(document_type: "UNKNOWN")
UNABLE_TO_VALIDATE_DOCUMENT_AGE書類の有効期間のチェック自体に失敗しました
UNABLE_TO_EXTRACT_ISSUE_DATE発行日が見つかりませんでした(このエンドポイントでは設定できません)
POA_NAME_NOT_DETECTED名義人の名前が見つかりませんでした(このエンドポイントでは設定できません)
設定可能(デフォルトは DECLINE、NO_ACTION にすると information)
タグ原因オプション
NAME_MISMATCH_WITH_PROVIDEDname_on_document が expected_first_name + expected_last_name と一致しませんpoa_address_mismatch_action
ADDRESS_MISMATCH_WITH_PROVIDED書類の住所が expected_address と異なるか、いずれかの住所を確認できませんでしたpoa_address_mismatch_action
POA_COUNTRY_MISMATCH_WITH_PROVIDED書類の国が expected_country と異なります。additional_data:expected_country、extracted_countrypoa_address_mismatch_action
DOCUMENT_METADATA_MISMATCHファイルが空、ファイルのメタデータを読み取れない、または EXIF の日付形式が不正ですpoa_document_issues_action
SUSPECTED_DOCUMENT_MANIPULATIONフォレンジック検査で編集の痕跡が見つかりました。デジタル署名後の変更、テキストオーバーレイによる改ざん、既知の PDF エディターの使用、EXIF 日付の不整合、不審な再エクスポートが含まれます。additional_data:reason、detection_methodpoa_document_authenticity_action
UNSUPPORTED_DOCUMENT_LANGUAGE言語が poa_languages_allowed に含まれていませんpoa_unsupported_language_action
ISSUER_NOT_IDENTIFIED発行機関が見つかりませんでしたpoa_issuer_not_identified_action
このエンドポイントでは情報提供のみ(却下されません)
タグ原因
POA_DOCUMENT_NOT_SUPPORTED_FOR_APPLICATION検出されたタイプが poa_document_age_months から除外されています
UNPARSABLE_OR_INVALID_ADDRESS住所を読み取れましたが、有効な居住用住所として解析およびジオコーディングできませんでした

FUTURE_ISSUE_DATE、POOR_DOCUMENT_QUALITY、NAME_MISMATCH_ID_VERIFICATION、POA_NAME_MISMATCH_BETWEEN_DOCUMENTS、POA_MAX_ATTEMPTS_EXCEEDED は、このエンドポイントでは生成されません(ワークフローセッションで使用されます)。発行日が未来の日付の書類が、このエンドポイントで自動的に却下されることはありません。


一般的なワークフロー

基本的な住所確認
1. POST /v3/poa/ with the document (client timeout >= 45 s)
2. "Approved" -> store poa_formatted_address / poa_parsed_address
   "Declined" -> branch on warnings[].risk:
     POA_DOCUMENT_EXPIRED            -> ask for a more recent document
     MISSING_ADDRESS_INFORMATION     -> ask for a clearer, complete document
     INVALID_DOCUMENT_TYPE           -> ask for a utility bill, bank statement or official letter
     UNABLE_TO_EXTRACT_ISSUE_DATE    -> ask for a document with a visible issue date
     SUSPECTED_DOCUMENT_MANIPULATION -> do not accept; ask for the original file
住所と本人確認情報の照合

単独での呼び出しは ID チェックと関連付けられないため、すでに信頼しているデータを渡してください。

1. POST /v3/id-verification/ -> read id_verification.first_name, last_name, issuing_state
   (see the didit-id-document-verification skill)
2. POST /v3/poa/ with expected_first_name, expected_last_name, expected_country
   (and expected_address if the user typed one)
3. NAME_MISMATCH_WITH_PROVIDED / ADDRESS_MISMATCH_WITH_PROVIDED / POA_COUNTRY_MISMATCH_WITH_PROVIDED
   -> Declined by default; send poa_address_mismatch_action=NO_ACTION to only flag them
保存済みの結果の取得または修正
1. Call with save_api_request=true (default); keep request_id
2. GET /v3/session/{request_id}/decision/ -> poa_verifications[] with document_file and forensics
3. To fix extracted fields after a manual review, PATCH /v3/session/{sessionId}/update-poa-data/
   (documented in the didit-verification-management skill)

ユーティリティスクリプト

verify_address.py:コマンドラインから住所証明書類を確認します。JSON レスポンスを出力した後、ステータス、住所、警告リスクを表示します。

# Requires: pip install requests
export DIDIT_API_KEY="your_api_key"
python scripts/verify_address.py utility_bill.pdf
python scripts/verify_address.py bank_statement.jpg --vendor-data user-123
python scripts/verify_address.py bill.pdf --first-name Jane --last-name Doe --country ESP
python scripts/verify_address.py bill.pdf --expected-address "Calle Mayor 10, 28013 Madrid" --languages en,es
python scripts/verify_address.py bill.pdf --document-age utility_bill:6,bank_statement:6,government_issued_document:12,other_poa_document:12
python scripts/verify_address.py locked.pdf --password "pdf-password" --no-save

コメント