Skip to main content
Didit Raises $7.5M to Build the Infrastructure for Identity and Fraud
Didit
EUDI Wallet · eIDAS 2

Get ready to accept the
EU Digital Identity Wallet.

Every EU Member State must offer an EU Digital Identity (EUDI) Wallet by 24 December 2026, and regulated businesses must accept it by 24 December 2027. Didit runs five national electronic IDs (eIDs) today, and EUDI Wallet acceptance is coming soon to the same workflow.

Backed by
Y CombinatorRobinhood Ventures
Firecrawl
Slash
Crnogorski Telekom
UCSF Neuroscape
Bit2Me

Trusted by 3,000+ organizations worldwide.

What the EUDI Wallet is

One wallet per person.
Only the data you ask for.

The EUDI Wallet is a free app that every EU Member State must offer under Regulation (EU) 2024/1183, known as eIDAS 2. It holds person identification data (PID), meaning name, date and place of birth and nationality, plus electronic attestations of attributes such as a driving licence or a diploma. Using it is voluntary.

When a business asks for data, the person sees who is asking and shares only the attributes requested. This is called selective disclosure: a site can learn that someone is over 18 without seeing a birth date. The wallet works at assurance level high, the strongest of the three eIDAS levels, and the business checks the issuer signature before it relies on the data.

Last reviewed: 5 October 2026. Not legal advice.

Key dates

Wallets by the end of 2026. Acceptance by 24 December 2027.

These are the dates in Regulation (EU) 2024/1183 and its implementing acts that a business should plan around.
  1. 30 April 2024

    eIDAS 2 published

    Regulation (EU) 2024/1183, which amends the eIDAS Regulation (EU) No 910/2014, appears in the Official Journal of the EU. It enters into force on the twentieth day after publication.

  2. 24 December 2024

    First wallet rules in force

    The first five implementing regulations for the wallet enter into force: person identification data, core functions, notifications, certification, and protocols and interfaces. They start the 24-month and 36-month clocks below.

  3. 15 July 2026

    Wallet rules updated

    The Commission adopts Implementing Regulation (EU) 2026/1731. It sets the two credential formats, SD-JWT VC and ISO/IEC mdoc, and schedules the mandatory portrait for 2028.

  4. 23 July 2026

    ARF v3.0.0

    The Architecture and Reference Framework (ARF), the technical blueprint that wallets and relying parties build on, reaches version 3.0.0.

  5. 24 December 2026

    Wallets in every Member State

    Each Member State must provide at least one EUDI Wallet. The rules for registering relying parties, Implementing Regulation (EU) 2025/848, apply from the same day.

  6. 24 December 2027

    Private businesses must accept it

    Private businesses that must use strong user authentication by law or by contract, other than micro and small enterprises, must accept the wallet when a user asks to use it (Article 5f(2)). That deadline is 36 months after the first implementing acts entered into force on 24 December 2024, so by 24 December 2027.

  7. 11 August 2028

    Portrait and registration checks

    The portrait becomes part of the mandatory person identification data, and wallets must authenticate and validate the registration certificate of each relying party.

Who must accept it

Who has to accept the wallet, and when.

Article 5f of the eIDAS Regulation, as amended by Regulation (EU) 2024/1183, sets the acceptance duties. In every case the user chooses to use the wallet, and you keep your other ways to identify people.

Who

Public sector bodies

What it means, in plain English

Where a Member State requires electronic identification to access a public online service, that service must also accept the EUDI Wallet.

Article · date

Art. 5f(1)

Who

Private services that must use strong user authentication

What it means, in plain English

If a law or a contract requires you to use strong user authentication for online identification, you must also accept the EUDI Wallet. The trigger is that requirement, not your sector.

Article · date

Art. 5f(2) · 24 Dec 2027

Who

Areas the article names

What it means, in plain English

Transport, energy, banking, financial services, social security, health, drinking water, postal services, digital infrastructure, education and telecommunications. The article says “including”, so the list gives examples and is not closed.

