無料
開発、テスト、そして最初のユーザー向け。
- 毎月500件のフルKYC認証
- 本人確認、生体認証、顔照合、デバイス&IP
- 200以上の不正検知シグナル、ブロックリスト、重複チェック
- Diditネットワーク全体でKYCを再利用可能
- ワークフロービルダー、ケース管理、SDK
- AIサポート コンソール内AIエージェント、ドキュメント、コミュニティ。
世界中の3,000以上の組織から信頼されています。
eIDサインインで得られるもの
eID(電子識別)サインインは、書類の画像ではなく、スキームが署名したデータで本人確認を行います。Diditはその署名を確認し、結果をセッションに反映します。
ワークフロービルダーで「ID Verification」ステップを開き、国を選択し、「Wallets accepted」で受け入れるeIDにチェックを入れます。次に、サインインが失敗した場合の処理(書類キャプチャへのフォールバック、または拒否)を選択します。
メソッドカタログから直接
カタログ掲載数
対応国数
eIDAS高
MitID · Danish Agency for Digital Government
少なくとも1つのウォレットがある国
国
EUDIウォレットでカバー
対応範囲は国ごとのカタログに準拠します。ここに国旗があるのは、その国でウォレットがリストされていることを意味し、稼働中であることを示すものではありません。
136 / 136 スキーム
MitID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Mobile-ID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Smart-ID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Estonian ID card and Digi-ID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Finnish Trust Network (bank IDs)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
FINeID citizen certificate (ID card)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Mobiilivarmenne
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Auðkenni (app, SIM and card)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Mobile-ID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Smart-ID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Asmens tapatybės kortelė (identity card)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Smart-ID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
eParaksts mobile
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
eID karte (identity card)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
eParaksts karte
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
BankID (Norway)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Buypass ID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Vipps
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Commfides eID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
MinID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
BankID Sweden
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Freja eID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
SverigeID
未ローンチ
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
ID Austria
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Smart-ID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
itsme
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Belgian eID card
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
MyGov.be key
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Swiss E-ID (swiyu)
未ローンチ
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
SwissID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Online-Ausweisfunktion (Personalausweis)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
d-you
未ローンチ
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
FranceConnect
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
France Identité
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
L'Identité Numérique La Poste
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
eID.li
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
itsme
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Luxembourg eID card
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
LuxTrust
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
iDIN
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
itsme
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
DigiD
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
eHerkenning (business login)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Yivi
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
GOV.UK Wallet
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
OneID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
GOV.UK One Login
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Government Digital Wallet
未ローンチ
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
MyGovID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Digital Identity (IdentiTek)
未ローンチ
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
e-Albania
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
B-Trust Mobile
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
eAuth
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Electronic identity certificate (identity card)
未ローンチ
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Evrotrust eID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Cyprus national eID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Bank iD
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
MojeID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
eDoklady
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
eObčanka (identity card)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Identita občana (NIA)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Mobilní klíč eGovernmentu
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Cartera Digital Beta
未ローンチ
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Cl@ve
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
DNIe (DNI 3.0 and 4.0)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
MiDNI
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Gov.gr Wallet
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
TAXISnet credentials
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Certilia mobile.ID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
eOI (identity card)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
NIAS (e-Građani)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
DÁP (Digitális Állampolgárság)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Ügyfélkapu+
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
CIE and CieID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
IT-Wallet
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
SPID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Carte de identitate (identity card)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
EVO
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
EVOSign
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
MPass
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Semnătura Mobilă
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Evrotrust eID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
m.Uslugi
未ローンチ
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
OneID (KIBS)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
uslugi.gov.mk eID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Maltese e-ID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
e-dowód (identity card)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
login.gov.pl
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
mObywatel
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Profil Zaufany
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Autenticação.gov
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Cartão de Cidadão
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Chave Móvel Digital
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Carte electronică de identitate
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
ROeID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
eID.gov.rs (ConsentID)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Lična karta (identity card)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
eOI and eOsebna
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
SI-PASS
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
eID karta (identity card)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
MeID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Slovensko v mobile
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
e-Devlet
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
T.C. Kimlik Kartı (identity card)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Diia
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
BankID NBU
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
UAE PASS
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Kuwait Mobile ID (Hawyti)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Absher
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Nafath
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
ConnectID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
myID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
National Online Identity Authentication
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Identitas Kependudukan Digital (IKD)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Aadhaar e-KYC
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
DigiLocker
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
My Number Card (JPKI)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Mobile ID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
RealMe verified identity
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
PhilSys (PhilID, ePhilID)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Singpass (Myinfo)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
NDID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
ThaID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Mi Argentina
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
gov.br
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Service d'authentification gouvernementale
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Llave MX
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
DNIe 3.0
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Apple Wallet Digital ID
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Google Wallet ID Pass
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
ID.me
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Login.gov
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
State mobile driver's licences (mDL)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Cédula digital wallet
未ローンチ
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
National Identification Number (NIN)
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
Smart ID card
国
Diditステータス
保証レベル
ユーザーの操作
返されるデータ
サインインあたりの価格
最終レビュー日:2026年10月5日。法的助言ではありません。保証レベルは、発行者またはEUの通知済みスキームリストが公開しているeIDAS(電子識別に関するEU規制)または国内規則に基づくスキーム独自のレベルです。料金はサインイン完了ごとにかかります。「要問い合わせ」と表示されているスキームについては、お問い合わせください。その国ではチップ読み取りによるドキュメントルートがすでに機能しています。
01
選択画面には、ユーザーの国で利用可能なeIDが公式マークとともに表示されます。
02
ユーザーはコードが一致することを確認し、eIDアプリでPINを入力して承認します。DiditがPINを見ることはありません。
03
フローはユーザーを元の画面に戻し、署名された結果はWebhookで届きます。
{
"workflow_label": "eID onboarding",
"features": [
{
"feature": "OCR",
"config": {
"methods": {
"DNK": {
"document": { "enabled": true },
"wallet": { "enabled": true, "providers": ["mitid"], "on_failure": "fallback_to_document" }
},
"SWE": {
"document": { "enabled": true },
"wallet": { "enabled": true, "providers": ["bankid_se"], "on_failure": "fallback_to_document" }
}
}
}
}
]
}{ "uuid": "…" }{
"node_id": "ocr",
"status": "Approved",
"verification_method": "wallet",
"assurance": "cryptographic",
"wallet_provider": "mitid",
"wallet_verification": {
"provider": "mitid",
"issuing_country": "DNK",
"level_of_assurance": "substantial",
"signature_valid": true,
"attributes": {
"full_name": "Freja Nielsen",
"date_of_birth": "1988-03-02",
"cpr_alias": "b0f1c2d3-e4f5-4678-9abc-def012345678"
},
"portrait": null
}
}id_verifications[0]# Didit eID verification, integrate in 5 minutes
You are adding national eID sign-in to my_stack: the user verifies with the
eID they already use (a bank or government digital identity), and anyone
without one falls back to document capture in the same flow. Every URL,
header and enum value below is canonical. Do not paraphrase or "improve" them.
## 1. Provision an account
- Sign up: https://business.didit.me
- Create an application and copy its API key from the console.
## 2. Check which eIDs are live, per country
Availability is server-driven. Never hard-code a wallet list.
- 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").
At the time this prompt was generated, the catalog marked these available:
- MitID: wallet id mitid, country keys DNK
- BankID: wallet id bankid_se, country keys SWE
- Finnish Trust Network: wallet id ftn, country keys FIN
- Smart-ID: wallet id smart_id, country keys EST, LVA, LTU, BEL
- Mobile-ID: wallet id mobile_id, country keys EST, LTU
Coming soon (cannot be enabled yet): BankID, Vipps, Buypass ID, itsme, iDIN, Personalausweis, Freja eID, UAE PASS, gov.br, OneID, GOV.UK Wallet, Bank iD, MojeID, Diia, FranceConnect, Auðkenni, ConnectID, EUDI Wallet, Estonian ID-card, eParaksts.
Check the catalog for your environment before you go live.
## 3. Create the workflow
POST https://verification.didit.me/v3/workflows/
-H "x-api-key: <your-api-key>"
-H "Content-Type: application/json"
The ID Verification feature's enum value is OCR (uppercase, strict). eIDs are
its wallet method, set per country under config.methods. Keys are ISO 3166-1
alpha-3. Keep document capture on, so a user without an eID can still finish.
{
"workflow_label": "eID onboarding",
"features": [
{
"feature": "OCR",
"config": {
"methods": {
"DNK": {
"document": { "enabled": true },
"wallet": { "enabled": true, "providers": ["mitid"], "on_failure": "fallback_to_document" }
},
"SWE": {
"document": { "enabled": true },
"wallet": { "enabled": true, "providers": ["bankid_se"], "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:
- providers is an accept-list, not a ranking; the user picks
- on_failure is fallback_to_document or decline; it covers a cancelled,
timed-out or failed sign-in
- fallback_to_document where document.enabled is false declines instead
- a wallet the catalog does not mark available in that country rejects the
whole save (400), including every other method in the same request
- enabled true with an empty providers list is rejected
- add { "feature": "LIVENESS" } and { "feature": "FACE_MATCH" } to features
if you need a selfie: the live eIDs do not share a portrait
## 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.
The user picks their eID, then approves in the eID app: same-device hand-off
or a QR code on desktop for MitID, BankID and Finnish Trust Network; a
comparison code approved on the phone for Smart-ID and Mobile-ID. Didit never
asks for the user's PIN. A started sign-in stays valid for 10 minutes by
default.
## 5. Webhooks
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).
Use the reference handler below as written: it rebuilds those
bytes from the raw body text. Never hash the raw request bytes.
Freshness: the signed body field timestamp is the dispatch time (Unix
seconds, refreshed on every retry). 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 eID 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 (its node_id is "ocr" on a workflow made by the call in step 3).
The decision's features list names the step ID_VERIFICATION; the workflow
body still takes OCR. Each entry carries:
status Approved, Declined, In Review or Not Finished
verification_method "wallet" for an eID sign-in, "document" after a
fallback
assurance "cryptographic" for a wallet entry, "documentary"
for a document one
full_name, the normalised identity fields, on the entry itself
date_of_birth
wallet_provider the catalog wallet id, for example "mitid"
wallet_verification provider, provider_name, issuing_authority,
issuing_country, credential_type,
level_of_assurance (low | substantial | high),
verified_at, signature_valid, attributes, portrait,
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
attributes holds what the scheme shares, and the names vary by scheme: MitID
returns cpr_alias (a pseudonymised identifier, not the CPR number), BankID
Sweden personal_number, Finnish Trust Network personal_identity_code, Smart-ID
and Mobile-ID personal_code. Use full_name and date_of_birth on the entry for
the normalised identity fields. No live eID returns an address or a portrait.
Check wallet_verification.level_of_assurance when your rules depend on it. If
a scheme returns a weaker level than the one requested, the sign-in fails
instead of downgrading.
## 7. Billing
- only a completed eID sign-in is billed; cancelled, timed-out, refused
and failed sign-ins are free
- a document fallback is billed as its own document check
- eID checks are outside the document free tier
- published prices per completed sign-in (USD):
- MitID personal: $0.25
- BankID Sweden: $0.20
- Finnish Trust Network: $0.25
- Smart-ID: $0.20
- Mobile-ID: $0.20
- full pricing: https://docs.didit.me/core-technology/id-verification/digital-id-wallets#pricing
## 8. Hard rules
- base URL for v3 endpoints: verification.didit.me
- auth header: x-api-key
- feature enum: OCR; methods: document, id_lookup, wallet
- wallet ids come from the catalog verbatim (mitid, bankid_se, ftn,
smart_id, mobile_id)
- country keys: ISO 3166-1 alpha-3, uppercase
- webhook: X-Signature-V2 plus X-Timestamp, canonical JSON, freshness from
the signed body timestamp
## 9. 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 eID through the hosted flow and
assert verification_method is "wallet" and wallet_provider is the eID you
picked
- run one session with sandbox_scenario "wallet_cancelled" and assert the
flow offers document capture
- assert your 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のインフラは、すべてのセッションから動的に学習し、日々進化しています。
eID認証(電子本人確認)とは、政府や銀行が発行または承認した既存のデジタルIDを通じて本人確認を行う方法です。書類の写真を要求する代わりに、利用者は自身の国民eIDでサインインし、eIDアプリでデータ共有を承認します。すると、そのスキームからデジタル署名付きの本人属性情報が返されます。
企業にとっての違いは、受け取る情報です。書類チェックでは分析が必要な画像が提供されますが、eIDサインインでは、発行元がすでに検証・署名済みのデータが提供されます。氏名、生年月日、スキーム固有の識別子(例:スウェーデンのpersonnummer。MitIDは仮名化された識別子を返します)、保証レベルです。
Diditは、ワークフローのID認証ステップ内でeIDサインインを実行します。現在、5つの国民eID(MitID、BankID Sweden、Finnish Trust Network、Smart-ID、Mobile-ID)が稼働しており、これらを持たない利用者は同じセッション内で書類チェックに進みます。このページの対応表には、国ごとの各スキームが記載されています。
現在、7カ国で5つの国民eIDが本番稼働中です。
今後、さらに多くのeIDが近日対応予定です:iDIN、ドイツのeIDカード(Personalausweis)、Freja eID、エストニアのIDカード、eParaksts、BankID Norway、Vipps、Buypass、itsme、OneID、ConnectID、UAE PASS、gov.br、GOV.UK Wallet、Bank iD、MojeID、Diia、FranceConnect、Auðkenni、そしてEUDI Walletへの対応も予定しています。近日対応予定のeIDはコンソールで確認できますが、稼働開始までは有効にできません。
対応表に記載されているその他のスキームについては、お問い合わせください。Diditはご要望に応じてスキームを追加しており、これらの国ではチップ読み取りによる書類認証ルートがすでに機能しています。
スキームが署名した属性が、セッションに正規化されて提供されます。現在稼働中のすべてのeIDは、氏名と生年月日に加え、スキーム独自の識別子を返します。
各結果には、スキームが主張した保証レベルと、署名済みアサーションに対するDiditのチェック結果であるsignature_validも記録されます。現在稼働中のeIDは住所や顔写真を提供しないため、セルフィーが必要な場合はライブネスと顔照合のステップを、住所が必要な場合は別の情報源を追加してください。
APIでは、結果は決定のID認証エントリにあるwallet_verification内に格納され、verification_methodはwalletに設定されます。
保証レベル(LoA)とは、eIDがその人物が主張する本人であるという信頼度を示すものです。EUの電子本人確認に関するeIDAS規則では、低、実質的、高の3つのレベルが定義されています。各スキームのレベルは、EUの通知済みスキームリストまたはスキーム自身の規則に基づいており、多くの国内スキームはEUに通知されていません。
どのレベルが必要かは、Diditではなくお客様が従うべき規則によって異なります。例えば、AMLR(EUのマネーロンダリング対策規則)では、顧客確認において実質的または高レベルの電子本人確認を認めています。
Diditは、各サインインで実際に主張されたレベルをwallet_verification.level_of_assuranceに記録します。スキームが要求されたレベルよりも低いレベルを返した場合、サイレントにダウングレードするのではなく、サインインは失敗します。Diditは、MitID、BankID Sweden、Finnish Trust Networkのサインインを「実質的」、Smart-IDおよびMobile-IDのサインインを「高」と分類しています。
本人確認の部分については、十分な場合があります。AMLR(規則(EU) 2024/1624、2027年7月10日施行)の第22条(6)では、義務対象事業者が顧客の本人確認を身分証明書またはeIDASに基づく電子本人確認で行うことを許可しています。AMLA(EUマネーロンダリング対策機関)による顧客デューデリジェンスに関する最終ドラフト基準(2026年9月30日付)では、eIDをデフォルトのリモートルートとし、書類ベースのリモート認証を正当な代替手段として扱っています。これらは委員会に送付された最終ドラフトであり、法律ではありません。
本人確認はKYC(顧客確認)の一部です。制裁対象者やPEPスクリーニング、企業の受益者、継続的なモニタリングと記録、そして最終的な判断はお客様に委ねられます。Diditはこれらのチェックを同じワークフローで実行し、AMLスクリーニングは1チェックあたり$0.20、継続的なモニタリングは1人あたり年間$0.07で提供します。
これは法的助言ではありません。AMLRのページでは、各条項とDiditが提供する機能との対応関係を示しています。
同じセッション内で書類チェックに進みます。各国ごとに、eIDサインインがキャンセルされたり、タイムアウトしたり、失敗した場合の動作を選択できます。書類キャプチャにフォールバックするか、拒否するかです。
書類ルートは、220以上の国と地域で14,000種類以上の書類タイプに対応しています。IDをキャプチャし、ネイティブSDKでeパスポートやeIDカードのチップ(NFC)を読み取り、パッシブライブネスを実行し、顔を書類の顔写真と照合します。書類、ライブネス、顔照合、デバイスおよびIP分析を含む完全なKYCチェックは$0.33です。
フォールバックはワークフローの一部であるため、お客様の連携は変更されません。1つのセッションを作成するだけで、結果から利用者がどのルートを選択したか(verification_methodがwalletまたはdocument)がわかります。完了したeIDサインインのみがeIDチェックとして課金され、フォールバックは独自の書類チェックとして課金されます。
はい、可能です。eIDサインインはスキームによって署名された生年月日を返すため、書類の写真を要求することなく年齢を証明できます。
大量の処理を行う場合、推奨される設計はまず年齢推定を行うことです。セルフィーによる年齢推定は1チェックあたり$0.10で、パッシブライブネスが含まれ、全体で平均絶対誤差3.5年、18歳未満では1.5年です。明確な合格と不合格はそこで終了し、境界線上の結果のみがより強力なチェック(eIDサインインまたは書類チェック)に進みます。
規制当局はこれらの方法を異なる方法で扱います。英国では、Ofcomが顔による年齢推定とデジタルIDの両方を非常に効果的な方法として挙げています。EUでは、デジタルサービス法(DSA)のガイドラインが、18歳以上のコンテンツに対する推定を一時的な橋渡しとみなし、EU年齢認証アプリまたはEUDI Walletを推奨しています。年齢認証のページでは、国ごとの規則を説明しています。
eIDサインインは、スキームごと、完了したサインインごとに課金されます。このページの対応表には、各稼働中のeIDの現在の公開価格が記載されており、料金ページと同じ価格データから読み込まれています。「要問い合わせ」とマークされたスキームは個別に見積もりされます。
料金が発生するのは、サインインが完了した場合のみです。キャンセル、タイムアウト、拒否、失敗したサインインは無料であり、繰り返しのコールバックやステータスチェックで追加料金が発生することはありません。eIDチェックは無料の書類ティアには含まれません。
ワークフローの残りの部分は、公開価格でチェックごとに課金されます。書類による完全なKYCチェックは$0.33、NFCチップ読み取りは$0.15、年齢推定は$0.10、AMLスクリーニングは$0.20、継続的なモニタリングは1人あたり年間$0.07です。書類フォールバックは独自の書類チェックとして課金されます。アカウントを作成し、サンドボックスでテストしてから、本番環境に移行できます。
いいえ、現在稼働中のスキームについては必要ありません。DiditがMitID、BankID Sweden、Finnish Trust Network、Smart-ID、Mobile-IDのスキーム接続を保持しているため、これらのスキームを受け入れるために各スキーム、銀行、証明書プロバイダーと個別の契約を結ぶ必要はありません。ワークフローでeIDを有効にし、完了したサインインごとにDiditに支払うだけです。
選択画面や比較コード画面は、お客様のセッションブランディングとカスタムドメインを継承するため、ユーザーは常にお客様のフロー内に留まります。スキームは独自のアプリと同意ステップを表示しますが、これはユーザーがデータ共有を承認する場所だからです。
一部のスキームには、受け入れ可能な事業者に関する独自の規則があります。一部の政府ログインは公共サービスのみに開放されています。まだ稼働していないスキームについては、必要な要件とDiditがどのように接続できるかについてお問い合わせください。
どちらも暗号技術に依存していますが、証明する内容は異なります。NFCチップ読み取りは、スマートフォンを使ってeパスポートやeIDカード内のチップを読み取り、そのデータに対する発行者の署名をチェックすることで、書類が真正で改ざんされていないことを示します。ただし、その書類を持っている人が所有者であることを示すためには、ライブネスと顔照合が依然として必要です。Diditでは、ネイティブのiOSおよびAndroid SDKで$0.15で実行されます。
eIDサインインは、その人物が自身の国民デジタルIDを管理していることを示します。利用者はeIDアプリでPINまたは生体認証で承認し、スキームがその属性に署名します。書類は関与せず、現在稼働中のeIDは顔写真を共有しません。
この2つはうまく連携します。eIDが稼働している場所ではeIDを提供し、それ以外のすべての人には国ごとに同じワークフローでチップ読み取りを含む書類キャプチャにフォールバックさせることができます。
EUDIウォレット(EUデジタルIDウォレット)は、eIDAS 2(規則 (EU) 2024/1183)に基づき、EU加盟各国が2026年12月24日までに提供を義務付けられているウォレットです。強力なユーザー認証の使用を法的または契約上義務付けられている民間企業は、2027年12月24日までにユーザーの要求に応じてこれを受け入れる必要があります。ただし、零細企業および小企業は免除されます。この期限は、最初の実施法が2024年12月24日に発効してから36ヶ月後、すなわち2027年12月24日です。
イタリアのIT-WalletとデンマークのAltIDは、最も開発が進んでいる国のアプリであり、ドイツのウォレットアプリは2027年初頭にリリース予定です。
DiditではEUDIウォレットへの対応を近日中に開始します。当社のウォレットカタログには、30のEEA諸国向けに、各国のeIDと同じワークフローでEUDIウォレットが掲載されます。それまでは、既存の各国eIDと書類による認証で顧客対応が可能です。EUDIウォレットのページでは、企業がこれを受け入れるために必要なことについて説明しています。
はい、可能です。Diditはご要望に応じてスキームを追加しますので、お客様の顧客がどの国民eID、銀行ID、または政府ログインをどの国で利用しているかをお知らせください。私たちは、そのスキームが受け入れ企業に何を要求するか(民間企業に開放されているもの、公共サービスのみのもの)、そして何が返されるかを調査し、接続に必要なものをご連絡いたします。
それまでの間も、その国でサービスを開始することを妨げるものはありません。書類ルートは現在、その国で機能しています。14,000種類以上の書類タイプに対応した書類キャプチャ、eパスポートやeIDカードのチップ(NFC)読み取り、パッシブライブネスと顔照合、さらに1,300以上のリストに対するAMLスクリーニングが利用可能です。
スキームが稼働開始したら、その国のワークフローでチェックを入れるだけで、お客様の連携は変わりません。開始するには「お問い合わせ」をご利用ください。
即日テストを開始できます。business.didit.meでアカウントを作成し、ワークフローを開き、ID認証ステップで国を選択し、ウォレット対応の下にあるeIDにチェックを入れます。フォールバックを設定し、保存して公開します。
最も速い方法はホスト型フローです。1回のAPIコール(POST /v3/session/)でセッションを作成し、返されたURLにユーザーをリダイレクトします。DiditがeID選択画面を表示し、eIDアプリに引き渡し、署名された結果をWebhookに送信します。ユーザーをアプリ内に留めたい場合は、Web、iOS、Android、React Native、FlutterのSDKが同じフローを開きます。
まずサンドボックスアプリケーションでテストし、その後ライブアプリケーションに切り替えてください。このページの連携プロンプトでは、コーディングエージェントがフロー全体を構築できます。