Prepare-se para aceitar a Carteira de Identidade Digital da UE (EUDI Wallet).
Todo Estado-Membro da UE deve oferecer uma Carteira de Identidade Digital da UE (EUDI Wallet) até 24 de dezembro de 2026, e empresas regulamentadas devem aceitá-la até 24 de dezembro de 2027. A Didit já opera cinco eIDs nacionais, e a aceitação da EUDI Wallet estará disponível em breve no mesmo fluxo de trabalho.
Confiado por mais de 3.000 organizações em todo o mundo.
Carteira EUDIAtestado de identidade e idade
Loja online solicitaIdade acima de 18
Sobrenome
Nome
Data de nascimento
Local de nascimento
Nacionalidade
Idade acima de 18
Compartilhar 1 atributo
Parte confiávelLoja online
age_over_18true
Assinatura do emissor
Vinculação do dispositivo
5 atributos retidos
O que é a EUDI Wallet
Uma carteira por pessoa. Apenas os dados que você solicitar.
A EUDI Wallet é um aplicativo gratuito que todo Estado-Membro da UE deve oferecer sob o Regulamento (UE) 2024/1183, conhecido como eIDAS 2. Ela armazena dados de identificação pessoal (PID), ou seja, nome, data e local de nascimento e nacionalidade, além de atestados eletrônicos de atributos como carteira de motorista ou diploma. O uso é voluntário.
Quando uma empresa solicita dados, a pessoa vê quem está solicitando e compartilha apenas os atributos solicitados. Isso é chamado de divulgação seletiva: um site pode saber que alguém é maior de 18 anos sem ver a data de nascimento. A carteira funciona com nível de garantia alto, o mais forte dos três níveis eIDAS, e a empresa verifica a assinatura do emissor antes de confiar nos dados.
Última revisão: 5 de outubro de 2026. Não é aconselhamento jurídico.
Datas importantes
Carteiras até o final de 2026. Aceitação até 24 de dezembro de 2027.
Estas são as datas no Regulamento (UE) 2024/1183 e seus atos de execução que uma empresa deve considerar em seu planejamento.
30 de abril de 2024
eIDAS 2 publicado
O Regulamento (UE) 2024/1183, que altera o Regulamento eIDAS (UE) nº 910/2014, é publicado no Jornal Oficial da UE. Ele entra em vigor no vigésimo dia após a publicação.
24 de dezembro de 2024
Primeiras regras da carteira em vigor
Os primeiros cinco regulamentos de implementação para a carteira entram em vigor: dados de identificação pessoal, funções principais, notificações, certificação e protocolos e interfaces. Eles iniciam os prazos de 24 e 36 meses abaixo.
15 de julho de 2026
Regras da carteira atualizadas
A Comissão adota o Regulamento de Execução (UE) 2026/1731. Ele define os dois formatos de credencial, SD-JWT VC e ISO/IEC mdoc, e programa o retrato obrigatório para 2028.
23 de julho de 2026
ARF v3.0.0
O Architecture and Reference Framework (ARF), o plano técnico no qual carteiras e partes confiantes se baseiam, atinge a versão 3.0.0.
24 de dezembro de 2026
Carteiras em todos os Estados-Membros
Cada Estado-Membro deve fornecer pelo menos uma EUDI Wallet. As regras para o registro de partes confiantes, o Regulamento de Execução (UE) 2025/848, aplicam-se a partir da mesma data.
24 de dezembro de 2027
Empresas privadas devem aceitá-la
Empresas privadas que devem usar autenticação forte de usuário por lei ou contrato, exceto micro e pequenas empresas, devem aceitar a carteira quando um usuário solicitar seu uso (Artigo 5f(2)). Esse prazo é de 36 meses após a entrada em vigor dos primeiros atos de execução, em 24 de dezembro de 2024, ou seja, até 24 de dezembro de 2027.
11 de agosto de 2028
Verificações de retrato e registro
O retrato passa a fazer parte dos dados de identificação pessoal obrigatórios, e as carteiras devem autenticar e validar o certificado de registro de cada parte confiante.
Quem deve aceitar
Quem precisa aceitar a carteira, e quando.
O Artigo 5f do Regulamento eIDAS, conforme alterado pelo Regulamento (UE) 2024/1183, estabelece os deveres de aceitação. Em todos os casos, o usuário escolhe usar a carteira, e você mantém suas outras formas de identificar pessoas.
Quem
O que significa, em bom português
Artigo · data
Quem
Órgãos do setor público
O que significa, em bom português
Quando um Estado-Membro exige identificação eletrônica para acessar um serviço público online, esse serviço também deve aceitar a Carteira EUDI.
Artigo · data
Art. 5f(1)
Quem
Serviços privados que devem usar autenticação forte de usuário
O que significa, em bom português
Se uma lei ou contrato exige que você use autenticação forte de usuário para identificação online, você também deve aceitar a Carteira EUDI. O gatilho é essa exigência, não o seu setor.
Artigo · data
Art. 5f(2) · 24 Dez 2027
Quem
Áreas citadas no artigo
O que significa, em bom português
Transporte, energia, serviços bancários, serviços financeiros, seguridade social, saúde, água potável, serviços postais, infraestrutura digital, educação e telecomunicações. O artigo diz “incluindo”, então a lista apresenta exemplos e não é fechada.
Artigo · data
Art. 5f(2)
Quem
Micro e pequenas empresas
O que significa, em bom português
Isentas da obrigação do setor privado, conforme definido na Recomendação 2003/361/CE da Comissão. Elas ainda podem aceitar a carteira se assim desejarem.
Artigo · data
Art. 5f(2)
Quem
Somente a pedido do usuário
O que significa, em bom português
A aceitação é devida quando o usuário solicita o uso da carteira. Usá-la é opcional para as pessoas, e os serviços devem permanecer abertos a outros meios de identificação e autenticação.
Artigo · data
Arts. 5f(2), 5a(15)
Quem
Plataformas online muito grandes
O que significa, em bom português
Plataformas designadas sob o Digital Services Act que exigem autenticação de usuário devem aceitar a carteira a pedido do usuário, para os dados mínimos que o serviço necessita. O texto não estabelece uma data separada para esta obrigação.
Artigo · data
Art. 5f(3)
As partes confiantes também devem se registrar no Estado-Membro onde estão estabelecidas e podem solicitar apenas os dados que registraram (Artigo 5b). Última revisão: 5 de outubro de 2026. Não é aconselhamento jurídico.
Como uma empresa aceita
Como uma parte confiante aceita a Carteira EUDI, em cinco passos.
Passo 01 / 05
01
Registre-se como parte confiante
Registre-se no Estado-Membro onde você está estabelecido, com seus dados e as informações que pretende solicitar. Você receberá um certificado de acesso, que o autentica na carteira, e, se o seu Estado-Membro emitir, um certificado de registro que lista os atributos que você registrou.
Peça apenas o que você precisa
Solicite atributos específicos, por exemplo, idade acima de 18 anos, com OpenID for Verifiable Presentations (OpenID4VP) e uma consulta Digital Credentials Query Language (DCQL), ou com ISO/IEC 18013-7. Você não pode solicitar dados além do seu registro.
O usuário consente na carteira
No mesmo telefone, o navegador transfere para o aplicativo da carteira. Em um computador, o usuário escaneia um QR code. A carteira mostra quem está solicitando, verifica se você não está pedindo mais do que registrou, e o usuário aprova ou recusa.
Verifique a apresentação
Verifique a assinatura do emissor em relação às listas confiáveis, verifique se a credencial não foi revogada e verifique a vinculação do dispositivo, que mostra que a credencial não foi copiada nem reproduzida em ataque de replay.
Receba os atributos e decida
Você recebe apenas os atributos que o usuário compartilhou, assinados pelo emissor. A decisão de onboarding ou acesso, e o registro que você mantém, ficam com você.
A Didit executará essas etapas para você quando a aceitação da Carteira EUDI for lançada (em breve).
O que você recebe vs. o que o KYC ainda precisa
A carteira prova quem alguém é. A diligência devida precisa de mais.
De acordo com o Regulamento Anti-Lavagem de Dinheiro (AMLR), Regulamento (UE) 2024/1624, a identificação eletrônica com nível de garantia substancial ou alto é uma das duas formas de verificar a identidade (Artigo 22(6)). Ela não contém tudo o que as verificações de Know Your Customer (KYC) pedem. Veja o que os dados de identificação pessoal (PID) contêm e como a Didit cobre cada item hoje.
Necessidades de diligência devida
No PID da Carteira EUDI
Como a Didit cobre hoje
Necessidades de diligência devida
Todos os nomes e sobrenomes
AMLR Art. 22(1)(a)
No PID da Carteira EUDI
Sobrenome e nome, ambos obrigatórios.
Como a Didit cobre hoje
eIDs nacionais ativas retornam o nome completo. A rota de documentos o lê de mais de 14.000 tipos de documentos.
Necessidades de diligência devida
Local e data completa de nascimento
AMLR Art. 22(1)(a)
No PID da Carteira EUDI
Data de nascimento e local de nascimento, ambos obrigatórios.
Como a Didit cobre hoje
eIDs nacionais ativas retornam a data de nascimento. A rota de documentos lê o local de nascimento onde o documento o imprime.
Necessidades de diligência devida
Nacionalidades
AMLR Art. 22(1)(a)
No PID da Carteira EUDI
Nacionalidade, obrigatória, um ou mais países.
Como a Didit cobre hoje
A rota de documentos lê a nacionalidade do documento de identidade ou de seu chip.
Necessidades de diligência devida
Número de identificação nacional, quando aplicável
AMLR Art. 22(1)(a)
No PID da Carteira EUDI
Número administrativo pessoal, opcional. Cada Estado-Membro decide se o emite.
Como a Didit cobre hoje
eIDs nacionais ativas retornam um identificador do esquema: o personnummer sueco, o código de identidade pessoal finlandês ou o código pessoal báltico. O MitID retorna um identificador pseudonimizado, não o número CPR.
Necessidades de diligência devida
Local de residência habitual
AMLR Art. 22(1)(a)
No PID da Carteira EUDI
Os campos de endereço são opcionais e frequentemente ausentes. As normas técnicas finais em rascunho da AMLA dizem que atributos ausentes devem ser obtidos por outros meios.
Como a Didit cobre hoje
Nenhum eID nacional ativo retorna um endereço. A verificação de comprovante de endereço analisa uma conta de concessionária, um extrato bancário ou uma carta do governo.
Necessidades de diligência devida
Número de identificação fiscal, quando disponível
AMLR Art. 22(1)(a)
No PID da Carteira EUDI
Não faz parte do PID.
Como a Didit cobre hoje
Colete-o com uma etapa de questionário no mesmo fluxo de trabalho.
Necessidades de diligência devida
A pessoa corresponde à identidade
ARF · vinculação de usuário
No PID da Carteira EUDI
O retrato permanece opcional até se tornar obrigatório em 11 de agosto de 2028.
Como a Didit cobre hoje
Prova de vida passiva e correspondência facial 1:1 com a foto do documento ou o retrato do chip, dentro da verificação KYC completa por $0.33.
Necessidades de diligência devida
Beneficiários finais de uma empresa
AMLR Art. 20(1)(b)
No PID da Carteira EUDI
Não está no PID. Uma carteira identifica uma pessoa, não quem possui uma empresa.
Como a Didit cobre hoje
A Verificação de Negócios extrai dados de registro e proprietários onde o registro os detém, com uma verificação de identidade para cada proprietário.
Necessidades de diligência devida
Sanções e pessoas politicamente expostas (PEPs)
AMLR Art. 20(1)(d), (g)
No PID da Carteira EUDI
Não está no PID.
Como a Didit cobre hoje
Triagem AML contra mais de 1.300 listas de sanções, PEPs e listas de observação, por $0.20 por verificação.
Necessidades de diligência devida
Propósito do relacionamento e monitoramento contínuo
AMLR Arts. 25, 26
No PID da Carteira EUDI
Não está no PID.
Como a Didit cobre hoje
Questionários registram o propósito do relacionamento. O monitoramento contínuo refaz a triagem dos clientes todos os dias por $0.07 por pessoa por ano.
A diligência devida sobre o cliente continua sendo sua obrigação. A Didit fornece verificações e evidências, mas não garante sua conformidade. A AMLR se aplica a partir de 10 de julho de 2027, e as normas técnicas da AMLA são um rascunho final datado de 30 de setembro de 2026, não uma lei.
Prontidão por país
Onde as carteiras nacionais estão, com data e fonte.
Isto é o que cada país publicou, ou o que uma fonte identificada relata, com a data e um link para cada linha.
Status em 5 de outubro de 2026
País
Carteira ou app
Status
Data
O que se sabe
País
Itália
Carteira ou app
IT-Wallet (app IO)
Status
App ativo
Data
17 de fevereiro de 2026
O que se sabe
Ativo no app IO, com 10,1 milhões de ativações e 17,3 milhões de documentos carregados até 17 de fevereiro de 2026. Gratuito e opcional para adultos, que fazem login com CIE ou SPID.
O AltID está disponível com um documento de identidade digital e prova de idade, e 281.390 pessoas já o tinham criado até 4 de agosto de 2026. A Agência para o Governo Digital está implementando a carteira em etapas.
Sandbox público desde dezembro de 2025. O app tem lançamento previsto para o início de 2027, começando com a função de ID. A lei de implementação teve sua primeira leitura no Bundestag em 23 de setembro de 2026.
Não listados: Áustria, Bélgica, Estônia, Hungria, Letônia, Lituânia, Luxemburgo, Malta, Portugal, Eslovênia. Não encontramos status público para eles nesta data. Atualizamos esta tabela conforme os apps nacionais são lançados.
Como a Didit te ajuda a chegar lá · Cinco linhas
Aceite eIDs nacionais agora. Adicione a Carteira EUDI em seguida.
A Carteira EUDI adiciona uma rota, mas não substitui as outras. Crie o fluxo de trabalho uma única vez: eIDs e documentos nacionais hoje, e a aceitação da Carteira EUDI na mesma etapa de Verificação de ID quando for lançada.
Aceite os eIDs nacionais que seus clientes já usam.
Cinco eIDs nacionais estão ativos no Didit em sete países: MitID, BankID Sweden, Finnish Trust Network, Smart-ID e Mobile-ID. O usuário faz login com seu eID, e a sessão recebe atributos assinados: nome completo, data de nascimento, um identificador do esquema (por exemplo, o personnummer sueco; o MitID retorna um identificador pseudonimizado) e o nível de garantia afirmado pelo esquema. Apenas logins concluídos são cobrados.
Níveis conforme a nomenclatura da Didit. Nenhum endereço ou retrato é retornado.
02 · Carteira EUDI, em breve
Aceitação da Carteira EUDI, no mesmo fluxo de trabalho.
A aceitação da EUDI Wallet está chegando. Nosso catálogo de carteiras a lista para 30 países do EEE, na mesma etapa de Verificação de ID que os eIDs nacionais. Ainda não há data ou preço definidos.
Ainda não há data nem preço para a aceitação da Carteira EUDI.
03 · Rota de documento
Uma rota de documento para quem não tem carteira.
Nem todos terão ou usarão uma carteira, e a lei mantém outros meios abertos. A rota de documento lê o chip em passaportes e carteiras de identidade por NFC ($0.15), executa prova de vida passiva e compara o rosto com a foto do documento, em mais de 14.000 tipos de documentos em mais de 220 países e territórios.
A Carteira EUDI pode comprovar que alguém tem mais de 18 anos sem uma data de nascimento. Assim que as carteiras forem comuns, a estimativa de idade a partir de uma selfie custa $0.10 por verificação e envia resultados limítrofes para um fallback de verificação de ID. Um login eID ativo também retorna uma data de nascimento assinada sem uma foto de documento.
Triagem, monitoramento e empresas, em um só lugar.
A identidade é uma parte da diligência devida sobre o cliente. No mesmo fluxo de trabalho, faça a triagem de pessoas contra mais de 1.300 listas de sanções, PEPs e listas de observação ($0.20 por verificação), reavalie-as todos os dias com monitoramento contínuo ($0.07 por pessoa por ano) e verifique empresas e seus proprietários.
Nordwind Handel GmbHEmpresa · proprietários em escopo
0 / 1,327 listsLimpoEnviado para revisão
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 / verificação
Veja o fluxo
O que a pessoa vê, em quatro telas.
Uma apresentação entre dispositivos, como o ARF descreve: a pessoa começa em um computador e termina no telefone que contém a carteira.
01Escaneie para continuar
Escaneie o código QR
O serviço mostra um código QR, e a pessoa o escaneia com o aplicativo da carteira.
02Loja online pede: idade acima de 18
Revise a solicitação
A carteira mostra quem está solicitando e quais atributos.
03Compartilhar 1 atributo
Compartilhar
A pessoa aprova, e apenas os atributos solicitados saem do telefone.
04Verificado
Verificado
O serviço verifica a assinatura do emissor e continua. Nada mais foi compartilhado.
Uma ilustração do fluxo padrão. A aceitação da Carteira EUDI do Didit estará disponível em breve.
Integre hoje
Integre hoje e mantenha quando a carteira chegar.
Ainda não existe uma API Didit específica para EUDI. Crie uma sessão para um fluxo de trabalho que aceite eIDs e documentos nacionais ativos, e depois leia o resultado. A aceitação da Carteira EUDI está planejada para a mesma etapa de Verificação de ID.
Copie este prompt para seu agente de codificação. Ele constrói o fluxo de trabalho que você pode executar hoje, eIDs nacionais ativas com um fallback de documento, além da chamada de sessão e do webhook assinado. Ele não inventa nenhum endpoint EUDI, porque nenhum existe ainda.
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
Conformidade por design
Abra um novo país com um clique. Nós fazemos o trabalho pesado.
Nós abrimos as subsidiárias locais, garantimos as licenças, realizamos os testes de penetração, obtemos as certificações e nos alinhamos a cada nova regulamentação. Para lançar verificações em um novo país, basta ativar uma chave. Mais de 220 países ativos, auditados e testados trimestralmente, o único provedor de identidade que um governo de um estado membro da UE formalmente considerou mais seguro do que a verificação presencial.
Comece grátis. Pague pelo uso. Escale para Enterprise.
500 verificações gratuitas todo mês, para sempre. Depois, pague apenas quando um módulo for executado. Contratos personalizados, residência de dados e acordos de nível de serviço (SLAs) no plano Enterprise.
Grátis
$0/ mês · sem cartão
Para construir, testar e para seus primeiros usuários.
Tudo o que você precisa para começar:
500 verificações KYC completas todo mês
ID, prova de vida, face match, dispositivo e IP
Mais de 200 sinais de fraude, blocklist, duplicatas
KYC reutilizável em toda a rede Didit
Construtor de fluxo de trabalho, gerenciamento de casos, SDKs
Suporte de IAAgente de IA no console, documentação e comunidade.