Article · date

Art. 5f(2)

Who

Micro and small enterprises

What it means, in plain English

Exempt from the private-sector duty, as defined in Commission Recommendation 2003/361/EC. They may still accept the wallet if they choose to.

Article · date

Art. 5f(2)

Who

Only at the user's request

What it means, in plain English

Acceptance is due when the user asks to use the wallet. Using it is voluntary for people, and services must stay open to other identification and authentication means.

Article · date

Arts. 5f(2), 5a(15)

Who

Very large online platforms

What it means, in plain English

Platforms designated under the Digital Services Act that require user authentication must accept the wallet at the user's request, for the minimum data the service needs. The text sets no separate date for this duty.

Article · date

Art. 5f(3)

Relying parties must also register in the Member State where they are established, and may request only the data they registered (Article 5b). Last reviewed: 5 October 2026. Not legal advice.

How a business accepts it

How a relying party accepts the EUDI Wallet, in five steps.

Step 01 / 05

Register as a relying party

Register in the Member State where you are established, with your details and the data you intend to request. You receive an access certificate, which authenticates you to the wallet, and, where your Member State issues one, a registration certificate that lists the attributes you registered.

Didit will run these steps for you when EUDI Wallet acceptance launches (coming soon).

What you receive vs what KYC still needs

The wallet proves who someone is. Due diligence needs more.

Under the Anti-Money Laundering Regulation (AMLR), Regulation (EU) 2024/1624, electronic identification at assurance level substantial or high is one of the two ways to verify identity (Article 22(6)). It does not carry everything know your customer (KYC) checks ask for. Here is what the person identification data (PID) holds, and how Didit covers each item today.

Due diligence needs

All names and surnames

AMLR Art. 22(1)(a)

In the EUDI Wallet PID

Family name and given name, both mandatory.

How Didit covers it today

Live national eIDs return the full name. The document route reads it from 14,000+ document types.

Due diligence needs

Place and full date of birth

AMLR Art. 22(1)(a)

In the EUDI Wallet PID

Date of birth and place of birth, both mandatory.

How Didit covers it today

Live national eIDs return the date of birth. The document route reads the place of birth where the document prints it.

Due diligence needs

Nationalities

AMLR Art. 22(1)(a)

In the EUDI Wallet PID

Nationality, mandatory, one or more countries.

How Didit covers it today

The document route reads the nationality from the identity document or its chip.

Due diligence needs

National identification number, where applicable

AMLR Art. 22(1)(a)

In the EUDI Wallet PID

Personal administrative number, optional. Each Member State decides whether to issue it.

How Didit covers it today

Live national eIDs return a scheme identifier: the Swedish personnummer, the Finnish personal identity code or the Baltic personal code. MitID returns a pseudonymised identifier, not the CPR number.

Due diligence needs

Usual place of residence

AMLR Art. 22(1)(a)

In the EUDI Wallet PID

Address fields are optional and often missing. AMLA's final draft standards say missing attributes must be obtained through other means.

How Didit covers it today

No live national eID returns an address. Proof of Address checks a utility bill, bank statement or government letter.

Due diligence needs

Tax identification number, where available

AMLR Art. 22(1)(a)

In the EUDI Wallet PID

Not part of the PID.

How Didit covers it today

Collect it with a questionnaire step in the same workflow.

Due diligence needs

The person matches the identity

ARF · user binding

In the EUDI Wallet PID

The portrait stays optional until it becomes mandatory on 11 August 2028.

How Didit covers it today

Passive liveness and a 1:1 face match against the document photo or the chip portrait, inside the full KYC check at $0.33.

Due diligence needs

Beneficial owners of a company

AMLR Art. 20(1)(b)

In the EUDI Wallet PID

Not in the PID. A wallet identifies a person, not who owns a company.

How Didit covers it today

