Setiap Negara Anggota Uni Eropa wajib menyediakan EU Digital Identity (EUDI) Wallet paling lambat 24 Desember 2026, dan bisnis yang teregulasi wajib menerimanya paling lambat 24 Desember 2027. Didit saat ini sudah mendukung lima eID nasional, dan penerimaan EUDI Wallet akan segera hadir dalam alur kerja yang sama.
Dipercaya oleh 3.000+ organisasi di seluruh dunia.
EUDI WalletAtestasi ID dan usia
Toko online memintaUsia di atas 18
Nama keluarga
Nama depan
Tanggal lahir
Tempat lahir
Kewarganegaraan
Usia di atas 18
Bagikan 1 atribut
Pihak pengandalToko online
age_over_18true
Tanda tangan penerbit
Pengikatan perangkat
5 atribut ditahan
Apa itu EUDI Wallet
Satu wallet per orang. Hanya data yang Anda minta.
EUDI Wallet adalah aplikasi gratis yang wajib disediakan oleh setiap Negara Anggota Uni Eropa berdasarkan Peraturan (EU) 2024/1183, yang dikenal sebagai eIDAS 2. Aplikasi ini menyimpan data identifikasi pribadi (PID), yaitu nama, tanggal dan tempat lahir, serta kebangsaan, ditambah pengesahan elektronik atribut seperti SIM atau ijazah. Penggunaannya bersifat sukarela.
Ketika sebuah bisnis meminta data, orang tersebut akan melihat siapa yang meminta dan hanya membagikan atribut yang diminta. Ini disebut selective disclosure: sebuah situs dapat mengetahui bahwa seseorang berusia di atas 18 tahun tanpa melihat tanggal lahir. Wallet ini beroperasi pada tingkat jaminan tinggi, yang terkuat dari tiga tingkat eIDAS, dan bisnis memeriksa tanda tangan penerbit sebelum mengandalkan data tersebut.
Terakhir ditinjau: 5 Oktober 2026. Bukan nasihat hukum.
Tanggal-tanggal penting
Wallet tersedia akhir 2026. Wajib diterima paling lambat 24 Desember 2027.
Ini adalah tanggal-tanggal dalam Peraturan (EU) 2024/1183 dan tindakan pelaksanaannya yang harus menjadi acuan perencanaan bisnis.
30 April 2024
eIDAS 2 diterbitkan
Peraturan (EU) 2024/1183, yang mengubah Peraturan eIDAS (EU) No 910/2014, muncul dalam Jurnal Resmi Uni Eropa. Peraturan ini mulai berlaku pada hari kedua puluh setelah publikasi.
24 Desember 2024
Aturan wallet pertama berlaku
Lima peraturan pelaksanaan pertama untuk wallet mulai berlaku: data identifikasi pribadi, fungsi inti, notifikasi, sertifikasi, serta protokol dan antarmuka. Ini memulai hitungan mundur 24 bulan dan 36 bulan di bawah ini.
15 Juli 2026
Aturan wallet diperbarui
Komisi mengadopsi Peraturan Pelaksanaan (EU) 2026/1731. Ini menetapkan dua format kredensial, SD-JWT VC dan ISO/IEC mdoc, serta menjadwalkan potret wajib untuk tahun 2028.
23 Juli 2026
ARF v3.0.0
Architecture and Reference Framework (ARF), cetak biru teknis yang menjadi dasar pembangunan wallet dan pihak pengandal, mencapai versi 3.0.0.
24 Desember 2026
Wallet di setiap Negara Anggota
Setiap Negara Anggota wajib menyediakan setidaknya satu EUDI Wallet. Aturan untuk pendaftaran pihak pengandal, Peraturan Pelaksanaan (EU) 2025/848, berlaku mulai hari yang sama.
24 Desember 2027
Bisnis swasta wajib menerimanya
Bisnis swasta yang wajib menggunakan autentikasi pengguna yang kuat berdasarkan hukum atau kontrak, selain usaha mikro dan kecil, wajib menerima wallet ketika pengguna meminta untuk menggunakannya (Pasal 5f(2)). Batas waktu itu adalah 36 bulan setelah tindakan implementasi pertama mulai berlaku pada 24 Desember 2024, yaitu paling lambat 24 Desember 2027.
11 Agustus 2028
Pemeriksaan potret dan pendaftaran
Potret menjadi bagian dari data identifikasi pribadi wajib, dan wallet harus mengautentikasi serta memvalidasi sertifikat pendaftaran setiap pihak pengandal.
Siapa yang wajib menerimanya
Siapa yang harus menerima wallet, dan kapan.
Pasal 5f Peraturan eIDAS, sebagaimana diubah oleh Peraturan (EU) 2024/1183, menetapkan kewajiban penerimaan. Dalam setiap kasus, pengguna memilih untuk menggunakan wallet, dan Anda tetap mempertahankan cara lain untuk mengidentifikasi orang.
Siapa
Artinya, dalam bahasa sederhana
Pasal ยท tanggal
Siapa
Lembaga sektor publik
Artinya, dalam bahasa sederhana
Jika suatu Negara Anggota mewajibkan identifikasi elektronik untuk mengakses layanan online publik, layanan tersebut juga harus menerima EUDI Wallet.
Pasal ยท tanggal
Pasal 5f(1)
Siapa
Layanan privat yang harus menggunakan autentikasi pengguna yang kuat
Artinya, dalam bahasa sederhana
Jika undang-undang atau kontrak mewajibkan Anda menggunakan autentikasi pengguna yang kuat untuk identifikasi online, Anda juga harus menerima EUDI Wallet. Pemicunya adalah persyaratan tersebut, bukan sektor Anda.
Pasal ยท tanggal
Pasal 5f(2) ยท 24 Des 2027
Siapa
Area yang disebutkan dalam pasal
Artinya, dalam bahasa sederhana
Transportasi, energi, perbankan, layanan keuangan, jaminan sosial, kesehatan, air minum, layanan pos, infrastruktur digital, pendidikan, dan telekomunikasi. Pasal tersebut menyatakan โtermasukโ, jadi daftar ini adalah contoh dan tidak bersifat tertutup.
Pasal ยท tanggal
Pasal 5f(2)
Siapa
Usaha mikro dan kecil
Artinya, dalam bahasa sederhana
Dikecualikan dari kewajiban sektor privat, sebagaimana didefinisikan dalam Rekomendasi Komisi 2003/361/EC. Mereka tetap dapat menerima wallet jika memilih demikian.
Pasal ยท tanggal
Pasal 5f(2)
Siapa
Hanya atas permintaan pengguna
Artinya, dalam bahasa sederhana
Penerimaan wajib dilakukan ketika pengguna meminta untuk menggunakan wallet. Penggunaannya bersifat sukarela bagi individu, dan layanan harus tetap terbuka untuk sarana identifikasi dan autentikasi lainnya.
Pasal ยท tanggal
Pasal 5f(2), 5a(15)
Siapa
Platform online yang sangat besar
Artinya, dalam bahasa sederhana
Platform yang ditetapkan berdasarkan Digital Services Act yang memerlukan autentikasi pengguna harus menerima wallet atas permintaan pengguna, untuk data minimum yang dibutuhkan layanan. Teks ini tidak menetapkan tanggal terpisah untuk kewajiban ini.
Pasal ยท tanggal
Pasal 5f(3)
Pihak pengandal juga harus mendaftar di Negara Anggota tempat mereka didirikan, dan hanya dapat meminta data yang mereka daftarkan (Pasal 5b). Terakhir ditinjau: 5 Oktober 2026. Bukan nasihat hukum.
Bagaimana bisnis menerimanya
Bagaimana pihak pengandal menerima EUDI Wallet, dalam lima langkah.
Langkah 01 / 05
01
Daftar sebagai pihak pengandal
Daftar di Negara Anggota tempat Anda didirikan, dengan detail Anda dan data yang ingin Anda minta. Anda akan menerima sertifikat akses, yang mengautentikasi Anda ke wallet, dan, jika Negara Anggota Anda mengeluarkannya, sertifikat pendaftaran yang mencantumkan atribut yang Anda daftarkan.
Minta hanya yang Anda butuhkan
Minta atribut spesifik, misalnya usia di atas 18 tahun, dengan OpenID for Verifiable Presentations (OpenID4VP) dan kueri Digital Credentials Query Language (DCQL), atau dengan ISO/IEC 18013-7. Anda tidak boleh meminta data di luar pendaftaran Anda.
Pengguna menyetujui di wallet
Di ponsel yang sama, browser menyerahkan ke aplikasi wallet. Di komputer, pengguna memindai kode QR. Wallet menunjukkan siapa yang meminta, memeriksa bahwa Anda tidak meminta lebih dari yang Anda daftarkan, dan pengguna menyetujui atau menolak.
Verifikasi presentasi
Periksa tanda tangan penerbit terhadap daftar tepercaya, periksa bahwa kredensial belum dicabut, dan periksa pengikatan perangkat, yang menunjukkan kredensial tidak disalin atau diputar ulang.
Terima atribut dan putuskan
Anda hanya menerima atribut yang dibagikan pengguna, yang ditandatangani oleh penerbit. Keputusan onboarding atau akses, dan catatan yang Anda simpan, tetap ada pada Anda.
Didit akan menjalankan langkah-langkah ini untuk Anda saat penerimaan EUDI Wallet diluncurkan (segera hadir).
Apa yang Anda terima vs apa yang masih dibutuhkan KYC
Berdasarkan Peraturan Anti-Pencucian Uang (AMLR), Peraturan (EU) 2024/1624, identifikasi elektronik pada tingkat jaminan substansial atau tinggi adalah salah satu dari dua cara untuk memverifikasi identitas (Pasal 22(6)). Ini tidak mencakup semua yang diminta oleh pemeriksaan know your customer (KYC). Berikut adalah apa yang terkandung dalam data identifikasi pribadi (PID), dan bagaimana Didit mencakup setiap item saat ini.
Kebutuhan uji tuntas
Dalam EUDI Wallet PID
Bagaimana Didit mencakupnya hari ini
Kebutuhan uji tuntas
Nama lengkap dan nama keluarga
AMLR Pasal 22(1)(a)
Dalam EUDI Wallet PID
Nama keluarga dan nama depan, keduanya wajib diisi.
Bagaimana Didit mencakupnya hari ini
eID nasional yang aktif mengembalikan nama lengkap. Jalur dokumen membacanya dari 14.000+ jenis dokumen.
Kebutuhan uji tuntas
Tempat dan tanggal lahir lengkap
AMLR Pasal 22(1)(a)
Dalam EUDI Wallet PID
Tanggal lahir dan tempat lahir, keduanya wajib diisi.
Bagaimana Didit mencakupnya hari ini
eID nasional yang aktif mengembalikan tanggal lahir. Jalur dokumen membaca tempat lahir jika tercetak di dokumen.
Kebutuhan uji tuntas
Kewarganegaraan
AMLR Pasal 22(1)(a)
Dalam EUDI Wallet PID
Kewarganegaraan, wajib diisi, satu atau lebih negara.
Bagaimana Didit mencakupnya hari ini
Jalur dokumen membaca kewarganegaraan dari dokumen identitas atau chip-nya.
Kebutuhan uji tuntas
Nomor identifikasi nasional, jika berlaku
AMLR Pasal 22(1)(a)
Dalam EUDI Wallet PID
Nomor administrasi pribadi, opsional. Setiap Negara Anggota memutuskan apakah akan menerbitkannya.
Bagaimana Didit mencakupnya hari ini
eID nasional yang aktif mengembalikan pengenal skema: personnummer Swedia, kode identitas pribadi Finlandia, atau kode pribadi Baltik. MitID mengembalikan identifikasi yang disamarkan, bukan nomor CPR.
Kebutuhan uji tuntas
Tempat tinggal biasa
AMLR Pasal 22(1)(a)
Dalam EUDI Wallet PID
Kolom alamat bersifat opsional dan seringkali kosong. Standar draf akhir AMLA menyatakan atribut yang hilang harus diperoleh melalui cara lain.
Bagaimana Didit mencakupnya hari ini
Tidak ada eID nasional yang aktif mengembalikan alamat. Verifikasi Alamat memeriksa tagihan utilitas, rekening koran, atau surat pemerintah.
Kebutuhan uji tuntas
Nomor identifikasi pajak, jika tersedia
AMLR Pasal 22(1)(a)
Dalam EUDI Wallet PID
Bukan bagian dari PID.
Bagaimana Didit mencakupnya hari ini
Kumpulkan dengan langkah kuesioner dalam alur kerja yang sama.
Kebutuhan uji tuntas
Orang tersebut cocok dengan identitas
ARF ยท user binding
Dalam EUDI Wallet PID
Potret tetap opsional hingga menjadi wajib pada 11 Agustus 2028.
Bagaimana Didit mencakupnya hari ini
Liveness pasif dan pencocokan wajah 1:1 terhadap foto dokumen atau potret chip, dalam pemeriksaan KYC lengkap seharga $0.33.
Kebutuhan uji tuntas
Pemilik manfaat suatu perusahaan
AMLR Pasal 20(1)(b)
Dalam EUDI Wallet PID
Tidak ada di PID. Wallet mengidentifikasi seseorang, bukan siapa pemilik perusahaan.
Bagaimana Didit mencakupnya hari ini
Verifikasi Bisnis menarik data registri dan pemilik jika registri menyimpannya, dengan pemeriksaan identitas untuk setiap pemilik.
Kebutuhan uji tuntas
Sanksi dan individu yang terekspos secara politik (PEP)
AMLR Pasal 20(1)(d), (g)
Dalam EUDI Wallet PID
Tidak ada di PID.
Bagaimana Didit mencakupnya hari ini
Penyaringan AML terhadap 1.300+ sanksi, PEP, dan daftar pantauan, seharga $0.20 per pemeriksaan.
Kebutuhan uji tuntas
Tujuan hubungan dan pemantauan berkelanjutan
AMLR Pasal 25, 26
Dalam EUDI Wallet PID
Tidak ada di PID.
Bagaimana Didit mencakupnya hari ini
Kuesioner mencatat tujuan hubungan. Pemantauan berkelanjutan memeriksa ulang pelanggan setiap hari seharga $0.07 per orang per tahun.
Urusan uji tuntas pelanggan tetap jadi kewajiban Anda. Didit menyediakan pemeriksaan dan bukti, tapi tidak membuat Anda patuh sepenuhnya. AMLR berlaku mulai 10 Juli 2027, dan standar teknis AMLA adalah draf final tertanggal 30 September 2026, bukan hukum.
Kesiapan per negara
Posisi dompet digital nasional, terbaru dan bersumber.
Inilah yang telah dipublikasikan setiap negara, atau yang dilaporkan oleh sumber yang disebutkan namanya, dengan tanggal dan tautan untuk setiap baris.
Status per 5 Oktober 2026
Negara
Dompet atau aplikasi
Status
Tanggal
Yang diketahui
Negara
Italia
Dompet atau aplikasi
IT-Wallet (app IO)
Status
Aplikasi aktif
Tanggal
17 Februari 2026
Yang diketahui
Aktif di aplikasi IO, dengan 10,1 juta aktivasi dan 17,3 juta dokumen dimuat per 17 Februari 2026. Gratis dan opsional untuk dewasa, yang masuk dengan CIE atau SPID.
AltID sudah tersedia dengan kartu identitas digital dan bukti usia, dan 281.390 orang telah membuatnya hingga 4 Agustus 2026. Badan Pemerintah Digital sedang mengimplementasikan dompet ini secara bertahap.
Sandbox publik sejak Desember 2025. Aplikasi ini dijadwalkan rilis awal 2027, dimulai dengan fungsi ID. Undang-undang pelaksanaannya telah dibacakan pertama kali di Bundestag pada 23 September 2026.
Tidak tercantum: Austria, Belgia, Estonia, Hungaria, Latvia, Lituania, Luksemburg, Malta, Portugal, Slovenia. Kami tidak menemukan status publik untuk mereka pada tanggal ini. Kami akan memperbarui tabel ini seiring peluncuran aplikasi nasional.
Bagaimana Didit membantu Anda ยท Lima baris
Terima eID nasional sekarang. Tambahkan EUDI Wallet selanjutnya.
EUDI Wallet menambahkan rute baru, bukan menggantikan yang lain. Cukup bangun alur kerja sekali: eID dan dokumen nasional saat ini, serta penerimaan EUDI Wallet dalam langkah Verifikasi ID yang sama saat diluncurkan.
Terima eID nasional yang sudah digunakan pelanggan Anda.
Lima eID nasional sudah aktif di Didit di tujuh negara: MitID, BankID Swedia, Finnish Trust Network, Smart-ID, dan Mobile-ID. Pengguna masuk dengan eID mereka, dan sesi menerima atribut yang ditandatangani: nama lengkap, tanggal lahir, pengenal skema (misalnya personnummer Swedia; MitID mengembalikan pengenal yang dipseudonimkan), dan tingkat jaminan yang ditegaskan oleh skema tersebut. Hanya proses masuk yang selesai yang akan ditagih.
Tingkat seperti yang dilabeli Didit. Tidak ada alamat atau foto yang dikembalikan.
02 ยท EUDI Wallet, segera hadir
Penerimaan EUDI Wallet, dalam alur kerja yang sama.
Penerimaan EUDI Wallet akan segera hadir. Katalog wallet kami mencantumkannya untuk 30 negara EEA, dalam langkah Verifikasi ID yang sama dengan eID nasional. Belum ada tanggal atau harga yang ditetapkan.
Belum ada tanggal atau harga untuk penerimaan EUDI Wallet.
03 ยท Rute dokumen
Rute dokumen untuk semua orang tanpa wallet.
Tidak semua orang akan memiliki atau menggunakan wallet, dan hukum tetap membuka cara lain. Rute dokumen membaca chip di paspor dan kartu ID melalui NFC ($0.15), menjalankan liveness pasif, dan mencocokkan wajah dengan foto dokumen, di lebih dari 14.000 jenis dokumen di 220+ negara dan wilayah.
EUDI Wallet dapat membuktikan bahwa seseorang berusia di atas 18 tahun tanpa tanggal lahir. Sampai wallet umum digunakan, estimasi usia dari selfie dikenakan biaya $0.10 per pemeriksaan dan mengirimkan hasil yang meragukan ke fallback verifikasi ID. Proses masuk eID langsung juga mengembalikan tanggal lahir yang ditandatangani tanpa foto dokumen.
Penyaringan, pemantauan, dan perusahaan, di satu tempat.
Identitas adalah salah satu bagian dari uji tuntas pelanggan. Dalam alur kerja yang sama, saring orang terhadap 1.300+ sanksi, PEP, dan daftar pantauan ($0.20 per pemeriksaan), saring ulang mereka setiap hari dengan pemantauan berkelanjutan ($0.07 per orang per tahun), dan verifikasi perusahaan serta pemiliknya.
Nordwind Handel GmbHPerusahaan ยท pemilik dalam cakupan
0 / 1,327 listsBersihDikirim untuk ditinjau
K. Brandt ยท 60%A. Lindqvist ยท 40%
OFAC SDNSanctions
EU Consolidated SanctionsSanctions
UN Security CouncilSanctions
UK HM TreasurySanctions
PEP ยท Level 1 ยท Heads of statePEP
PEP ยท Level 2 ยท ParliamentPEP
PEP ยท Level 3 ยท Civil servicePEP
PEP ยท Level 4 ยท RCAPEP
Adverse media ยท Financial crimeMedia
Adverse media ยท FraudMedia
Adverse media ยท NarcoticsMedia
Regulatory enforcementWarnings
Fitness & probityWarnings
Interpol noticesCriminal
Special interest ยท SIPWarnings
Special interest ยท SIEWarnings
InsolvencyWarnings
G20 national listsSanctions
Custom watchlistsCustom
OFAC SDNSanctions
EU Consolidated SanctionsSanctions
UN Security CouncilSanctions
UK HM TreasurySanctions
PEP ยท Level 1 ยท Heads of statePEP
PEP ยท Level 2 ยท ParliamentPEP
PEP ยท Level 3 ยท Civil servicePEP
PEP ยท Level 4 ยท RCAPEP
Adverse media ยท Financial crimeMedia
Adverse media ยท FraudMedia
Adverse media ยท NarcoticsMedia
$0.20 / pemeriksaan
Lihat alurnya
Apa yang dilihat orang, dalam empat layar.
Presentasi lintas perangkat seperti yang dijelaskan ARF: orang memulai di komputer dan menyelesaikannya di ponsel yang menyimpan wallet.
01Pindai untuk melanjutkan
Pindai kode QR
Layanan menampilkan kode QR, dan orang memindainya dengan aplikasi wallet.
02Toko online meminta: usia di atas 18
Tinjau permintaan
Wallet menunjukkan siapa yang meminta dan atribut apa saja.
03Bagikan 1 atribut
Bagikan
Orang menyetujui, dan hanya atribut yang diminta yang keluar dari ponsel.
04Terverifikasi
Terverifikasi
Layanan memeriksa tanda tangan penerbit dan melanjutkan. Tidak ada hal lain yang dibagikan.
Ilustrasi alur standar. Penerimaan EUDI Wallet Didit akan segera hadir.
Integrasikan sekarang
Integrasikan sekarang, dan pertahankan saat wallet tiba.
Belum ada API Didit khusus EUDI. Buat sesi untuk alur kerja yang menerima eID dan dokumen nasional yang aktif, lalu baca hasilnya. Penerimaan EUDI Wallet direncanakan untuk langkah Verifikasi ID yang sama.
Salin prompt ini ke agen coding Anda. Ini membangun alur kerja yang dapat Anda jalankan hari ini, eID nasional langsung dengan fallback dokumen, ditambah panggilan sesi dan webhook yang ditandatangani. Ini tidak menciptakan endpoint EUDI, karena belum ada.
didit-integration-prompt.md
# 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
Dirancang untuk kepatuhan
Buka negara baru dengan satu klik. Kami yang mengerjakan bagian sulitnya.
Kami membuka anak perusahaan lokal, mengamankan lisensi, menjalankan pengujian penetrasi, mendapatkan sertifikasi, dan menyelaraskan dengan setiap regulasi baru. Untuk meluncurkan verifikasi di negara baru, cukup aktifkan tombol. 220+ negara sudah aktif, diaudit dan diuji penetrasi setiap kuartal, satu-satunya penyedia identitas yang secara formal disebut oleh pemerintah negara anggota Uni Eropa lebih aman daripada verifikasi langsung.
Mulai gratis. Bayar sesuai pemakaian. Skalakan ke Enterprise.
500 verifikasi gratis setiap bulan, selamanya. Setelah itu, bayar hanya saat modul berjalan. Kontrak khusus, data residency, dan service level agreement (SLA) tersedia untuk Enterprise.
Gratis
$0/ bulan ยท tanpa kartu
Untuk membangun, menguji, dan pengguna pertamamu.
Semua yang kamu butuhkan untuk memulai:
500 verifikasi KYC lengkap setiap bulan
ID, liveness, face match, device & IP
200+ sinyal fraud, blocklist, duplikat
KYC yang bisa digunakan kembali di seluruh jaringan Didit
Workflow builder, case management, SDK
Dukungan AIAgen AI dalam konsol, dokumentasi, dan komunitas.