Prepara't per acceptar la cartera d'identitat digital de la UE.
Cada Estat membre de la UE ha d'oferir una cartera d'identitat digital de la UE (EUDI) abans del 24 de desembre de 2026, i les empreses regulades l'han d'acceptar abans del 24 de desembre de 2027. Didit ja gestiona cinc identificacions electròniques nacionals (eIDs), i l'acceptació de l'EUDI Wallet s'integrarà aviat al mateix flux de treball.
Confiat per més de 3.000 organitzacions a tot el món.
EUDI WalletAtestació d'identitat i edat
La botiga en línia demanaMajor de 18 anys
Cognom
Nom
Data de naixement
Lloc de naixement
Nacionalitat
Major de 18 anys
Comparteix 1 atribut
Part usuàriaBotiga en línia
age_over_18true
Signatura de l'emissor
Vinculació del dispositiu
5 atributs retinguts
Què és l'EUDI Wallet
Una cartera per persona. Només les dades que demanis.
L'EUDI Wallet és una aplicació gratuïta que tots els Estats membres de la UE han d'oferir segons el Reglament (UE) 2024/1183, conegut com a eIDAS 2. Conté dades d'identificació personal (PID), és a dir, nom, data i lloc de naixement i nacionalitat, a més d'atestacions electròniques d'atributs com ara un permís de conduir o un diploma. El seu ús és voluntari.
Quan una empresa sol·licita dades, la persona veu qui les demana i només comparteix els atributs sol·licitats. Això s'anomena divulgació selectiva: un lloc web pot saber que algú és major de 18 anys sense veure la data de naixement. La cartera funciona amb un nivell de garantia alt, el més fort dels tres nivells eIDAS, i l'empresa comprova la signatura de l'emissor abans de confiar en les dades.
Última revisió: 5 d'octubre de 2026. No és assessorament legal.
Dates clau
Carteres a finals de 2026. Acceptació abans del 24 de desembre de 2027.
Aquestes són les dates del Reglament (UE) 2024/1183 i els seus actes d'execució que una empresa hauria de tenir en compte per a la seva planificació.
30 d'abril de 2024
Publicació d'eIDAS 2
El Reglament (UE) 2024/1183, que modifica el Reglament eIDAS (UE) núm. 910/2014, apareix al Diari Oficial de la UE. Entra en vigor el vintè dia després de la seva publicació.
24 de desembre de 2024
Entrada en vigor de les primeres normes de la cartera
Entren en vigor els primers cinc reglaments d'execució per a la cartera: dades d'identificació personal, funcions bàsiques, notificacions, certificació i protocols i interfícies. Aquests inicien els terminis de 24 i 36 mesos que es detallen a continuació.
15 de juliol de 2026
Normes de la cartera actualitzades
La Comissió adopta el Reglament d'Execució (UE) 2026/1731. Estableix els dos formats de credencials, SD-JWT VC i ISO/IEC mdoc, i programa el retrat obligatori per al 2028.
23 de juliol de 2026
ARF v3.0.0
El Marc d'Arquitectura i Referència (ARF), el pla tècnic sobre el qual es construeixen les carteres i les parts que hi confien, arriba a la versió 3.0.0.
24 de desembre de 2026
Carteres a tots els Estats membres
Cada Estat membre ha de proporcionar almenys una EUDI Wallet. Les normes per al registre de les parts que hi confien, el Reglament d'Execució (UE) 2025/848, s'apliquen a partir del mateix dia.
24 de desembre de 2027
Les empreses privades l'han d'acceptar
Les empreses privades que han d'utilitzar una autenticació d'usuari forta per llei o per contracte, excepte les micro i petites empreses, han d'acceptar la cartera quan un usuari demani utilitzar-la (article 5f(2)). Aquest termini és de 36 mesos des de l'entrada en vigor dels primers actes d'execució, el 24 de desembre de 2024, és a dir, fins al 24 de desembre de 2027.
11 d'agost de 2028
Comprovacions de retrat i registre
El retrat passa a formar part de les dades d'identificació personal obligatòries, i les carteres han d'autenticar i validar el certificat de registre de cada part que hi confia.
Qui l'ha d'acceptar
Qui ha d'acceptar la cartera, i quan.
L'article 5f del Reglament eIDAS, modificat pel Reglament (UE) 2024/1183, estableix els deures d'acceptació. En tots els casos, l'usuari tria utilitzar la cartera, i tu mantens les teves altres maneres d'identificar persones.
Qui
Què significa, en un llenguatge senzill
Article · data
Qui
Organismes del sector públic
Què significa, en un llenguatge senzill
Si un Estat membre exigeix identificació electrònica per accedir a un servei públic en línia, aquest servei també ha d'acceptar l'EUDI Wallet.
Article · data
Art. 5f(1)
Qui
Serveis privats que han d'utilitzar autenticació d'usuari forta
Què significa, en un llenguatge senzill
Si una llei o un contracte t'exigeix utilitzar una autenticació d'usuari forta per a la identificació en línia, també has d'acceptar l'EUDI Wallet. El detonant és aquest requisit, no el teu sector.
Article · data
Art. 5f(2) · 24 des. 2027
Qui
Àrees que l'article esmenta
Què significa, en un llenguatge senzill
Transport, energia, banca, serveis financers, seguretat social, salut, aigua potable, serveis postals, infraestructura digital, educació i telecomunicacions. L'article diu «incloent-hi», de manera que la llista són exemples i no és tancada.
Article · data
Art. 5f(2)
Qui
Micro i petites empreses
Què significa, en un llenguatge senzill
Exemptes del deure del sector privat, tal com es defineix a la Recomanació 2003/361/CE de la Comissió. Poden acceptar la cartera si així ho decideixen.
Article · data
Art. 5f(2)
Qui
Només a petició de l'usuari
Què significa, en un llenguatge senzill
L'acceptació és deguda quan l'usuari demana utilitzar la cartera. L'ús és voluntari per a les persones, i els serveis han de romandre oberts a altres mitjans d'identificació i autenticació.
Article · data
Arts. 5f(2), 5a(15)
Qui
Plataformes en línia molt grans
Què significa, en un llenguatge senzill
Les plataformes designades en virtut de la Llei de Serveis Digitals que requereixen autenticació d'usuari han d'acceptar la cartera a petició de l'usuari, per a les dades mínimes que el servei necessita. El text no estableix una data separada per a aquest deure.
Article · data
Art. 5f(3)
Les parts usuàries també s'han de registrar a l'Estat membre on estan establertes, i només poden sol·licitar les dades que van registrar (Article 5b). Última revisió: 5 d'octubre de 2026. No és assessorament legal.
Com l'accepta una empresa
Com una part usuària accepta l'EUDI Wallet, en cinc passos.
Pas 01 / 05
01
Registra't com a part usuària
Registra't a l'Estat membre on estàs establert, amb les teves dades i les dades que vols sol·licitar. Rebràs un certificat d'accés, que t'autentica a la cartera, i, si el teu Estat membre n'emet un, un certificat de registre que enumera els atributs que vas registrar.
Demana només el que necessites
Demana atributs específics, per exemple, edat superior a 18 anys, amb OpenID for Verifiable Presentations (OpenID4VP) i una consulta de Digital Credentials Query Language (DCQL), o amb ISO/IEC 18013-7. No pots sol·licitar dades més enllà del teu registre.
L'usuari dona el seu consentiment a la cartera
Al mateix telèfon, el navegador passa a l'aplicació de la cartera. En un ordinador, l'usuari escaneja un codi QR. La cartera mostra qui pregunta, comprova que no demanes més del que vas registrar, i l'usuari aprova o rebutja.
Verifica la presentació
Comprova la signatura de l'emissor amb les llistes de confiança, comprova que la credencial no ha estat revocada i comprova l'enllaç del dispositiu, que mostra que la credencial no va ser copiada ni reproduïda.
Rep els atributs i decideix
Només reps els atributs que l'usuari va compartir, signats per l'emissor. La decisió d'incorporació o accés, i el registre que guardes, es queden amb tu.
Didit executarà aquests passos per a tu quan es llanci l'acceptació de l'EUDI Wallet (properament).
Què reps vs. què encara necessita el KYC
La cartera demostra qui és algú. La diligència deguda necessita més.
Segons el Reglament contra el blanqueig de capitals (AMLR), Reglament (UE) 2024/1624, la identificació electrònica amb un nivell de garantia substancial o alt és una de les dues maneres de verificar la identitat (article 22(6)). No inclou tot el que demanen les comprovacions de coneixement del client (KYC). Aquí teniu el que contenen les dades d'identificació personal (PID) i com Didit cobreix cada element avui.
Necessitats de diligència deguda
A l'EUDI Wallet PID
Com Didit ho cobreix avui
Necessitats de diligència deguda
Nom i cognoms complets
AMLR Art. 22(1)(a)
A l'EUDI Wallet PID
Cognom i nom, tots dos obligatoris.
Com Didit ho cobreix avui
Els eID nacionals en viu retornen el nom complet. La ruta del document el llegeix de més de 14.000 tipus de documents.
Necessitats de diligència deguda
Lloc i data de naixement completa
AMLR Art. 22(1)(a)
A l'EUDI Wallet PID
Data de naixement i lloc de naixement, tots dos obligatoris.
Com Didit ho cobreix avui
Els eID nacionals en viu retornen la data de naixement. La ruta del document llegeix el lloc de naixement on el document l'imprimeix.
Necessitats de diligència deguda
Nacionalitats
AMLR Art. 22(1)(a)
A l'EUDI Wallet PID
Nacionalitat, obligatòria, un o més països.
Com Didit ho cobreix avui
La ruta del document llegeix la nacionalitat del document d'identitat o del seu xip.
Necessitats de diligència deguda
Número d'identificació nacional, si escau
AMLR Art. 22(1)(a)
A l'EUDI Wallet PID
Número administratiu personal, opcional. Cada Estat membre decideix si l'emet.
Com Didit ho cobreix avui
Els eID nacionals en viu retornen un identificador del sistema: el personnummer suec, el codi d'identitat personal finlandès o el codi personal bàltic. MitID retorna un identificador pseudonimitzat, no el número CPR.
Necessitats de diligència deguda
Lloc de residència habitual
AMLR Art. 22(1)(a)
A l'EUDI Wallet PID
Els camps d'adreça són opcionals i sovint falten. Els esborranys finals de les normes de l'AMLA diuen que els atributs que falten s'han d'obtenir per altres mitjans.
Com Didit ho cobreix avui
Cap eID nacional en viu retorna una adreça. La prova d'adreça verifica una factura de serveis, un extracte bancari o una carta del govern.
Necessitats de diligència deguda
Número d'identificació fiscal, si està disponible
AMLR Art. 22(1)(a)
A l'EUDI Wallet PID
No forma part del PID.
Com Didit ho cobreix avui
Recull-lo amb un pas de qüestionari en el mateix flux de treball.
Necessitats de diligència deguda
La persona coincideix amb la identitat
ARF · vinculació d'usuari
A l'EUDI Wallet PID
El retrat segueix sent opcional fins que esdevingui obligatori l'11 d'agost de 2028.
Com Didit ho cobreix avui
Liveness passiva i una coincidència facial 1:1 amb la foto del document o el retrat del xip, dins de la verificació KYC completa per $0.33.
Necessitats de diligència deguda
Beneficiaris efectius d'una empresa
AMLR Art. 20(1)(b)
A l'EUDI Wallet PID
No al PID. Una cartera identifica una persona, no qui posseeix una empresa.
Com Didit ho cobreix avui
La verificació d'empreses extreu dades del registre i propietaris on el registre els té, amb una verificació d'identitat per a cada propietari.
Necessitats de diligència deguda
Sancions i persones políticament exposades (PEP)
AMLR Art. 20(1)(d), (g)
A l'EUDI Wallet PID
No al PID.
Com Didit ho cobreix avui
Detecció AML contra més de 1.300 llistes de sancions, PEP i llistes de vigilància, per $0.20 per verificació.
Necessitats de diligència deguda
Propòsit de la relació i seguiment continu
AMLR Arts. 25, 26
A l'EUDI Wallet PID
No al PID.
Com Didit ho cobreix avui
Els qüestionaris registren el propòsit de la relació. El seguiment continu torna a examinar els clients cada dia per $0.07 per persona a l'any.
La diligència deguda del client continua sent la teva obligació. Didit proporciona comprovacions i proves, però no et fa complir la normativa. L'AMLR s'aplica a partir del 10 de juliol de 2027, i els estàndards tècnics de l'AMLA són un esborrany final datat el 30 de setembre de 2026, no una llei.
Preparació per país
Situació de les carteres nacionals, amb data i font.
Això és el que ha publicat cada país, o el que informa una font identificada, amb la data i un enllaç per a cada fila.
Estat a data de 5 d’octubre del 2026
País
Cartera o app
Estat
Data
Què se sap
País
Itàlia
Cartera o app
IT-Wallet (app IO)
Estat
App en funcionament
Data
17 de febrer del 2026
Què se sap
En funcionament a l'app IO, amb 10,1 milions d'activacions i 17,3 milions de documents carregats fins al 17 de febrer de 2026. Gratuïta i opcional per a adults, que inicien sessió amb CIE o SPID.
AltID està disponible amb un document d'identitat digital i prova d'edat, i 281.390 persones l'havien creat a 4 d'agost de 2026. L'Agència per al Govern Digital està implementant la cartera per etapes.
Sandbox pública des de desembre de 2025. L'aplicació està prevista per a principis de 2027, començant amb la funció d'identificació. La llei d'implementació va tenir la seva primera lectura al Bundestag el 23 de setembre de 2026.
No s'han llistat: Àustria, Bèlgica, Estònia, Hongria, Letònia, Lituània, Luxemburg, Malta, Portugal, Eslovènia. No hem trobat cap estat públic per a ells en aquesta data. Actualitzem aquesta taula a mesura que es llancen les aplicacions nacionals.
Com Didit t'hi porta · Cinc files
Accepta els eIDs nacionals ara. Afegeix la cartera EUDI després.
L'EUDI Wallet afegeix una via, no substitueix les altres. Crea el flux de treball una vegada: eIDs i documents nacionals avui, i l'acceptació de l'EUDI Wallet en el mateix pas de verificació d'identitat quan es llanci.
Accepta els eIDs nacionals que els teus clients ja utilitzen.
Cinc eIDs nacionals estan actius a Didit en set països: MitID, BankID Sweden, Finnish Trust Network, Smart-ID i Mobile-ID. L'usuari inicia sessió amb el seu eID i la sessió rep atributs signats: nom complet, data de naixement, un identificador del sistema (per exemple, el personnummer suec; MitID retorna un identificador pseudonimitzat) i el nivell de garantia que el sistema va afirmar. Només es facturen els inicis de sessió completats.
Nivells segons l'etiquetatge de Didit. No es retorna cap adreça ni retrat.
02 · EUDI Wallet, properament
Acceptació de l'EUDI Wallet, en el mateix flux de treball.
L'acceptació de l'EUDI Wallet arribarà aviat. El nostre catàleg de carteres la inclou per a 30 països de l'EEE, en el mateix pas de verificació d'identitat que els eID nacionals. Encara no hi ha data ni preu.
Encara no hi ha data ni preu per a l'acceptació de l'EUDI Wallet.
03 · Via documental
Una via documental per a tothom sense cartera.
No tothom tindrà o utilitzarà una cartera, i la llei manté obertes altres vies. La via documental llegeix el xip de passaports i DNI mitjançant NFC ($0.15), executa la prova de vida passiva i compara la cara amb la foto del document, en més de 14.000 tipus de documents en més de 220 països i territoris.
L'EUDI Wallet pot demostrar que algú és major de 18 anys sense data de naixement. Fins que les carteres siguin comunes, l'estimació d'edat a partir d'un selfie costa $0.10 per comprovació i envia resultats dubtosos a una verificació d'identitat de reserva. Un inici de sessió eID en directe també retorna una data de naixement signada sense foto de document.
Cribratge, monitorització i empreses, en un sol lloc.
La identitat és una part de la diligència deguda del client. En el mateix flux de treball, filtra persones contra més de 1.300 sancions, PEP i llistes de vigilància ($0.20 per comprovació), torna a filtrar-les cada dia amb monitorització contínua ($0.07 per persona per any), i verifica empreses i els seus propietaris.
Una presentació multidispositiu tal com la descriu l'ARF: la persona comença en un ordinador i acaba al telèfon que conté la cartera.
01Escaneja per continuar
Escaneja el codi QR
El servei mostra un codi QR i la persona l'escaneja amb l'aplicació de la cartera.
02La botiga en línia demana: major de 18 anys
Revisa la sol·licitud
La cartera mostra qui sol·licita i quins atributs.
03Comparteix 1 atribut
Comparteix
La persona aprova, i només els atributs sol·licitats surten del telèfon.
04Verificat
Verificat
El servei comprova la signatura de l'emissor i continua. No es va compartir res més.
Una il·lustració del flux estàndard. L'acceptació de l'EUDI Wallet de Didit estarà disponible properament.
Integra avui
Integra avui i mantén-ho quan arribi la cartera.
Encara no hi ha una API de Didit específica per a EUDI. Crea una sessió per a un flux de treball que accepti els eIDs nacionals en viu i els documents, i després llegeix el resultat. L'acceptació de l'EUDI Wallet està prevista per al mateix pas de verificació d'identitat.
Prepara't per a l'EUDI Wallet amb una sola indicació.
Copia aquesta indicació al teu agent de codificació. Construeix el flux de treball que pots executar avui, eIDs nacionals en viu amb un document de reserva, a més de la crida de sessió i el webhook signat. No inventa cap punt final EUDI, perquè encara no n'hi ha cap.
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
Compliment per disseny
Obre un nou país amb un clic. Nosaltres fem la feina difícil.
Obrim les filials locals, assegurem les llicències, realitzem les proves de penetració, obtenim les certificacions i ens alineem amb cada nova regulació. Per desplegar verificacions en un nou país, només has d'activar un interruptor. Més de 220 països en funcionament, auditats i provats trimestralment, l'únic proveïdor d'identitat que un govern d'un estat membre de la UE ha qualificat formalment com més segur que la verificació presencial.
Països de l'EEE en el desplegament de l'EUDI Wallet
220+
Països i territoris amb la ruta de documents
Tres nivells, una llista de preus
Comença gratis. Paga per ús. Escala a Enterprise.
500 verificacions gratuïtes cada mes, per sempre. Després, paga només quan s'executa un mòdul. Contractes personalitzats, residència de dades i acords de nivell de servei (SLA) a Enterprise.
Gratuït
$0/ mes · sense targeta
Per construir, provar i per als teus primers usuaris.
Tot el que necessites per començar:
500 verificacions KYC completes cada mes
Identificació, prova de vida, coincidència facial, dispositiu i IP
Més de 200 senyals de frau, llista de bloqueig, duplicats
KYC reutilitzable a tota la xarxa Didit
Constructor de fluxos de treball, gestió de casos, SDKs
Suport amb IAAgent d'IA a la consola, documentació i comunitat.