Business Verification pulls registry data and owners where the registry holds them, with an identity check for each owner.

Due diligence needs

Sanctions and politically exposed persons (PEPs)

AMLR Art. 20(1)(d), (g)

In the EUDI Wallet PID

Not in the PID.

How Didit covers it today

AML Screening against 1,300+ sanctions, PEP and watchlists, at $0.20 per check.

Due diligence needs

Purpose of the relationship and ongoing monitoring

AMLR Arts. 25, 26

In the EUDI Wallet PID

Not in the PID.

How Didit covers it today

Questionnaires record the purpose of the relationship. Ongoing monitoring re-screens customers every day for $0.07 per person per year.

Customer due diligence stays your obligation. Didit supplies checks and evidence and does not make you compliant. AMLR applies from 10 July 2027, and AMLA's technical standards are a final draft dated 30 September 2026, not law.

Readiness by country

Where the national wallets stand, dated and sourced.

This is what each country has published, or what a named source reports, with the date and a link for every row.

Status as of October 5, 2026

Country

Italy

Wallet or app

IT-Wallet (app IO)

Status

Live app

Date

February 17, 2026

What is known

Live in the IO app, with 10.1 million activations and 17.3 million documents loaded by 17 February 2026. Free and optional for adults, who sign in with CIE or SPID.

Source: innovazione.gov.it

Country

Denmark

Wallet or app

AltID

Status

Live app

Date

August 4, 2026

What is known

AltID is live with a digital ID card and proof of age, and 281,390 people had created one by 4 August 2026. The Agency for Digital Government is implementing the wallet in stages.

Source: digst.dk

Country

France

Wallet or app

France Identité

Status

Live app

Date

No official date

What is known

According to Euronews, France is among the frontrunners, and the France Identité app is to be brought in line with the EUDI rules.

Source: Euronews

Country

Czechia

Wallet or app

eDoklady

Status

Live app

Date

No official date

What is known

According to NFCW, the eDoklady app launched as an intermediate step towards the EUDI Wallet.

Source: NFCW

Country

Germany

Wallet or app

EUDI-Wallet (BMDS)

Status

Sandbox

Date

January 2027

What is known

Public sandbox since December 2025. The app is due in early 2027, starting with the ID function. The implementing law had its first Bundestag reading on 23 September 2026.

Source: eudi-wallet.gov.de

Country

Spain

Wallet or app

Cartera Digital (Beta)

Status

Pilot

Date

2026

What is known

One of seven countries piloting the EU age verification solution inside the national wallet during 2026.

Source: ageverification.dev

Country

Greece

Wallet or app

Gov.gr Wallet

Status

Pilot

Date

2026

What is known

One of seven countries piloting the EU age verification solution inside the national wallet during 2026.

Source: ageverification.dev

Country

Ireland

Wallet or app

Government Digital Wallet

Status

Pilot

Date

2026

What is known

One of seven countries piloting the EU age verification solution inside the national wallet during 2026.

Source: ageverification.dev

Country

Cyprus

Wallet or app

National wallet

Status

Pilot

Date

2026

What is known

One of seven countries piloting the EU age verification solution inside the national wallet during 2026.

Source: ageverification.dev

Country

Slovakia

Wallet or app

National EUDI Wallet

Status

Pilot

Date

No official date

What is known

According to Euronews, the Slovak wallet is still in a private testing phase.

Source: Euronews

Country

Netherlands

Wallet or app

NL Wallet

Status

Planned

Date

No official date

What is known

The NL Wallet is under development and will become available once the national implementing law is adopted.

Source: nldigitalgovernment.nl

Country

Poland

Wallet or app

mObywatel

Status

Planned

Date

No official date

What is known

According to CHIP.pl, a pilot of the Polish EUDI Wallet is planned, as a separate app linked to mObywatel.

Source: CHIP.pl

Country

Finland

Wallet or app

National EUDI Wallet (DVV)

Status

Planned

Date

No official date

