Prepare-se para aceitar a Carteira Europeia de Identidade Digital.
Todos os Estados-Membros da UE devem oferecer uma Carteira Europeia de Identidade Digital (EUDI) até 24 de dezembro de 2026, e as empresas reguladas 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.
EUDI WalletAtestado de ID e idade
Loja online pedeIdade superior a 18
Apelido
Nome próprio
Data de nascimento
Local de nascimento
Nacionalidade
Idade superior a 18
Partilhar 1 atributo
Parte dependenteLoja 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 solicitar.
A EUDI Wallet é uma aplicação gratuita que todos os Estados-Membros da UE devem oferecer ao abrigo do Regulamento (UE) 2024/1183, conhecido como eIDAS 2. Contém 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 carta de condução ou diploma. A sua utilização é voluntária.
Quando uma empresa solicita dados, a pessoa vê quem está a solicitar e partilha apenas os atributos pedidos. Isto é chamado de divulgação seletiva: um site pode saber que alguém tem mais de 18 anos sem ver a data de nascimento. A carteira funciona com um nível de garantia elevado, 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 constitui aconselhamento jurídico.
Datas importantes
Carteiras até ao final de 2026. Aceitação até 24 de dezembro de 2027.
Estas são as datas do Regulamento (UE) 2024/1183 e dos seus atos de execução que as empresas devem ter em conta no seu planeamento.
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. 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 execução para a carteira entram em vigor: dados de identificação pessoal, funções essenciais, notificações, certificação e protocolos e interfaces. Estes 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. Este estabelece os dois formatos de credenciais, 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 Quadro de Arquitetura e Referência (ARF), o modelo técnico em que as carteiras e as partes que confiam 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 registo das partes que confiam, Regulamento de Execução (UE) 2025/848, aplicam-se a partir da mesma data.
24 de dezembro de 2027
Empresas privadas devem aceitá-la
As empresas privadas que devem utilizar autenticação forte do utilizador por lei ou por contrato, exceto as micro e pequenas empresas, devem aceitar a carteira quando um utilizador solicitar a sua utilização (Artigo 5.º-F, n.º 2). Esse prazo é de 36 meses após a entrada em vigor dos primeiros atos de execução, a 24 de dezembro de 2024, ou seja, até 24 de dezembro de 2027.
11 de agosto de 2028
Retrato e verificações de registo
O retrato passa a fazer parte dos dados de identificação pessoal obrigatórios, e as carteiras devem autenticar e validar o certificado de registo de cada parte que confia.
Quem deve aceitá-la
Quem tem de aceitar a carteira, e quando.
O Artigo 5.º-F do Regulamento eIDAS, conforme alterado pelo Regulamento (UE) 2024/1183, estabelece os deveres de aceitação. Em todos os casos, o utilizador escolhe usar a carteira, e mantém as suas outras formas de identificar pessoas.
Quem
O que significa, em linguagem simples
Artigo · data
Quem
Organismos do setor público
O que significa, em linguagem simples
Sempre que um Estado-Membro exija identificação eletrónica para aceder a um serviço público online, esse serviço deve também aceitar a Carteira EUDI.
Artigo · data
Art. 5f(1)
Quem
Serviços privados que devem usar autenticação forte do utilizador
O que significa, em linguagem simples
Se uma lei ou um contrato exigir que utilize autenticação forte do utilizador para identificação online, deve também aceitar a Carteira EUDI. O fator decisivo é essa exigência, não o seu setor.
Artigo · data
Art. 5f(2) · 24 Dez 2027
Quem
Áreas mencionadas no artigo
O que significa, em linguagem simples
Transportes, energia, banca, serviços financeiros, segurança social, saúde, água potável, serviços postais, infraestruturas digitais, educação e telecomunicações. O artigo refere “incluindo”, pelo que a lista apresenta exemplos e não é exaustiva.
Artigo · data
Art. 5f(2)
Quem
Micro e pequenas empresas
O que significa, em linguagem simples
Isentas da obrigação do setor privado, conforme definido na Recomendação 2003/361/CE da Comissão. Podem, ainda assim, aceitar a carteira se assim o desejarem.
Artigo · data
Art. 5f(2)
Quem
Apenas a pedido do utilizador
O que significa, em linguagem simples
A aceitação é devida quando o utilizador solicita a utilização da carteira. A sua utilização é voluntária 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 de muito grande dimensão
O que significa, em linguagem simples
As plataformas designadas ao abrigo do Regulamento dos Serviços Digitais que exigem autenticação do utilizador devem aceitar a carteira a pedido do utilizador, para os dados mínimos de que o serviço necessita. O texto não estabelece uma data separada para esta obrigação.
Artigo · data
Art. 5f(3)
As partes que confiam nos dados devem também registar-se no Estado-Membro onde estão estabelecidas, e só podem solicitar os dados que registaram (Artigo 5b). Última revisão: 5 de outubro de 2026. Não constitui aconselhamento jurídico.
Como uma empresa a aceita
Como uma parte que confia nos dados aceita a Carteira EUDI, em cinco passos.
Passo 01 / 05
01
Registar-se como parte que confia nos dados
Registe-se no Estado-Membro onde está estabelecido, com os seus dados e os dados que pretende solicitar. Receberá um certificado de acesso, que o autentica na carteira, e, se o seu Estado-Membro o emitir, um certificado de registo que lista os atributos que registou.
Solicite apenas o que precisa
Peça atributos específicos, por exemplo, idade superior a 18 anos, com OpenID for Verifiable Presentations (OpenID4VP) e uma consulta Digital Credentials Query Language (DCQL), ou com ISO/IEC 18013-7. Não pode solicitar dados além do seu registo.
O utilizador consente na carteira
No mesmo telemóvel, o navegador transfere para a aplicação da carteira. Num computador, o utilizador digitaliza um código QR. A carteira mostra quem está a pedir, verifica se não está a pedir mais do que o que registou, e o utilizador aprova ou recusa.
Verificar a apresentação
Verifique a assinatura do emissor em relação às listas de confiança, verifique se a credencial não foi revogada e verifique a vinculação do dispositivo, que mostra que a credencial não foi copiada ou reproduzida.
Receber os atributos e decidir
Recebe apenas os atributos que o utilizador partilhou, assinados pelo emissor. A decisão de integração ou acesso, e o registo que mantém, ficam consigo.
A Didit executará estes passos por si quando a aceitação da Carteira EUDI for lançada (em breve).
O que recebe vs. o que o KYC ainda precisa
A carteira prova quem alguém é. A devida diligência precisa de mais.
Ao abrigo do Regulamento Anti-Branqueamento de Capitais (AMLR), Regulamento (UE) 2024/1624, a identificação eletrónica com nível de garantia substancial ou elevado é uma das duas formas de verificar a identidade (Artigo 22.º, n.º 6). Não abrange tudo o que as verificações de conhecimento do cliente (KYC) exigem. Eis o que os dados de identificação pessoal (PID) contêm e como a Didit cobre cada item hoje.
Necessidades de devida diligência
Na PID da Carteira EUDI
Como a Didit o cobre hoje
Necessidades de devida diligência
Todos os nomes e apelidos
AMLR Art. 22(1)(a)
Na PID da Carteira EUDI
Apelido e nome próprio, ambos obrigatórios.
Como a Didit o cobre hoje
Os eIDs nacionais em tempo real devolvem o nome completo. A rota de documentos lê-o de mais de 14.000 tipos de documentos.
Necessidades de devida diligência
Local e data completa de nascimento
AMLR Art. 22(1)(a)
Na PID da Carteira EUDI
Data de nascimento e local de nascimento, ambos obrigatórios.
Como a Didit o cobre hoje
Os eIDs nacionais em tempo real devolvem a data de nascimento. A rota de documentos lê o local de nascimento onde o documento o imprime.
Necessidades de devida diligência
Nacionalidades
AMLR Art. 22(1)(a)
Na PID da Carteira EUDI
Nacionalidade, obrigatória, um ou mais países.
Como a Didit o cobre hoje
A rota de documentos lê a nacionalidade do documento de identidade ou do seu chip.
Necessidades de devida diligência
Número de identificação nacional, quando aplicável
AMLR Art. 22(1)(a)
Na PID da Carteira EUDI
Número administrativo pessoal, opcional. Cada Estado-Membro decide se o emite.
Como a Didit o cobre hoje
Os eIDs nacionais em tempo real devolvem um identificador do sistema: o personnummer sueco, o código de identidade pessoal finlandês ou o código pessoal báltico. O MitID devolve um identificador pseudonimizado, não o número CPR.
Necessidades de devida diligência
Local de residência habitual
AMLR Art. 22(1)(a)
Na PID da Carteira EUDI
Os campos de endereço são opcionais e muitas vezes ausentes. Os padrões finais da AMLA indicam que os atributos em falta devem ser obtidos por outros meios.
Como a Didit o cobre hoje
Nenhum eID nacional em tempo real devolve um endereço. A verificação de comprovativo de morada verifica uma fatura de serviços, extrato bancário ou carta governamental.
Necessidades de devida diligência
Número de identificação fiscal, quando disponível
AMLR Art. 22(1)(a)
Na PID da Carteira EUDI
Não faz parte do PID.
Como a Didit o cobre hoje
Recolha-o com um passo de questionário no mesmo fluxo de trabalho.
Necessidades de devida diligência
A pessoa corresponde à identidade
ARF · vinculação do utilizador
Na PID da Carteira EUDI
O retrato permanece opcional até se tornar obrigatório a 11 de agosto de 2028.
Como a Didit o cobre hoje
Liveness 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 devida diligência
Beneficiários efetivos de uma empresa
AMLR Art. 20(1)(b)
Na PID da Carteira EUDI
Não no PID. Uma carteira identifica uma pessoa, não quem é o proprietário de uma empresa.
Como a Didit o cobre hoje
A Verificação de Negócios obtém dados de registo e proprietários onde o registo os detém, com uma verificação de identidade para cada proprietário.
Necessidades de devida diligência
Sanções e pessoas politicamente expostas (PEPs)
AMLR Art. 20(1)(d), (g)
Na PID da Carteira EUDI
Não no PID.
Como a Didit o cobre hoje
Rastreio AML contra mais de 1.300 sanções, PEP e listas de vigilância, por $0.20 por verificação.
Necessidades de devida diligência
Finalidade da relação e monitorização contínua
AMLR Arts. 25, 26
Na PID da Carteira EUDI
Não no PID.
Como a Didit o cobre hoje
Os questionários registam a finalidade da relação. A monitorização contínua reavalia os clientes diariamente por $0.07 por pessoa por ano.
A diligência devida do cliente continua a ser sua obrigação. A Didit fornece verificações e provas, mas não garante a sua conformidade. O AMLR aplica-se a partir de 10 de julho de 2027, e as normas técnicas do AMLA são um rascunho final datado de 30 de setembro de 2026, não sendo ainda lei.
Prontidão por país
O ponto de situação das carteiras nacionais, com datas e fontes.
Isto é o que cada país publicou, ou o que uma fonte nomeada reporta, com a data e um link para cada linha.
Estado a 5 de outubro de 2026
País
Carteira ou app
Estado
Data
O que se sabe
País
Itália
Carteira ou app
IT-Wallet (app IO)
Estado
App ativa
Data
17 de fevereiro de 2026
O que se sabe
Ativa na app IO, com 10,1 milhões de ativações e 17,3 milhões de documentos carregados até 17 de fevereiro de 2026. Gratuita e opcional para adultos, que iniciam sessão com CIE ou SPID.
O AltID está disponível com um cartão 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 a Digitalização está a implementar a carteira por fases.
Sandbox pública desde dezembro de 2025. A app deverá ser lançada no início de 2027, começando com a função de ID. A lei de implementação teve a sua primeira leitura no Bundestag a 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 encontrámos nenhum estado público para estes países nesta data. Atualizamos esta tabela à medida que as apps nacionais são lançadas.
Como a Didit o ajuda a chegar lá · Cinco linhas
Aceite eIDs nacionais agora. Adicione a EUDI Wallet a seguir.
A Carteira EUDI adiciona um caminho, mas não substitui os outros. Crie o fluxo de trabalho uma única vez: eIDs e documentos nacionais hoje, e a aceitação da Carteira EUDI no mesmo passo de Verificação de Identidade quando for lançada.
Aceite os eIDs nacionais que os seus clientes já usam.
Cinco eIDs nacionais estão ativas na Didit em sete países: MitID, BankID Suécia, Finnish Trust Network, Smart-ID e Mobile-ID. O utilizador inicia sessão com o seu eID, e a sessão recebe atributos assinados: nome completo, data de nascimento, um identificador do sistema (por exemplo, o personnummer sueco; o MitID devolve um identificador pseudonimizado) e o nível de garantia afirmado pelo sistema. Apenas os inícios de sessão concluídos são faturados.
Níveis conforme rotulados pela Didit. Não são devolvidos o endereço ou o retrato.
02 · Carteira EUDI, em breve
Aceitação da Carteira EUDI, no mesmo fluxo de trabalho.
A aceitação da EUDI Wallet estará disponível em breve. O nosso catálogo de carteiras lista-a para 30 países do EEE, no mesmo passo de Verificação de Identidade que os eIDs nacionais. Ainda não há data nem preço definidos.
Ainda sem data ou preço para a aceitação da EUDI Wallet.
03 · Via de documento
Uma via 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 via de documento lê o chip em passaportes e cartões de identificação por NFC ($0.15), executa a 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 provar que alguém tem mais de 18 anos sem uma data de nascimento. Até que as carteiras sejam 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 identidade. Um início de sessão eID ativa também devolve uma data de nascimento assinada sem uma foto do documento.
A identidade é uma parte da diligência devida do cliente. No mesmo fluxo de trabalho, faça a triagem de pessoas contra mais de 1.300 sanções, PEP e listas de vigilância ($0.20 por verificação), faça a re-triagem diária com monitorização contínua ($0.07 por pessoa por ano), e verifique empresas e os seus proprietários.
Uma apresentação entre dispositivos, como o ARF descreve: a pessoa começa num computador e termina no telemóvel que contém a carteira.
01Digitalizar para continuar
Digitalize o código QR
O serviço mostra um código QR, e a pessoa digitaliza-o com a aplicação da carteira.
02Loja online pede: idade superior a 18
Reveja o pedido
A carteira mostra quem está a pedir e quais os atributos.
03Partilhar 1 atributo
Partilhar
A pessoa aprova, e apenas os atributos solicitados saem do telemóvel.
04Verificado
Verificado
O serviço verifica a assinatura do emissor e continua. Nada mais foi partilhado.
Uma ilustração do fluxo padrão. A aceitação da Carteira EUDI da Didit estará disponível em breve.
Integre hoje
Integre hoje e mantenha-o 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 os eIDs e documentos nacionais em tempo real e, em seguida, leia o resultado. A aceitação da EUDI Wallet está planeada para a mesma etapa de Verificação de ID.
Prepare-se para a EUDI Wallet com um único prompt.
Copie este prompt para o seu agente de codificação. Ele cria o fluxo de trabalho que pode executar hoje, eIDs nacionais em tempo real com um fallback de documento, além da chamada de sessão e do webhook assinado. Não inventa nenhum endpoint EUDI, porque ainda não existe nenhum.
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 desde a conceção
Abra um novo país com um clique. Nós fazemos o trabalho difícil.
Abrimos as subsidiárias locais, garantimos as licenças, realizamos os testes de penetração, obtemos as certificações e alinhamos com cada nova regulamentação. Para lançar verificações num novo país, basta ativar um botão. Mais de 220 países ativos, auditados e testados trimestralmente, o único fornecedor 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 à medida que usa. Escale para Enterprise.
500 verificações gratuitas todos os meses, 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 os seus primeiros utilizadores.
Tudo o que precisa para começar:
500 verificações KYC completas por mês
ID, prova de vida, correspondência facial, dispositivo e IP
Mais de 200 sinais de fraude, blocklist, duplicados
KYC reutilizável em toda a rede Didit
Construtor de fluxos de trabalho, gestão de casos, SDKs
Apoio de IAAgente de IA na consola, documentação e comunidade.