無料
開発、テスト、そして最初のユーザー向け。
- 毎月500件のフルKYC認証
- 本人確認、生体認証、顔照合、デバイス&IP
- 200以上の不正検知シグナル、ブロックリスト、重複チェック
- Diditネットワーク全体でKYCを再利用可能
- ワークフロービルダー、ケース管理、SDK
- AIサポート コンソール内AIエージェント、ドキュメント、コミュニティ。
世界中の3,000以上の組織から信頼されています。
EUDIウォレットとは
EUDIウォレットは、eIDAS 2として知られる規則(EU)2024/1183に基づき、EU加盟各国が提供しなければならない無料アプリです。氏名、生年月日、出生地、国籍などの個人識別データ(PID)に加え、運転免許証や卒業証書などの属性の電子証明を保持します。利用は任意です。
企業がデータを要求する際、利用者は誰が要求しているかを確認し、要求された属性のみを共有します。これは選択的開示と呼ばれ、サイトは生年月日を見ることなく、その人物が18歳以上であることを知ることができます。このウォレットは、3つのeIDASレベルの中で最も強力な「保証レベル高」で機能し、企業はデータに依拠する前に発行者の署名を検証します。
最終レビュー日:2026年10月5日。法的助言ではありません。
2024年4月30日
eIDAS規則(EU)No 910/2014を改正する規則(EU)2024/1183がEU官報に掲載されました。掲載から20日後に発効します。
2024年12月24日
ウォレットに関する最初の5つの実施規則(個人識別データ、コア機能、通知、認証、プロトコルとインターフェース)が発効します。これにより、以下の24ヶ月および36ヶ月の期間が開始されます。
2026年7月15日
欧州委員会は実施規則(EU)2026/1731を採択します。これにより、2つの資格情報形式(SD-JWT VCとISO/IEC mdoc)が設定され、2028年には必須のポートレートが予定されています。
2026年7月23日
ウォレットと依拠当事者が構築する技術的設計図であるArchitecture and Reference Framework (ARF) がバージョン3.0.0に到達します。
2026年12月24日
各加盟国は少なくとも1つのEUDIウォレットを提供しなければなりません。依拠当事者の登録に関する規則である実施規則(EU)2025/848も同日から適用されます。
2027年12月24日
法律または契約により強力なユーザー認証を使用しなければならない民間企業(零細企業・小企業を除く)は、ユーザーがウォレットの使用を要求した場合、これを受け入れなければなりません(第5f条第2項)。この期限は、最初の実施法が2024年12月24日に発効してから36ヶ月後、すなわち2027年12月24日です。
2028年8月11日
ポートレートが必須の個人識別データの一部となり、ウォレットは各依拠当事者の登録証明書を認証・検証しなければなりません。
対象者
公共機関
分かりやすい言葉で解説
加盟国が公共オンラインサービスへのアクセスに電子認証を義務付けている場合、そのサービスはEUDIウォレットも受け入れる必要があります。
条項・日付
第5f条(1)
対象者
強力なユーザー認証が義務付けられている民間サービス
分かりやすい言葉で解説
法律または契約により、オンライン認証に強力なユーザー認証の使用が義務付けられている場合、EUDIウォレットも受け入れる必要があります。これは、お客様の業界ではなく、その要件によって発生します。
条項・日付
第5f条(2)・2027年12月24日
対象者
条項で指定されている分野
分かりやすい言葉で解説
運輸、エネルギー、銀行、金融サービス、社会保障、医療、飲料水、郵便サービス、デジタルインフラ、教育、電気通信。条項には「含む」とあるため、リストは例示であり、限定的なものではありません。
条項・日付
第5f条(2)
対象者
零細企業・小企業
分かりやすい言葉で解説
委員会勧告2003/361/ECで定義されている民間部門の義務から免除されます。ただし、任意でウォレットを受け入れることは可能です。
条項・日付
第5f条(2)
対象者
ユーザーの要求があった場合のみ
分かりやすい言葉で解説
ウォレットの受け入れは、ユーザーがウォレットの使用を要求した場合に義務付けられます。ユーザーにとっての使用は任意であり、サービスは他の認証手段も引き続き提供する必要があります。
条項・日付
第5f条(2)、第5a条(15)
対象者
非常に大規模なオンラインプラットフォーム
分かりやすい言葉で解説
デジタルサービス法に基づき指定され、ユーザー認証を必要とするプラットフォームは、ユーザーの要求に応じて、サービスが必要とする最小限のデータについてウォレットを受け入れる必要があります。条文には、この義務について別個の日付は定められていません。
条項・日付
第5f条(3)
依拠当事者は、設立された加盟国で登録する必要があり、登録したデータのみを要求できます(第5b条)。最終レビュー日:2026年10月5日。法的助言ではありません。
設立された加盟国で、詳細情報と要求する予定のデータを登録します。ウォレットへの認証に使用するアクセス証明書と、加盟国が発行する場合は、登録した属性を記載した登録証明書を受け取ります。
EUDIウォレットの受け入れが開始された際(近日公開予定)、Diditがこれらのステップを実行します。
デューデリジェンスの要件
氏名(フルネーム)
AMLR 第22条(1)(a)
EUDIウォレットPIDに含まれる情報
姓と名、両方必須です。
Diditが現在カバーする方法
現行の各国eIDはフルネームを返します。ドキュメントルートは14,000種類以上のドキュメントから読み取ります。
デューデリジェンスの要件
出生地と生年月日(フル)
AMLR 第22条(1)(a)
EUDIウォレットPIDに含まれる情報
生年月日と出生地、両方必須です。
Diditが現在カバーする方法
現行の各国eIDは生年月日を返します。ドキュメントルートは、ドキュメントに記載されている出生地を読み取ります。
デューデリジェンスの要件
国籍
AMLR 第22条(1)(a)
EUDIウォレットPIDに含まれる情報
国籍、必須、1つ以上の国。
Diditが現在カバーする方法
ドキュメントルートは、身分証明書またはそのチップから国籍を読み取ります。
デューデリジェンスの要件
該当する場合、国民識別番号
AMLR 第22条(1)(a)
EUDIウォレットPIDに含まれる情報
個人管理番号、任意。各加盟国が発行するかどうかを決定します。
Diditが現在カバーする方法
現行の各国eIDはスキーム固有の識別子を返します。スウェーデンのpersonnummer、フィンランドの個人識別コード、またはバルト諸国の個人コードなどです。MitIDは、CPR番号ではなく、仮名化された識別子を返します。
デューデリジェンスの要件
通常の居住地
AMLR 第22条(1)(a)
EUDIウォレットPIDに含まれる情報
住所フィールドは任意であり、しばしば欠落しています。AMLAの最終ドラフト基準では、欠落している属性は他の手段で取得する必要があるとされています。
Diditが現在カバーする方法
現行の各国eIDは住所を返しません。住所証明は、公共料金の請求書、銀行取引明細書、または政府発行の書簡を確認します。
デューデリジェンスの要件
利用可能な場合、納税者識別番号
AMLR 第22条(1)(a)
EUDIウォレットPIDに含まれる情報
PIDには含まれません。
Diditが現在カバーする方法
同じワークフロー内でアンケートステップを使用して収集します。
デューデリジェンスの要件
本人確認
ARF・ユーザーバインディング
EUDIウォレットPIDに含まれる情報
ポートレートは、2028年8月11日に必須となるまで任意です。
Diditが現在カバーする方法
ドキュメント写真またはチップの顔写真に対するパッシブライブネスと1:1の顔照合を、$0.33のフルKYCチェックとして実行します。
デューデリジェンスの要件
会社の受益者
AMLR 第20条(1)(b)
EUDIウォレットPIDに含まれる情報
PIDには含まれません。ウォレットは個人を識別するものであり、会社の所有者を識別するものではありません。
Diditが現在カバーする方法
ビジネス認証は、レジストリが保持しているレジストリデータと所有者情報を取得し、各所有者に対して本人確認を行います。
デューデリジェンスの要件
制裁対象者および政治的要人(PEP)
AMLR 第20条(1)(d), (g)
EUDIウォレットPIDに含まれる情報
PIDには含まれません。
Diditが現在カバーする方法
1,300以上の制裁リスト、PEPリスト、ウォッチリストに対するAMLスクリーニングを1チェックあたり$0.20で提供します。
デューデリジェンスの要件
関係の目的と継続的なモニタリング
AMLR 第25条、第26条
EUDIウォレットPIDに含まれる情報
PIDには含まれません。
Diditが現在カバーする方法
アンケートで関係の目的を記録します。継続的なモニタリングは、顧客を毎日再スクリーニングし、1人あたり年間$0.07で提供します。
顧客デューデリジェンスは引き続きお客様の義務です。Diditはチェックと証拠を提供しますが、お客様のコンプライアンスを保証するものではありません。AMLRは2027年7月10日から適用され、AMLAの技術標準は2026年9月30日付けの最終草案であり、法律ではありません。
2026年10月5日時点のステータス
国
イタリア
ウォレットまたはアプリ
IT-Wallet (app IO)
ステータス
稼働中アプリ日付
2026年2月17日
既知の情報
IOアプリは稼働中で、2026年2月17日までに1,010万件のアクティベーションと1,730万件のドキュメントがロードされました。CIEまたはSPIDでサインインする成人向けに無料で提供されています。
情報源: innovazione.gov.it
国
デンマーク
ウォレットまたはアプリ
AltID
ステータス
稼働中アプリ日付
2026年8月4日
既知の情報
AltIDはデジタル身分証と年齢証明を提供して稼働しており、2026年8月4日までに281,390人が作成しました。デジタル政府庁がウォレットを段階的に導入しています。
情報源: digst.dk
国
フランス
ウォレットまたはアプリ
France Identité
ステータス
稼働中アプリ日付
公式な日付なし
国
チェコ
ウォレットまたはアプリ
eDoklady
ステータス
稼働中アプリ日付
公式な日付なし
国
ドイツ
ウォレットまたはアプリ
EUDI-Wallet (BMDS)
ステータス
サンドボックス日付
2027年1月
既知の情報
2025年12月から公開サンドボックスが利用可能です。アプリは2027年初頭にID機能から提供開始予定です。関連法案は2026年9月23日に連邦議会で第一読会を通過しました。
情報源: eudi-wallet.gov.de
国
スペイン
ウォレットまたはアプリ
Cartera Digital (Beta)
ステータス
パイロット版日付
2026年
国
ギリシャ
ウォレットまたはアプリ
Gov.gr Wallet
ステータス
パイロット版日付
2026年
国
アイルランド
ウォレットまたはアプリ
Government Digital Wallet
ステータス
パイロット版日付
2026年
国
キプロス
ウォレットまたはアプリ
National wallet
ステータス
パイロット版日付
2026年
国
スロバキア
ウォレットまたはアプリ
National EUDI Wallet
ステータス
パイロット版日付
公式な日付なし
国
オランダ
ウォレットまたはアプリ
NL Wallet
ステータス
計画中日付
公式な日付なし
国
ポーランド
ウォレットまたはアプリ
mObywatel
ステータス
計画中日付
公式な日付なし
国
フィンランド
ウォレットまたはアプリ
National EUDI Wallet (DVV)
ステータス
計画中日付
公式な日付なし
国
ブルガリア
ウォレットまたはアプリ
National EUDI Wallet
ステータス
計画中日付
公式な日付なし
国
クロアチア
ウォレットまたはアプリ
Certilia
ステータス
計画中日付
公式な日付なし
国
ルーマニア
ウォレットまたはアプリ
National EUDI Wallet
ステータス
計画中日付
公式な日付なし
国
スウェーデン
ウォレットまたはアプリ
Digital identitetsplånbok (DIGG)
ステータス
計画中日付
公式な日付なし
記載なし: オーストリア, ベルギー, エストニア, ハンガリー, ラトビア, リトアニア, ルクセンブルク, マルタ, ポルトガル, スロベニア。これらの国については、この日付で公開されている情報は見つかりませんでした。この表は、各国のアプリがリリースされ次第更新します。
ウォレットカタログから
Diditが分類するレベルです。住所や顔写真は返されません。
ワークフロー内で国ごとに設定可能
EEA諸国をリストアップ
ウォレット認証情報形式
EUDI Walletの導入時期や価格は未定です。
サービスがQRコードを表示し、ユーザーはウォレットアプリでそれをスキャンします。
ウォレットは、誰がどの属性を要求しているかを表示します。
ユーザーが承認すると、要求された属性のみがスマートフォンから共有されます。
サービスは発行者の署名を確認し、続行します。他の情報は共有されませんでした。
標準フローの例です。DiditのEUDIウォレット対応は近日中に開始予定です。
$ curl -X POST https://verification.didit.me/v3/session/ \
-H "x-api-key: $DIDIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"workflow_id": "YOUR_EID_WORKFLOW_UUID",
"vendor_data": "customer_8412"
}'{ "url": "https://verify.didit.me/session/…" }{
"id_verifications": [{
"status": "Approved",
"verification_method": "wallet",
"assurance": "cryptographic",
"wallet_provider": "mitid",
"wallet_verification": {
"issuing_country": "DNK",
"level_of_assurance": "substantial",
"signature_valid": true,
"attributes": {
"full_name": "Freja Nielsen",
"date_of_birth": "1988-03-02"
},
"portrait": null
}
}]
}verification_method: "wallet"# Didit: get ready for the EUDI Wallet with the ID Verification step you run today
You are adding electronic identification to my_stack so the product is ready
for the EU Digital Identity (EUDI) Wallet. Every URL, header and enum value
below is canonical. Do not paraphrase or "improve" them.
## 0. What exists today, and what does not
- EUDI Wallet acceptance on Didit is coming soon. There is NO EUDI-specific
endpoint, wallet id, field or flag to integrate yet. Do not invent one, do
not send any EUDI identifier in a workflow, and do not build an OpenID4VP
verifier yourself as part of this task.
- What is live: national digital ID wallets inside the ID Verification step,
with document capture (chip reading, liveness, face match) as the fallback.
EUDI Wallet acceptance is planned for the same ID Verification step, so the
workflow, session call and webhook you build now are the ones you keep.
- The live wallets, as listed by the methods catalog:
- MitID: wallet id mitid, country keys DNK (Denmark)
- BankID: wallet id bankid_se, country keys SWE (Sweden)
- Finnish Trust Network: wallet id ftn, country keys FIN (Finland)
- Smart-ID: wallet id smart_id, country keys EST (Estonia), LVA (Latvia), LTU (Lithuania), BEL (Belgium)
- Mobile-ID: wallet id mobile_id, country keys EST (Estonia), LTU (Lithuania)
Check the catalog for your environment before you go live. Never
hard-code dates.
## 1. Provision an account
- Sign up: https://business.didit.me (no credit card required).
- Copy the API key of your application from the console.
## 2. Read the methods catalog
Availability is server-driven per country. Only wallets marked available can
be enabled on a live application.
- Business Console: your application -> Workflows -> the ID Verification
step -> Countries -> "Wallets accepted". Coming-soon wallets are listed
but cannot be switched on. https://docs.didit.me/console/id-verification-methods
- Didit MCP server (https://mcp.didit.me/mcp), tool
didit_workflow_get_id_verification_methods_catalog; pass country as ISO
3166-1 alpha-3 to narrow it. The MCP server signs in with "Log in with
Didit" (OAuth). It does not accept the x-api-key.
https://docs.didit.me/integration/mcp/tools
- Public coverage table (no sign-in, read-only):
https://docs.didit.me/core-technology/id-verification/digital-id-wallets#supported-wallets
If your code holds only an API key, it cannot read the catalog itself: use the
wallet ids listed in this prompt, and treat the answer of the workflow save as
the check. A live application answers 400 for a wallet that is not available
in that country ("<wallet> is not offered in <ISO3>", "unknown wallet").
## 3. Create the workflow (ID Verification = feature OCR)
POST https://verification.didit.me/v3/workflows/
-H "x-api-key: <your-api-key>"
-H "Content-Type: application/json"
{
"workflow_label": "eID onboarding",
"features": [
{
"feature": "OCR",
"config": {
"methods": {
"DNK": {
"document": { "enabled": true },
"wallet": {
"enabled": true,
"providers": ["mitid"],
"on_failure": "fallback_to_document"
}
},
"EST": {
"document": { "enabled": true },
"wallet": {
"enabled": true,
"providers": ["smart_id", "mobile_id"],
"on_failure": "fallback_to_document"
}
}
}
}
}
]
}
Response: 201. The workflow id is uuid (workflow_id carries the same value);
the workflow is published straight away. Create it once and keep the id:
every call to this endpoint makes a new workflow.
is_desktop_allowed defaults to false: on a desktop browser the hosted flow
then shows a QR code to continue on a phone. Add "is_desktop_allowed": true
next to workflow_label to let people finish on desktop.
Rules the API enforces:
- OCR is UPPERCASE; ID_VERIFICATION is rejected in this body (the decision
later lists the step as ID_VERIFICATION in its features)
- country keys are ISO 3166-1 alpha-3; method keys are document, id_lookup, wallet
- providers is an accept-list, not a ranking; the end user picks
- on_failure is fallback_to_document or decline
- a wallet the catalog does not mark available rejects the whole save (400)
- every other country keeps document capture, so people without an eID
can still verify
- this body runs document capture only. Chip reading, liveness and face
match are their own features: add { "feature": "NFC" },
{ "feature": "LIVENESS" } and { "feature": "FACE_MATCH" } to features
when your policy needs them
## 4. Create a session
POST https://verification.didit.me/v3/session/
-H "x-api-key: <your-api-key>"
-H "Content-Type: application/json"
-d '{ "workflow_id": "<id from step 3>", "vendor_data": "<your user id>" }'
Response: 201 with session_id, session_token, url and status "Not Started".
Redirect the user to url (hosted flow) or open it in the Web, iOS, Android,
React Native or Flutter SDK. The field is named url on this response.
One unfinished session exists per workflow_id and vendor_data pair: calling
create again with the same pair answers 201 again with that same session.
## 5. Webhook
Register a destination in the console (API & Webhooks), or over the API:
POST https://verification.didit.me/v3/webhook/destinations/
-H "x-api-key: <your-api-key>"
-H "Content-Type: application/json"
-d '{
"label": "Verification webhooks",
"url": "https://<your-public-host>/webhooks/didit",
"webhook_version": "v3",
"subscribed_events": ["status.updated", "data.updated"]
}'
label, url and subscribed_events are required. url must be a public HTTPS
address: Didit does not deliver to localhost or private addresses. Response:
201 with uuid and secret_shared_key. Store secret_shared_key as the webhook
secret (DIDIT_WEBHOOK_SECRET); it is unique to this destination. Remove a
destination with DELETE /v3/webhook/destinations/{uuid}/ (204).
What arrives:
- webhook_type is "status.updated" (the session changed status) or
"data.updated" (verification data was corrected after the fact)
- a destination receives the events of every session of the application,
so filter on workflow_id or vendor_data when several flows share it
- creating a session already sends status.updated with status
"Not Started". The decision key is present only when status is Approved,
Declined, In Review or Abandoned.
Verify every delivery:
Header: X-Signature-V2 (not X-Signature, not X-Signature-Simple)
Algorithm: HMAC-SHA256, hex digest, over the canonical JSON of the payload
(Python json.dumps(sort_keys=True, separators=(",", ":"),
ensure_ascii=False) after whole-valued floats become ints).
Never hash the raw request bytes under this header.
Freshness: the signed body field timestamp is the dispatch time (Unix
seconds). Reject when abs(now - timestamp) > 300 seconds, and
reject when the X-Timestamp header does not equal it.
Idempotency: event_id is the same on every retry of one event, so store it
and skip a delivery you already processed. One session can
still send the same status under two event ids, and the
console's Try Webhook test deliveries carry no event_id, so
also make the handler safe to run twice for one
(session_id, status, webhook_type).
Compare: constant-time (crypto.timingSafeEqual)
Reference handler (Express). Keep the verification lines as written.
The handler is a fragment. Put this above it and app.listen(process.env.PORT)
below it. It needs Express and Node 21 or newer (an older Node rejects
every delivery). It expects a JSON body: answer 400 yourself if you accept
anything else on this route, and refuse to start without the secret.
const express = require("express");
const app = express();
const SECRET = process.env.DIDIT_WEBHOOK_SECRET; // secret_shared_key of the destination
// Your endpoint receives a signed payload
const crypto = require("node:crypto"); // ESM: import crypto from "node:crypto"
// X-Signature-V2 = HMAC over the canonical JSON, never the raw bytes. Match the sender byte for
// byte: keys sorted by code point, integers digit for digit, floats in Python's repr.
class Num { constructor(src) { this.src = src; } } // a number as written on the wire, not a double
const num = (s) => { if (/^-?\d+$/.test(s)) return BigInt(s).toString(); const n = +s; // ints stay exact
if (Number.isInteger(n)) return BigInt(n).toString(); const [m, e] = n.toExponential().split("e"); // 27.0 -> 27
return +e >= -4 ? String(n) : `${m}e-${String(-e).padStart(2, "0")}`; }; // 1e-05, not 0.00001
const byCodePoint = (a, b) => Buffer.compare(Buffer.from(a), Buffer.from(b)); // UTF-8 order = Python's
const canon = (v) => Array.isArray(v) ? `[${v.map(canon)}]` : v instanceof Num ? num(v.src)
: v && typeof v === "object" ? `{${Object.keys(v).sort(byCodePoint).map((k) => `${JSON.stringify(k)}:${canon(v[k])}`)}}`
: JSON.stringify(v);
// Read the body as text: express.json() would round 1000000000000000129 to a double first.
// Register this route ABOVE any global app.use(express.json()): the first parser to run
// consumes the stream, and a body it already parsed has lost the digits the signature covers.
app.post("/webhooks/didit", express.text({ type: "application/json" }), (req, res) => {
const exact = JSON.parse(req.body, (k, v, c) => typeof v === "number" ? new Num(c.source) : v); // Node 21+
const body = JSON.parse(req.body);
const mac = crypto.createHmac("sha256", SECRET).update(canon(exact), "utf8").digest("hex");
const sig = Buffer.from(String(req.headers["x-signature-v2"] ?? ""));
// Freshness comes from the signed body timestamp; the header alone is unsigned and replayable.
const ts = body.timestamp, fresh = String(ts) === req.headers["x-timestamp"]
&& Math.abs(Date.now() / 1000 - ts) <= 300;
if (!fresh || sig.length !== mac.length
|| !crypto.timingSafeEqual(sig, Buffer.from(mac))) return res.sendStatus(401);
const { status, decision } = body;
// One entry per ID Verification node; pick yours by node_id when you run several.
const [idv] = decision?.id_verifications ?? [];
// idv.verification_method: "document" | "id_lookup" | "wallet"
res.sendStatus(200);
});
Status values (exact strings): Not Started, In Progress, Approved, Declined,
In Review, Resubmitted, Expired, Abandoned, Kyc Expired. Awaiting User only
appears on business verification sessions.
## 6. Read the result
The same V3 decision reaches you two ways:
- webhook body: body.decision.id_verifications[]
- GET https://verification.didit.me/v3/session/{session_id}/decision/
-H "x-api-key: <your-api-key>"
This response IS the decision object. Read id_verifications at the top
level: there is no decision wrapper here.
Until the user finishes the ID step, status is "Not Started" or "In Progress"
and id_verifications is null, not an empty array. Guard for it.
id_verifications[] has one entry per ID Verification node; with a single step
take index 0. A wallet sign-in sets:
verification_method "wallet"
assurance "cryptographic"
wallet_provider the catalog wallet id the user picked
wallet_verification provider, provider_name, issuing_authority,
issuing_country, credential_type, level_of_assurance,
verified_at, signature_valid, attributes, portrait
(null for the live wallets), face_match_score
fallback_from { method, reason, action } when the wallet sign-in failed
and on_failure declined the session; otherwise
null. After a document fallback that succeeds the
entry reads verification_method "document" with
fallback_from null
full_name, the normalised identity fields, on the entry itself
date_of_birth
On a live application, check wallet_verification.signature_valid before you
trust attributes. The
live wallets return name, date of birth and a scheme identifier (for example
the Swedish personnummer; MitID returns a pseudonymised identifier), never an
address or a portrait: collect those through other steps if your policy
needs them.
Reference: https://docs.didit.me/core-technology/id-verification/digital-id-wallets
## 7. Billing
Only completed wallet sign-ins are billed; cancelled, timed-out and failed
ones are free. Prices per wallet: https://didit.me/pricing
## 8. Verify your integration
Sandbox (an application in sandbox mode: nothing is billed and no real eID is
called). https://docs.didit.me/integration/sandbox-testing
- a sandbox application can enable every wallet in the catalog, the
coming-soon ones included. A workflow that saves in sandbox can still be
refused on a live application, so only use wallets marked available.
- open the session url, pick the wallet and confirm: the default approve
scenario simulates the sign-in. The entry then has verification_method
"wallet", assurance "cryptographic" and wallet_provider set, and the
normalised full_name and date_of_birth are filled. But
wallet_verification.signature_valid and level_of_assurance are null and
attributes is { "sandbox": true }: no real credential was checked.
Assert signature_valid === true and the level of assurance only against
a live application.
- to exercise on_failure, create the session with
"sandbox_scenario": "wallet_cancelled" (also wallet_timeout and
wallet_provider_error). The wallet sign-in then fails and the flow moves
to document capture or declines, as on_failure says. A fallback that
ends in an approved document reads verification_method "document".
- POST /v3/session/{session_id}/simulate/ forces a final status but writes
no id_verifications entry, so it cannot stand in for a sign-in.
Checks:
- create the workflow, create a session, and read its decision: expect 201,
201 with url, and 200 with status "Not Started"
- run one sandbox session per accepted wallet through the hosted flow and
assert verification_method is "wallet" and wallet_provider is the wallet
you picked
- run one session with sandbox_scenario "wallet_cancelled" and assert the
flow offers document capture
- assert the webhook accepts a correctly signed payload and rejects a wrong
X-Signature-V2, a changed body, and a payload whose signed timestamp is
older than 300 seconds, even when X-Timestamp is refreshed
- on a live application, assert wallet_verification.signature_valid is true
Docs: https://docs.didit.me/core-technology/id-verification/digital-id-wallets
開発、テスト、そして最初のユーザー向け。
25以上のモジュールを公開価格で提供。自動ボリュームディスカウントあり。
大量利用や規制対象プログラム向け。
利用量の増加に応じて割引が自動適用されます。交渉や営業担当とのやり取りは不要です。
Diditは、本人確認と不正対策のためのインフラです。私たちが自分たちでプロダクトを開発していた時に「こんなプラットフォームがあれば」と願ったものを形にしました。オープンで柔軟、そして開発者に優しい設計なので、ブラックボックスとしてではなく、スタックの真の構成要素として機能します。
単一のAPIで、個人の本人確認(KYC、顧客確認)、企業の本人確認(KYB、企業確認)、暗号資産ウォレットのスクリーニング(KYT、取引確認)、リアルタイムの取引監視をカバーします。このスタックは以下の特徴を備えています。
基盤となるのは、48以上の言語に対応した14,000以上のドキュメントタイプ、1,000以上のデータソース、そしてすべてのセッションで200以上の不正シグナルです。Diditのインフラは、すべてのセッションから動的に学習し、日々進化しています。
「eIDAS 2」として知られる規則 (EU) 2024/1183(eIDAS規則 (EU) No 910/2014を改正)に基づき、EU加盟国はすべてEUデジタルID(EUDI)ウォレットアプリを提供する必要があります。この法律では、EUDIウォレットを、個人が個人識別データ(PID)や属性の電子証明を保存、管理、検証し、依拠当事者と共有し、適格電子署名で署名できる電子的な身元確認手段と定義しています。
ビジネスにとって重要な3つの特性は以下の通りです。
国のeIDアプリが自動的にEUDIウォレットになるわけではありません。ウォレットはEUDIの規則を満たし、第5c条に基づいて認証される必要があります。
各加盟国は、最初の実施法の施行から24ヶ月以内に少なくとも1つのEUDIウォレットを提供する必要があります。この実施法は2024年12月24日に発効したため、期限は2026年12月24日となります。
2026年10月5日時点の状況:
この日付は、eIDAS 2自体の公開からではなく、実施法の施行から算出されています。各国のアプリは異なる時期にリリースされるため、このページの準備状況表には、各国の日付と情報源が示されています。
法律または契約により、オンラインでの本人確認に強力なユーザー認証が義務付けられている場合、はい、義務となります。第5f条(2)に基づき、そのような立場にある民間依拠当事者は、ユーザーがEUDIウォレットの使用を要求した場合、遅くとも2027年12月24日(最初の実施法発効から36ヶ月後)までにこれを受け入れなければなりません。
この条項では、例として運輸、エネルギー、銀行、金融サービス、社会保障、医療、飲料水、郵便サービス、デジタルインフラ、教育、電気通信などの分野が挙げられています。これは限定的なリストではなく、認証要件が基準となるため、分野は問いません。
電子識別を必要とする公共部門のサービスもウォレットを受け入れる必要があります(第5f条(1))。ユーザー認証を必要とする非常に大規模なオンラインプラットフォームは、ユーザーの要求に応じて、必要最小限のデータを受け入れなければなりません(第5f条(3))。この義務には別途の期日は定められていません。
これは要約であり、法的助言ではありません。
はい。第5f条(2)は、委員会勧告2003/361/ECの付属書第2条で定義されている零細企業および小企業を免除しています。この勧告で定められた従業員数と売上高の基準をご確認ください。
この免除は受け入れ義務に関するものであり、受け入れの選択肢を排除するものではありません。小企業でも、例えばより迅速なサインアップや、生年月日を共有しない年齢確認を提供するためにウォレットを受け入れることができます。
ただし、企業の規模に関わらず、以下の2点は変わりません。
これは要約であり、法的助言ではありません。
依拠当事者とは、EUDIウォレットに依拠してユーザーを識別したり、属性を確認したりするあらゆる企業または公的機関を指します。第5b条(1)に基づき、依拠当事者は事業所のある加盟国で登録しなければなりません。登録には、事業者名、連絡先、意図する利用目的(要求する予定のデータを含む)を記載し、登録したデータ以外を要求することはできません(第5b条(3))。
登録に関する規則である実施規則(EU)2025/848は、2026年12月24日から適用されます。登録後、以下のものが発行されます。
依拠当事者に代わって行動する仲介者は、依拠当事者として扱われ、取引内容に関するデータを保存することはできません(第5b条(10))。例えばドイツでは、組織とユースケースごとに1つのアクセス証明書と登録証明書が発行されると説明されています。
登録した属性のみを要求でき、ユーザーが共有する内容を決定します。PIDには、姓、名、生年月日、出生地、国籍、有効期限、発行機関、発行国といった必須属性が含まれます。オプション属性には、顔写真、性別、住所欄、個人管理番号などがあり、各加盟国が発行するものを選択します。
PID以外に、ウォレットは運転免許証、卒業証書、年齢証明などの属性の電子証明を保持します。加盟国は、住所、年齢、国籍、専門資格など、真正な情報源に対して検証可能な最小限の属性リストも作成する必要があります(付属書VI)。
選択的開示により、ユーザーが承認したもののみが、発行者によって署名され、有効性を確認するために必要なメタデータとともに提供されます。要求するデータを少なくすることで、保護すべき個人データも少なくなります。
本人確認に関しては、十分な場合があります。AMLR第22条(6)(b)は、実質的または高の保証レベルでの電子識別手段による検証を認めており、EUDIウォレットは高レベルで機能します。AMLAの顧客デューデリジェンスに関する最終ドラフト基準(2026年9月30日、委員会に送付された最終ドラフトであり、法律ではありません)では、可能な限りeID手段を使用すべきであり、EUDIウォレットも含まれるとされています。
ただし、デューデリジェンスの全体をカバーするものではありません。
Diditは現在、これらの部分をカバーしています。住所証明、質問票、企業確認、AMLスクリーニング(1チェックあたり$0.20)、継続的なモニタリング(1人あたり年間$0.07)を提供しています。
3つのレイヤーがあります。
2026年7月23日にリリースされたArchitecture and Reference Framework (ARF) v3.0.0が、スタック全体を記述しています。
はい。選択的開示により、ウォレットは「18歳以上であること」のみを共有できます。オランダ政府はこれを次のように説明しています。「18歳以上であるかどうかのみを共有し、生年月日を提供する必要はありません。」
EUには、2025年7月にリリースされ、2025年10月に更新された年齢確認ブループリントもあります。これはスタンドアロンアプリまたはウォレット機能です。その年齢証明には身元データが含まれず、証明は使い捨てのためにバッチで発行され、発行者は証明がどこで使用されたかを知らされません。2026年4月、委員会は加盟国に対し、年末までにアプリを利用可能にするよう促し、デンマーク、フランス、ギリシャ、イタリア、スペインが最初に採用しました。
デジタルサービス法に基づくプラットフォームの場合、未成年者に関する委員会ガイドライン(2025年7月)は、18歳以上のコンテンツに対する年齢確認を推奨しており、顔による年齢推定を一時的な橋渡しとして扱っています。
2028年8月11日までは確実ではありません。実施規則(EU)2026/1731に基づき、顔写真が必須のPIDの一部となるのはその日付以降です。それまでは任意であり、各加盟国が含めるかどうかを決定します。顔写真の共有には、選択的開示、ユーザーへの警告、ログ記録も必要となります。
ARFは、クレデンシャルを提示している人物が正当な所有者であるかを確認するプロセスをユーザーバインディングと呼んでいます。一部のフローでは依拠当事者がこれを行い、他のフローではウォレット自体のチェックに依拠します。
したがって、現時点では、顔照合が必要なポリシーの場合、セルフィーのステップを計画してください。これは、パッシブな生体認証と、ドキュメントの写真またはNFCで読み取ったチップの顔写真との1対1の顔照合を組み合わせたものです。Diditでは、これはフルKYCチェックの一部として$0.33で提供されます。現在稼働している5つの国のeIDも、顔写真を返しません。
2026年10月5日現在、いくつかの国のアプリが稼働中またはテスト中です。
このページの準備状況表には、公開されているステータスが確認できたすべての国が、日付と情報源とともに記載されています。
まだです。DiditではEUDIウォレットの受け入れを近日中に開始します。当社のウォレットカタログには30のEEA諸国がリストされており、現在設定されているID確認ステップと同じステップで利用可能になる予定です。稼働するまでは日付や価格は公表しません。
現在利用可能な機能は以下の通りです。
現在これらの機能で構築されたワークフローは、EUDIウォレットの受け入れが開始された後も引き続き機能します。ウォレットがお客様のローンチ計画にとって重要である場合は、ぜひご相談ください。
個人にとって、ウォレットは無料です。発行、利用、失効に費用はかかりません(第5a条(13))。しかし、ビジネスにとっては状況が異なります。
Diditは、EUDIウォレットの受け入れ機能が稼働した際に、料金ページでその価格を公開します。現在、料金ページには、フルKYCチェックが$0.33、AMLスクリーニングが$0.20など、稼働中の各チェックの公開価格が掲載されています。
ウォレットが導入される前に効果的な5つのステップをご紹介します。
最終確認日: 2026年10月5日。法的助言ではありません。