What is known

According to Euronews, Finland is among the frontrunners.

Source: Euronews

Country

Bulgaria

Wallet or app

National EUDI Wallet

Status

Planned

Date

No official date

What is known

According to Euronews, Bulgaria is among the frontrunners.

Source: Euronews

Country

Croatia

Wallet or app

Certilia

Status

Planned

Date

No official date

What is known

According to Euronews, the Certilia wallet is being rebuilt to the EU technical framework.

Source: Euronews

Country

Romania

Wallet or app

National EUDI Wallet

Status

Planned

Date

No official date

What is known

According to Euronews, Romania is fast-tracking its wallet through a private partnership.

Source: Euronews

Country

Sweden

Wallet or app

Digital identitetsplånbok (DIGG)

Status

Planned

Date

No official date

What is known

According to Euronews, Sweden has published a roadmap for its EUDI Wallet release.

Source: Euronews

Not listed: Austria, Belgium, Estonia, Hungary, Latvia, Lithuania, Luxembourg, Malta, Portugal, Slovenia. We found no public status for them on this date. We update this table as national apps launch.

How Didit gets you there · Five rows

Accept national eIDs now. Add the EUDI Wallet next.

The EUDI Wallet adds a route; it does not replace the others. Build the workflow once: national eIDs and documents today, and EUDI Wallet acceptance in the same ID Verification step when it launches.
01 · National eIDs, live

Accept the national eIDs your customers already use.

Five national eIDs are live on Didit across seven countries: MitID, BankID Sweden, Finnish Trust Network, Smart-ID and Mobile-ID. The user signs in with their eID, and the session receives signed attributes: full name, date of birth, a scheme identifier (for example the Swedish personnummer; MitID returns a pseudonymised identifier) and the level of assurance the scheme asserted. Only completed sign-ins are billed.
See eID verification
02 · EUDI Wallet, coming soon

EUDI Wallet acceptance, on the same workflow.

EUDI Wallet acceptance is coming soon. Our wallet catalog lists it for 30 EEA countries, in the same ID Verification step as the national eIDs. There is no date or price yet.
Talk to us
03 · Document route

A document route for everyone without a wallet.

Not everyone will have or use a wallet, and the law keeps other means open. The document route reads the chip in passports and ID cards by NFC ($0.15), runs passive liveness and matches the face to the document photo, across 14,000+ document types in 220+ countries and territories.
See NFC Verification
04 · Age verification

Prove age with the least data.

The EUDI Wallet can prove that someone is over 18 without a birth date. Until wallets are common, age estimation from a selfie costs $0.10 per check and sends borderline results to an ID verification fallback. A live eID sign-in also returns a signed date of birth without a document photo.
See age verification
05 · The rest of due diligence

Screening, monitoring and companies, in one place.

Identity is one part of customer due diligence. In the same workflow, screen people against 1,300+ sanctions, PEP and watchlists ($0.20 per check), re-screen them every day with ongoing monitoring ($0.07 per person per year), and verify companies and their owners.
See the AMLR solution
See the flow

What the person sees, in four screens.

A cross-device presentation as the ARF describes it: the person starts on a computer and finishes on the phone that holds the wallet.
  1. Scan the QR code

    The service shows a QR code, and the person scans it with the wallet app.

  2. Review the request

    The wallet shows who is asking and which attributes.

  3. Share

    The person approves, and only the requested attributes leave the phone.

  4. Verified

    The service checks the issuer signature and continues. Nothing else was shared.

An illustration of the standard flow. Didit's EUDI Wallet acceptance is coming soon.

Integrate today

Integrate today, and keep it when the wallet arrives.

There is no EUDI-specific Didit API yet. Create a session for a workflow that accepts the live national eIDs and documents, then read the result. EUDI Wallet acceptance is planned for the same ID Verification step.
POST /v3/session/Start the check
$ curl -X POST https://verification.didit.me/v3/session/ \
  -H "x-api-key: $DIDIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "workflow_id": "YOUR_EID_WORKFLOW_UUID",
    "vendor_data": "customer_8412"
  }'
201Created{ "url": "https://verify.didit.me/session/…" }
One session per customer. Your own reference comes back with every result.docs
GET /v3/session/{id}/decision/Read the result
{
  "id_verifications": [{
    "status": "Approved",
    "verification_method": "wallet",
    "assurance": "cryptographic",
    "wallet_provider": "mitid",
    "wallet_verification": {
      "issuing_country": "DNK",
      "level_of_assurance": "substantial",
      "signature_valid": true,
      "attributes": {
        "full_name": "Freja Nielsen",
        "date_of_birth": "1988-03-02"
      },
      "portrait": null
    }
  }]
}
200OKverification_method: "wallet"
A live eID sign-in returns signed attributes. No address and no portrait.docs
Agent-ready integration

Prepare for the EUDI Wallet in one prompt.

Copy this prompt into your coding agent. It builds the workflow you can run today, live national eIDs with a document fallback, plus the session call and the signed webhook. It invents no EUDI endpoint, because none exists yet.
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
Compliant by design

Open a new country in one click. We do the hard work.

We open the local subsidiaries, secure the licenses, run the penetration tests, earn the certifications, and align with every new regulation. To ship verifications in a new country, flip a toggle. 220+ countries live, audited and pen-tested every quarter, the only identity provider an EU member-state government has formally called safer than in-person verification.
Read the security & compliance dossier
SOC 2 · Type II — AICPA · 2026
SOC 2 · Type I — AICPA · 2026
ISO/IEC 27001 — Information security · 2026
EU financial sandbox — Tesoro · SEPBLAC · BdE
FIDO Alliance — Associate member · 2026
iBeta Level 1 PAD — NIST / NIAP · 2026
GDPR — EU 2016/679
HIPAA — 45 CFR §160 · §164
DORA — EU 2022/2554
MiCA — EU 2023/1114
EBA remote onboarding — EBA/GL/2022/15
AMLD6 · eIDAS 2.0 — EU-aligned by design
Jugendschutz geprüft — FSM · JMStV §4(2) · 2026

Proof numbers

Proof numbers
  • 3,000+
    Companies in production
  • 5
    National eIDs live on Didit
  • 30
    EEA countries in the EUDI Wallet rollout
  • 220+
    Countries and territories with the document route
Three tiers, one price list

Start free. Pay as you go. Scale to Enterprise.

500 free verifications every month, forever. Then pay only when a module runs. Custom contracts, data residency, and service level agreements (SLAs) on Enterprise.

Free

$0/ month · no card

For building, testing, and your first users.

Everything you need to start:
  • 500 full KYC verifications every month
  • ID, liveness, face match, device & IP
  • 200+ fraud signals, blocklist, duplicates
  • Reusable KYC across the Didit network
  • Workflow builder, case management, SDKs
  • AI support In-console AI agent, docs, and community.
Most popular

Pay as you go

$0.33per full KYC

25+ modules, publicly priced. Automatic volume discounts.

Everything in Free, plus:
  • AML screening and monitoring from $0.07
  • Business registry pricing by country and data tier
  • Transaction monitoring at $0.02 each
  • Wallet screening at $0.15 per check
  • White-label flow under your own brand
  • AI support In-console AI agent, docs, and community.

Enterprise

Customannual contract

For large volumes and regulated programs.

Everything in Pay as you go, plus:
  • Annual contracts, committed-volume pricing
  • Custom legal terms and a 99.99% uptime SLA
  • Data residency, retention, security review
  • Manual reviewers on demand
  • Reseller and white-label terms
  • Priority human support 24/7 shared Slack channel, named success manager.

Volume discounts apply automatically as usage grows — no negotiation, no sales call.

FAQ

EUDI Wallet questions, answered

Last reviewed: 5 October 2026. Not legal advice.
What is Didit?

Didit is infrastructure for identity and fraud, the platform we wished existed when we were building products ourselves: open, flexible, and developer-friendly, so it works as a real part of your stack instead of a black box you integrate around.

One API covers verifying people (KYC, know your customer), verifying businesses (KYB, know your business), screening crypto wallets (KYT, know your transaction), and monitoring transactions in real time, on a stack built to be:

  • Fast, sub-2-second p99 on every session
  • Reliable, in production with 3,000+ companies across 220+ countries
  • Secure, SOC 2 Type 1 & Type 2, ISO 27001, GDPR-native, and formally attested by Spain's financial regulator as safer than verifying someone in person

The footprint underneath: 14,000+ document types in 48+ languages, 1,000+ data sources, and 200+ fraud signals on every session. The Didit infrastructure dynamically learns from every session and gets better every day.

What is the EUDI Wallet?

The EU Digital Identity (EUDI) Wallet is an app that every EU Member State must offer under Regulation (EU) 2024/1183, known as eIDAS 2, which amends the eIDAS Regulation (EU) No 910/2014. The law defines it as an electronic identification means that lets a person store, manage and validate person identification data (PID) and electronic attestations of attributes, share them with relying parties, and sign with a qualified electronic signature.

Three properties matter for a business:

  • It is free for people to get, use and revoke (Article 5a(13)).
  • It is voluntary, and services must stay open to other means (Article 5a(15)).
  • It is provided under an eID scheme at assurance level high (Article 5a(11)).

A national eID app is not automatically an EUDI Wallet. A wallet must meet the EUDI rules and be certified under Article 5c before it counts as one.

When will EUDI Wallets be available?

Each Member State must provide at least one EUDI Wallet within 24 months of the entry into force of the first implementing acts, which entered into force on 24 December 2024. That puts the deadline at 24 December 2026.

Where things stand on 5 October 2026:

  • Italy's IT-Wallet passed 10.1 million activations by 17 February 2026, and Denmark's AltID is live with a digital ID card and proof of age. They are the most advanced national apps.
  • Germany runs a public sandbox, and its wallet app is due in early 2027.

The date follows from the entry into force of the implementing acts, not from the publication of eIDAS 2 itself. Several national apps will arrive on different dates, so the readiness table on this page shows each country with a date and a source.

Do we have to accept the EUDI Wallet, and from when?

If a law or a contract requires your business to use strong user authentication for online identification, then yes. Under Article 5f(2), private relying parties in that position must accept the EUDI Wallet when a user asks to use it, no later than 24 December 2027, 36 months after the first implementing acts entered into force.

The article names areas as examples: transport, energy, banking, financial services, social security, health, drinking water, postal services, digital infrastructure, education and telecommunications. The list is not closed, because the test is the authentication requirement, not the sector.

Public sector services that require electronic identification must accept the wallet too (Article 5f(1)). Very large online platforms that require user authentication must accept it at the user's request, for the minimum data needed (Article 5f(3)). The text gives that duty no separate date.

This is a summary, not legal advice.

Are small businesses exempt?

Yes. Article 5f(2) excludes microenterprises and small enterprises, as defined in Article 2 of the Annex to Commission Recommendation 2003/361/EC, which sets the headcount and turnover thresholds. Check your size against that Recommendation.

The exemption covers the duty to accept, not the option to accept. A small business may still accept the wallet, for example to offer a faster sign-up or an age check that shares no birth date.

Two things do not change with size:

  • If you rely on the wallet, you register as a relying party in the Member State where you are established (Article 5b(1)).
  • If you are an obliged entity under the EU anti-money laundering rules, you still verify customers. From 10 July 2027, AMLR Article 22(6) allows electronic identification at assurance level substantial or high as one of the two routes.

This is a summary, not legal advice.

What is a relying party, and how do we register?

A relying party is any business or public body that relies on the EUDI Wallet to identify a user or to check an attribute. Under Article 5b(1), a relying party must register in the Member State where it is established. The registration states who you are, your contact details and the intended use, including the data you plan to request, and you may not request anything else (Article 5b(3)).

The rules on registration, Implementing Regulation (EU) 2025/848, apply from 24 December 2026. After registering you receive:

  • an access certificate, which authenticates you to the wallet, and
  • where your Member State issues one, a registration certificate that lists the attributes you registered.

Intermediaries acting on behalf of relying parties are treated as relying parties and may not store data about the content of the transaction (Article 5b(10)). Germany, for example, describes one access and registration certificate per organisation and use case.

What data can we request from the wallet?

Only the attributes you registered for, and the user decides what to share. The PID has mandatory attributes: family name, given name, date of birth, place of birth and nationality, plus the expiry date, issuing authority and issuing country. Optional attributes include the portrait, sex, address fields and a personal administrative number, and each Member State chooses which ones it issues.

Beyond the PID, the wallet holds electronic attestations of attributes, for example a driving licence, a diploma or a proof of age. Member States must also make a minimum list of attributes verifiable against authentic sources, including address, age, nationality and professional qualifications (Annex VI).

With selective disclosure, you receive only what the user approves, signed by the issuer, with the metadata needed to check validity. Asking for less means less personal data to protect.

Is the EUDI Wallet enough for KYC under AMLR?

For identity verification, it can be. AMLR Article 22(6)(b) allows verification with electronic identification means at assurance level substantial or high, and the EUDI Wallet works at level high. AMLA's final draft standards on customer due diligence (30 September 2026, a final draft sent to the Commission, not law) say eID means should be used wherever possible, and they include EUDI Wallets.

It is not the whole of due diligence:

  • Address and tax identification number are often missing from the PID. The draft standards say you must obtain missing attributes through other means.
  • Beneficial owners, sanctions and PEP screening, the purpose of the relationship and ongoing monitoring are separate duties (AMLR Articles 20, 25 and 26).

Didit covers those parts today: Proof of Address, questionnaires, Business Verification, AML Screening at $0.20 per check and ongoing monitoring at $0.07 per person per year.

Which protocols does the EUDI Wallet use (OpenID4VP, SD-JWT VC, mdoc)?

Three layers:

  • Credential formats. The PID is issued as an SD-JWT VC (Selectively Disclosable JSON Web Token Verifiable Credential) and as an ISO/IEC 18013-5 mdoc, the format of mobile driving licences. Both hide undisclosed values behind salted hashes. SD-JWT VC is for remote use; the mdoc also covers in-person checks.
  • Presentation. Online, a relying party requests data with OpenID for Verifiable Presentations (OpenID4VP) under the High Assurance Interoperability Profile (HAIP), or with ISO/IEC 18013-7, over a redirect or the W3C Digital Credentials API. In person, ISO/IEC 18013-5 starts with a QR code or NFC and continues over Bluetooth, NFC or Wi-Fi Aware.
  • Issuance. Wallets receive credentials through OpenID4VCI.

The Architecture and Reference Framework (ARF) v3.0.0, released on 23 July 2026, describes the whole stack.

Can the EUDI Wallet prove age without sharing a birth date?

Yes. With selective disclosure the wallet can share only that the person is over 18. The Dutch government describes it this way: you share only whether someone is over 18, and you do not need to provide a date of birth.

The EU also has an age verification blueprint, a stand-alone app or a wallet feature, released in July 2025 and updated in October 2025. Its proof of age contains no identity data, proofs are issued in batches for one-time use, and the issuer is not told where a proof is used. In April 2026 the Commission urged Member States to make the app available by the end of the year, and Denmark, France, Greece, Italy and Spain were the first to take it up.

For platforms under the Digital Services Act, the Commission guidelines on minors (July 2025) favour age verification for 18+ content and treat facial age estimation there as a temporary bridge.

Is there a face photo in the wallet, and can we face-match against it?

Not reliably before 11 August 2028. Under Implementing Regulation (EU) 2026/1731, the portrait becomes part of the mandatory PID only from that date. Until then it is optional, and each Member State decides whether to include it. Sharing the portrait will also require selective disclosure, warnings to the user and logging.

The ARF calls the check that the person presenting the credential is its rightful holder user binding. In some flows the relying party performs it; in others it relies on the checks of the wallet itself.

So for now, plan a selfie step when your policy needs a face match: passive liveness plus a 1:1 face match against a document photo or the chip portrait read by NFC. On Didit that is part of the full KYC check at $0.33. None of the five live national eIDs returns a portrait either.

Which countries have a wallet today?

As of 5 October 2026, several national apps are live or in testing:

  • Italy: IT-Wallet in the IO app, with 10.1 million activations by 17 February 2026.
  • Denmark: AltID, live with a digital ID card and proof of age, created by 281,390 people by 4 August 2026.
  • Germany: a public sandbox since December 2025, with the app due in early 2027.
  • Netherlands: the NL Wallet is in development and waits for the national implementing law.
  • Spain, Greece, Ireland and Cyprus, with Denmark, France and Italy, are piloting the EU age verification solution in their national wallets during 2026.

The readiness table on this page lists every country with a public status we found, with the date and the source of each row.

Does Didit accept the EUDI Wallet today?

Not yet. EUDI Wallet acceptance is coming soon on Didit. Our wallet catalog lists it for 30 EEA countries, and it is planned for the same ID Verification step you configure today. We give no date or price before it is live.

What works now:

  • Five national eIDs are live: MitID (Denmark), BankID Sweden, Finnish Trust Network (Finland), Smart-ID (Estonia, Latvia, Lithuania, Belgium) and Mobile-ID (Estonia, Lithuania). They return the full name, date of birth, a scheme identifier (for example the Swedish personnummer; MitID returns a pseudonymised identifier) and the level of assurance, with a signature check. Only completed sign-ins are billed.
  • Documents as the fallback: chip reading by NFC, passive liveness and face match, across 14,000+ document types.

A workflow built on these today keeps working when EUDI Wallet acceptance arrives. Talk to us if the wallet matters for your launch plan.

What does accepting the EUDI Wallet cost?

For people, the wallet is free: issuing, using and revoking it costs nothing (Article 5a(13)). For businesses, the picture is different:

  • The regulation does not rule out fees for relying parties. Registration must be cost-effective and proportionate to risk (Article 5b(2)), and each Member State sets up its own registration and certificate process, so any fee depends on where you are established.
  • Running a verifier, checking the trusted lists and keeping the evidence is your own engineering cost, or the price a provider charges.

Didit will publish its price for EUDI Wallet acceptance on the pricing page when the feature is live. Today the pricing page shows the published price of every live check, for example the full KYC check at $0.33 and AML Screening at $0.20.

How do we prepare now?

Five steps that pay off before the wallet arrives:

  • Check whether Article 5f(2) applies to you: a legal or contractual duty to use strong user authentication, and not a micro or small enterprise.
  • List the attributes you really need for each use case. Your registration will limit you to them, so an age gate needs age over 18, not a full identity.
  • Plan the gaps: the PID always carries name, date of birth, place of birth and nationality. Address and other attributes are optional and may be missing, and tax number, beneficial owners, screening and monitoring are outside the PID.
  • Accept national eIDs now where your customers have them, and keep a document route for everyone else. On Didit, five national eIDs are live, and EUDI Wallet acceptance is coming soon to the same step.
  • Watch your Member State: the registration rules apply from 24 December 2026, and national apps launch on different dates.

Last reviewed: 5 October 2026. Not legal advice.

Infrastructure for identity and fraud.

One API for KYC, KYB, Transaction Monitoring, and Wallet Screening. Integrate in 5 minutes.

Ask an AI to summarise this page