Zum Hauptinhalt springen
Didit erhält 7,5 Mio. $ für die Infrastruktur für Identität und Betrug
Didit
Digitale ID-Wallets

Lass Leute sich mit
ihrer vorhandenen ID anmelden.

Verifiziere Menschen mit einer elektronischen Identität (eID), die sie bereits nutzen. Akzeptiere MitID, BankID Schweden, Finnish Trust Network, Smart-ID und Mobile-ID in einem Workflow, mit Dokumenten-Fallback bei Bedarf.

Unterstützt von
Y CombinatorRobinhood Ventures
Firecrawl
Slash
Crnogorski Telekom
UCSF Neuroscape
Bit2Me

Über 3.000 Organisationen weltweit vertrauen uns.

  • MitIDDenmark · Danish Agency for Digital GovernmentDenmarkLive
  • BankIDSweden · Finansiell ID-Teknik / bank consortiumSwedenLive
  • BankIDNorway · BankID BankAxept ASNorwayBald
  • VippsNorway · Vipps MobilePay / BankID NONorwayBald
  • Buypass IDNorway · Buypass ASNorwayBald
  • itsmeBelgium, Luxembourg, Netherlands · Belgian Mobile IDBelgiumLuxembourgNetherlandsBald
  • iDINNetherlands · Dutch banks (Currence iDIN)NetherlandsBald
  • Finnish Trust NetworkFinland · Finnish banks and mobile operators (FTN)FinlandLive
  • PersonalausweisGermany · Bundesministerium des Innern (eID)GermanyBald
  • Freja eIDSweden · Freja eID GroupSwedenBald
  • UAE PASSUnited Arab Emirates · UAE Digital Government AuthorityUnited Arab EmiratesBald
  • gov.brBrazil · Governo Federal do BrasilBrazilBald
  • OneIDUnited Kingdom · OneID (UK bank-verified identity)United KingdomBald
  • GOV.UK WalletUnited Kingdom · UK Government Digital ServiceUnited KingdomBald
  • Smart-IDEstonia, Latvia, Lithuania, Belgium · SK ID SolutionsEstoniaLatviaLithuaniaBelgiumLive
  • Mobile-IDEstonia, Lithuania · SK ID Solutions with the national mobile operatorsEstoniaLithuaniaLive
  • Bank iDCzechia · Bankovní identita, a.s.CzechiaBald
  • MojeIDCzechia · CZ.NICCzechiaBald
  • DiiaUkraine · Ministry of Digital Transformation of UkraineUkraineBald
  • FranceConnectFrance · DINUM (French state)FranceBald
  • AuðkenniIceland · Auðkenni (Icelandic electronic ID)IcelandBald
  • ConnectIDAustralia · Australian Payments PlusAustraliaBald
  • EUDI Wallet30 EU- und EWR-Länder · The user's own member state; the issuer differs per countryAustriaBelgiumBulgariaCroatia+26Bald

Die Status unterscheiden die Produktionsverfügbarkeit von Integrationstests. Die Länderabdeckung beschreibt die konfigurierte Wallet-Route, nicht eine abgeschlossene Live-Identitätsprüfung in jedem Land. Es wird kein Startdatum versprochen.

Integrationsstatus

Digitale ID-Wallets.
Klarer Rollout-Status.

MitID, BankID Schweden, Finnish Trust Network, Smart-ID und Mobile-ID sind verfügbar. Wähle die akzeptierten Wallets pro Land und lass Nutzer sich mit einer berechtigten Identität anmelden, die sie bereits besitzen. Weitere gelistete Integrationen folgen in Kürze.

So funktioniert's

Vom Wallet-Login zum verifizierten Nutzer in vier Schritten.

Schritt 01 / 04

Workflow erstellen

Wähle in der Konsole die für jedes Land in deiner Umgebung verfügbaren Wallets aus. Lege fest, ob ein abgebrochener oder fehlgeschlagener Login auf die Dokumentenerfassung zurückfällt oder abgelehnt wird.

Für Entwickler gemacht · Gegen Betrug gebaut · Offen im Design

Sechs Funktionen. Eine Akzeptanzliste pro Land.

Ein Wallet ist eine Methode innerhalb der ID-Verifizierung, mit demselben Ergebnisvertrag wie die Dokumentenerfassung. Was sich ändert, ist der Nachweis: eine Signatur des Ausstellers anstelle eines Fotos.
01 · Der Katalog

Akzeptiere die Wallets, die ein Land wirklich nutzt.

Sieh jede Wallet, die Länderabdeckung, die ausstellende Stelle und die Verfügbarkeit auf einen Blick. MitID, BankID Schweden, Finnish Trust Network, Smart-ID und Mobile-ID sind verfügbar; geplante Integrationen sind klar als In Kürze markiert.
02 · Akzeptanzliste

Wähle, was du akzeptierst. Der Nutzer entscheidet.

Wähle aus, welche verfügbaren Wallets du pro Land in deinem Workflow akzeptieren möchtest. Der Nutzer wählt aus dieser Menge. Ein als „coming soon“ gelistetes Wallet kann erst aktiviert werden, wenn der Katalog in deiner Umgebung es als verfügbar kennzeichnet.
03 · Die Übergabe

Vergleiche den Code. Bestätige auf deinem Telefon.

Smart-ID verwendet deinen persönlichen Code; Mobile-ID fragt zusätzlich nach deiner Telefonnummer. Didit zeigt einen Vergleichscode an, während du die Anfrage auf deinem Gerät bestätigst. Deine PIN wird niemals bei Didit eingegeben. Abbruch und Fehler folgen deiner Workflow-Fallback-Einstellung.
04 · Signierte Attribute

Lies Attribute, die der Aussteller signiert hat.

Name, Geburtsdatum und die nationale Kennung, die das Wallet preisgibt, plus die signierte Bestätigung selbst. Deaktiviere jedes optionale Attribut, das du nicht speichern möchtest, und es wird niemals in die Session geschrieben.
05 · Sicherheit

Erreiche die höchste der drei Sicherheitsstufen.

Ein Dokument gibt dir dokumentarische Sicherheit. Ein Registerabgleich gibt dir einen Datenmatch. Ein Wallet gibt dir kryptografische Sicherheit, weil der Aussteller die Attribute signiert hat und Didit diese Signatur prüft.
06 · Reichweite

Länderabdeckung jeder Live-Wallet.

Akzeptiere MitID in Dänemark, BankID in Schweden, Finnish Trust Network in Finnland, Smart-ID in Estland, Lettland, Litauen und Belgien sowie Mobile-ID in Estland und Litauen. Nutzer melden sich mit einem berechtigten Zugang für die gewählte Wallet an.
Integrieren

Ein Aufruf. Ein signiertes Ergebnis zurück.

Erstelle die Session, leite den Nutzer dorthin und verifiziere den signierten Webhook, wenn das Ergebnis eintrifft. Das Wallet, mit dem sich der Nutzer angemeldet hat, wird im Ergebnis zurückgegeben.
POST /v3/session/Gehostete UI
$ curl -X POST https://verification.didit.me/v3/session/ \
  -H "x-api-key: <your-api-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "workflow_id": "<your-workflow-uuid>",
    "vendor_data": "user_42"
  }'
201Erstellt{ "url": "https://verify.didit.me/..." }
Didit zeigt die akzeptierten Wallets und übernimmt die Übergabe.Doku
POST /webhooks/diditWebhook
// 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);
});
200OK{ "verification_method": "wallet", "assurance": "cryptographic" }
Verifiziere die Signatur, bevor du der Payload vertraust.Doku
Agenten-fertige Integration

Wallet-Anmeldung mit einem Prompt live schalten.

Füge den folgenden Block in Claude Code, Cursor, Codex, Devin, Aider oder Replit Agent ein. Ersetze den Platzhalter `my_stack` durch dein Framework, deine Sprache und deinen Anwendungsfall. Der Agent richtet Didit ein, akzeptiert die Wallets pro Land, verbindet den Webhook und geht live.
didit-integration-prompt.md
# Didit digital ID wallets — integrate in 5 minutes

You are adding digital ID wallet sign-in to my_stack. The user signs in with a
government or bank digital identity and the wallet returns signed attributes.
Every URL, header, and enum value below is canonical — do not paraphrase or
"improve" them.

## 1. Provision an account
- Sign up: https://business.didit.me (no credit card required).
- Grab the API key for your application from the console.

## 2. Read the methods catalog first
Wallet availability is server-driven per country. Never hard-code a wallet list.

Read the catalog one of these ways:
  - 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").

The catalog gives you, per wallet id: the display name, the countries it
covers, the issuing authority, the level of assurance, the availability state,
and the attributes it returns. When this prompt was generated it marked these
available:
  - MitID: wallet id mitid, country keys DNK
  - BankID: wallet id bankid_se, country keys SWE
  - Finnish Trust Network: wallet id ftn, country keys FIN
  - Smart-ID: wallet id smart_id, country keys EST, LVA, LTU, BEL
  - Mobile-ID: wallet id mobile_id, country keys EST, LTU
Finnish Trust Network has its own integration guide:
https://docs.didit.me/core-technology/id-verification/finnish-trust-network
iDIN and other wallets remain coming soon until the catalog in
your environment marks them available. Check it; do not hard-code a date.

## 3. Create a workflow with the ID Verification (OCR) feature
POST https://verification.didit.me/v3/workflows/
  -H "x-api-key: <your-api-key>"
  -H "Content-Type: application/json"

The ID Verification feature's enum value is OCR (UPPERCASE — strict enum;
there is no ID_VERIFICATION alias and the API rejects it). Wallets are its
wallet method, accepted per country under config.methods on that same
feature entry, in the same request. Keys are ISO 3166-1 alpha-3.

{
  "workflow_label": "Wallet onboarding",
  "features": [
    {
      "feature": "OCR",
      "config": {
        "methods": {
          "DNK": {
            "document": { "enabled": true },
            "wallet": {
              "enabled": true,
              "providers": ["mitid"],
              "on_failure": "fallback_to_document"
            }
          },
          "FIN": {
            "document": { "enabled": true },
            "wallet": {
              "enabled": true,
              "providers": ["ftn"],
              "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.
Use that id as workflow_id in step 4. The ID Verification node id of a
workflow made by this call is "ocr".

Rules that the API enforces:
  - providers is an accept-list, not a ranking. Order carries no meaning and
    the end user picks
  - on_failure is either fallback_to_document or decline. It covers all three
    cases: no wallet, cancelled, sign-in failed
  - a wallet id the catalog does not mark available for that country is
    rejected, and the rejection fails the whole save — including any lookup
    configuration next to it. For unavailable wallets, keep wallet.enabled
    false (or omit the wallet block) so the save succeeds. A sandbox
    application accepts coming-soon wallets, so this only shows on live
  - unknown wallet ids already saved on a workflow are preserved untouched, so
    a config written by a newer console version is never silently dropped
  - a country with no method enabled is rejected at publish time

## 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.
Didit shows the accepted wallets for the user's country with their brand marks,
hands off to the wallet, and waits for the signed assertion to come back.

## 5. Webhooks
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
               — the sender's Python json.dumps(sort_keys=True,
               separators=(",", ":"), ensure_ascii=False) after whole-valued
               floats become ints. Reproduce those bytes EXACTLY; do NOT
               "parse, sort keys, JSON.stringify", which fails in four ways:
               numbers come from the wire TEXT, never from parsed doubles
               (read the body with express.text, not express.json(),
               registered ABOVE any global app.use(express.json()), and
               re-emit integers through BigInt(source) — JSON.parse rounds
               1000000000000000129); floats use Python's repr (1e-05, not
               0.00001; 27.0 becomes 27); keys sort by Unicode CODE POINT as
               strings ("10" before "2", U+FF21 before U+1F642, which
               JavaScript's default .sort() reverses); and the bytes come
               straight from the sorted entries, never from a rebuilt object.
               Do NOT hash the raw request bytes — that is the v1
               X-Signature algorithm and fails for V2 whenever whitespace or
               key order differs from the canonical form.
  Freshness:   the signed body field timestamp is the dispatch time (Unix
               seconds, refreshed on every retry). Reject when
               abs(now - timestamp) > 300 seconds, and reject when the
               X-Timestamp header does not equal it. The header is not
               covered by the signature, so it must never be the only replay
               check: a captured delivery replays with just that header
               refreshed.
  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);
});

Body fields you will use: event_id, session_id, status, webhook_type,
workflow_id, vendor_data, timestamp, decision.
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. Reading 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.

The decision is the V3 shape: every feature result is a plural array with one
entry per workflow node. ID Verification results live in
id_verifications[]: there is no singular kyc (that is the V2 shape) and no
id_verification. The decision's features list names the step
ID_VERIFICATION, while the workflow body takes OCR. Select your entry by node_id (the
id of your ID Verification node in the workflow graph); with a single ID step,
take index 0. Each entry carries, next to the document fields:

  verification_method    "document" | "id_lookup" | "wallet"
  assurance              "documentary" | "data_match" | "cryptographic"
  wallet_provider        the catalog wallet id the user signed in with; null
                         on document and id_lookup entries
  wallet_verification    provider, provider_name, issuing_authority,
                         issuing_country, credential_type, level_of_assurance
                         (low | substantial | high), verified_at,
                         signature_valid, attributes (what the wallet shared),
                         portrait when the wallet shares one; null otherwise
  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

A wallet entry that succeeds is assurance cryptographic: an identity provider
authenticated the person and signed the attributes. The normalised full_name
and date_of_birth sit on the entry itself; attributes holds the wallet's own
claims. On a live application, check wallet_verification.signature_valid
before you trust attributes.
Field-by-field reference: https://docs.didit.me/reference/data-models#id-verification

## 7. Billing
  - published customer prices in USD per completed wallet verification:
    - MitID personal: $0.25; production availability: Available
    - BankID Sweden: $0.20; production availability: Available
    - Finnish Trust Network: $0.25; production availability: Available
    - Smart-ID: $0.20; production availability: Available
    - Mobile-ID: $0.20; production availability: Available
    - BankID Norway High: $0.35; production availability: Coming soon
    - Vipps Plus: $0.25; production availability: Coming soon
    - Buypass ID: Coming soon; production availability: Coming soon
    - itsme: Coming soon; production availability: Coming soon
    - iDIN full identification: $0.85; production availability: Coming soon
    - Personalausweis Profile 2: $0.45; production availability: Coming soon
    - Freja eID: $0.25; production availability: Coming soon
    - UAE PASS: Coming soon; production availability: Coming soon
    - gov.br: Coming soon; production availability: Coming soon
    - OneID: $2.50; production availability: Coming soon
    - GOV.UK Wallet: Coming soon; production availability: Coming soon
    - Bank iD: Coming soon; production availability: Coming soon
    - MojeID: Coming soon; production availability: Coming soon
    - Diia: Coming soon; production availability: Coming soon
    - FranceConnect: Coming soon; production availability: Coming soon
    - Auðkenni: Coming soon; production availability: Coming soon
    - ConnectID: Coming soon; production availability: Coming soon
    - EUDI Wallet: Coming soon; production availability: Coming soon
    - Estonian ID-card: $0.55; production availability: Coming soon
    - eParaksts mobile: $0.55; production availability: Coming soon
  - an announced price does not enable a wallet; check the live workflow catalog
  - wallet checks are outside the document free tier; other checks are billed separately
  - full pricing: https://docs.didit.me/core-technology/id-verification/digital-id-wallets#pricing
  - document capture bills its own price when the user falls back

## 8. Hard rules — do not change
  - base URL for v3 endpoints: verification.didit.me
  - auth header: x-api-key (lowercase, hyphenated)
  - webhook headers: X-Signature-V2 plus X-Timestamp; canonical JSON, never
    raw bytes; freshness from the signed body timestamp
  - feature enum: OCR (uppercase) — the ID Verification feature; per-country
    methods go under its config.methods
  - method keys: document, id_lookup, wallet (lowercase, snake_case)
  - wallet ids come from the catalog verbatim, lowercase, snake_case
  - country keys: ISO 3166-1 alpha-3, uppercase
  - result path: decision.id_verifications[] in the webhook body and
    id_verifications[] on the GET decision response, never kyc

## 9. 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 session per accepted wallet in sandbox through the hosted flow
  - assert the id_verifications[] entry for your node has verification_method
    wallet and wallet_provider set to the wallet you picked
  - run one session with sandbox_scenario "wallet_cancelled" and assert your
    on_failure setting actually fires
  - on a live application, assert wallet_verification.signature_valid is true
  - assert your webhook accepts a correctly signed payload with reordered
    keys, whitespace and integer-like metadata keys ("10" before "2"), and
    rejects a wrong X-Signature-V2, a payload whose signed timestamp is older
    than 300 seconds, and that same stale payload with only the X-Timestamp
    header refreshed

Docs: https://docs.didit.me/integration/integration-prompt
Brauchst du mehr Kontext? Siehe die vollständige Moduldokumentation.docs.didit.me →
Compliant by Design

Ein neues Land mit einem Klick erschließen. Wir machen die Arbeit.

Wir gründen lokale Tochtergesellschaften, sichern Lizenzen, führen Penetrationstests durch, erhalten Zertifizierungen und passen uns jeder neuen Regulierung an. Um Verifizierungen in einem neuen Land zu starten, legst du einfach einen Schalter um. Über 220 Länder live, vierteljährlich auditiert und Pen-getestet, der einzige Identitätsanbieter, den eine EU-Mitgliedsregierung offiziell als sicherer als die persönliche Verifizierung eingestuft hat.
Sicherheits- & Compliance-Dossier lesen
SOC 2 · Type II — AICPA · 2026
SOC 2 · Type I — AICPA · 2026
ISO/IEC 27001 — Informationssicherheit · 2026
EU Financial Sandbox — Tesoro · SEPBLAC · BdE
FIDO Alliance — Assoziiertes Mitglied · 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-Leitlinien für Remote-Onboarding — EBA/GL/2022/15
AMLD6 · eIDAS 2.0 — EU-konform by Design
Jugendschutz geprüft — FSM · JMStV §4(2) · 2026

Zahlen zum Nachweis

Zahlen zum Nachweis
  • 23
    Wallets im Methoden-Katalog
  • 35
    Länder im Katalog
  • 10
    Wallets mit eIDAS hoher Sicherheit
  • $0.15
    Dokumentenerfassung, wenn ein Nutzer zurückfällt

Preise und Verfügbarkeit für Digital-ID-Wallets

Die unten angegebenen Preise sind in USD pro erfolgreich abgeschlossener Wallet-Verifizierung. Sie decken das genannte Identitätsprodukt ab; andere Workflow-Checks und Dokumenten-Fallback werden separat abgerechnet. Die 500 kostenlosen monatlichen Dokumenten-Checks decken keine Wallets ab. Ein angekündigter Preis bedeutet nicht, dass ein Wallet live ist: Die Verfügbarkeit wird separat angezeigt. Verfügbare Wallets ohne veröffentlichten Preis zeigen „Auf Anfrage“ an; geplante Wallets ohne veröffentlichten Preis zeigen „Demnächst verfügbar“ an. Identity Wallets verifizieren Personen; die Überprüfung von Krypto-Wallets ist ein separates Produkt.

„Verfügbar“ bedeutet, dass es in der Produktion aktiviert ist. „Demnächst verfügbar“ bedeutet, dass es noch nicht in der Produktion aktiviert ist, auch wenn Integrationstests bereits begonnen haben. Verfügbare Wallets werden zuerst angezeigt.

ConnectID (Australien), estnische ID-Karte (Estland) und eParaksts mobile (Lettland) sind für Sandbox-Tests integriert. Die veröffentlichten Preise und die Verfügbarkeit für die Produktion findest du in der Tabelle.

Lies die detaillierte Dokumentation
Preise und Verfügbarkeit für Digital-ID-Wallets
Identity WalletUSD / erfolgreiche VerifizierungLand / RegionProduktionsverfügbarkeit
MitID personal0,25 $
  • Denmark
Verfügbar
BankID Sweden0,20 $
  • Sweden
Verfügbar
Finnish Trust Network0,25 $
  • Finland
Verfügbar
Smart-ID0,20 $
  • Estonia
  • Latvia
  • Lithuania
  • Belgium
Verfügbar
Mobile-ID0,20 $
  • Estonia
  • Lithuania
Verfügbar
BankID Norway High0,35 $
  • Norway
Demnächst verfügbar
Vipps Plus0,25 $
  • Norway
Demnächst verfügbar
Buypass IDDemnächst verfügbar
  • Norway
Demnächst verfügbar
itsmeDemnächst verfügbar
  • Belgium
  • Luxembourg
  • Netherlands
Demnächst verfügbar
iDIN full identification0,85 $
  • Netherlands
Demnächst verfügbar
Personalausweis Profile 20,45 $
  • Germany
Demnächst verfügbar
Freja eID0,25 $
  • Sweden
Demnächst verfügbar
UAE PASSDemnächst verfügbar
  • United Arab Emirates
Demnächst verfügbar
gov.brDemnächst verfügbar
  • Brazil
Demnächst verfügbar
OneID2,50 $
  • United Kingdom
Demnächst verfügbar
GOV.UK WalletDemnächst verfügbar
  • United Kingdom
Demnächst verfügbar
Bank iDDemnächst verfügbar
  • Czechia
Demnächst verfügbar
MojeIDDemnächst verfügbar
  • Czechia
Demnächst verfügbar
DiiaDemnächst verfügbar
  • Ukraine
Demnächst verfügbar
FranceConnectDemnächst verfügbar
  • France
Demnächst verfügbar
AuðkenniDemnächst verfügbar
  • Iceland
Demnächst verfügbar
ConnectIDDemnächst verfügbar
  • Australia
Demnächst verfügbar
EUDI WalletDemnächst verfügbar
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czechia
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • Iceland
  • Liechtenstein
  • Norway
Demnächst verfügbar
Estonian ID-card0,55 $
  • Estonia
Demnächst verfügbar
eParaksts mobile0,55 $
  • Latvia
Demnächst verfügbar
Drei Stufen, eine Preisliste

Kostenlos starten. Nach Verbrauch zahlen. Bis zum Enterprise-Level skalieren.

500 kostenlose Verifizierungen jeden Monat, für immer. Danach zahlst du nur, wenn ein Modul läuft. Individuelle Verträge, Datenresidenz und Service Level Agreements (SLAs) für Enterprise-Kunden.

Kostenlos

$0/ Monat · keine Kreditkarte nötig

Zum Entwickeln, Testen und für deine ersten Nutzer.

Alles, was du für den Start brauchst:
  • 500 vollständige KYC-Verifizierungen pro Monat
  • ID, Liveness, Face Match, Gerät & IP
  • Über 200 Betrugssignale, Blocklist, Duplikate
  • Wiederverwendbares KYC im Didit-Netzwerk
  • Workflow Builder, Case Management, SDKs
  • KI-Support KI-Agent in der Konsole, Docs und Community.
Am beliebtesten

Nach Verbrauch zahlen

$0.33pro vollständigem KYC

Über 25 Module, transparente Preise. Automatische Mengenrabatte.

Alles in Kostenlos, plus:
  • AML-Screening und -Monitoring ab 0,07 $
  • Preise für Handelsregisterabfragen nach Land und Datenstufe
  • Transaktionsmonitoring für $0.02 pro Transaktion
  • Wallet-Screening für $0.15 pro Prüfung
  • White-Label-Flow unter deiner eigenen Marke
  • KI-Support KI-Agent in der Konsole, Docs und Community.

Enterprise

MaßgeschneidertJahresvertrag

Für große Volumina und regulierte Programme.

Alles in Nach Verbrauch zahlen, plus:
  • Jahresverträge, volumenbasierte Preise
  • Individuelle rechtliche Bedingungen und ein 99,99 % Uptime SLA
  • Datenresidenz, -aufbewahrung, Sicherheitsprüfung
  • Manuelle Prüfer auf Abruf
  • Wiederverkäufer- und White-Label-Bedingungen
  • Priorisierter menschlicher Support 24/7 Shared Slack-Channel, fester Success Manager.

Mengenrabatte werden automatisch angewendet, wenn die Nutzung steigt – keine Verhandlungen, kein Verkaufsgespräch.

FAQ

Häufige Fragen

Was ist Didit?

Didit ist die Infrastruktur für Identität und Betrug – die Plattform, die wir uns beim Entwickeln eigener Produkte gewünscht hätten: offen, flexibel und entwicklerfreundlich, damit sie ein echter Teil deines Stacks ist und nicht eine Blackbox, um die herum du integrieren musst.

Eine API deckt die Verifizierung von Personen (KYC, Know Your Customer), die Verifizierung von Unternehmen (KYB, Know Your Business), das Screening von Krypto-Wallets (KYT, Know Your Transaction) und die Echtzeitüberwachung von Transaktionen ab, auf einem Stack, der dafür gebaut wurde, schnell, zuverlässig und sicher zu sein:

  • Schnell: p99 unter 2 Sekunden bei jeder Session
  • Zuverlässig: Im Einsatz bei über 3.000 Unternehmen in über 220 Ländern
  • Sicher: SOC 2 Typ 1 & Typ 2, ISO 27001, GDPR-nativ und vom spanischen Finanzregulator offiziell als sicherer als die persönliche Verifizierung attestiert

Die Basis darunter: über 14.000 Dokumententypen in über 48 Sprachen, über 1.000 Datenquellen und über 200 Betrugssignale bei jeder Session. Die Didit-Infrastruktur lernt dynamisch aus jeder Session und wird jeden Tag besser.

Was ist eine digitale ID-Wallet-Verifizierung?

Der Nutzer authentifiziert sich mit einer bestehenden elektronischen Identität (eID), und Didit prüft den signierten Identitätsnachweis, bevor das Ergebnis in die Session geschrieben wird. Die Interaktion hängt vom Wallet ab: Smart-ID fragt nach einem persönlichen Code, während Mobile-ID zusätzlich nach einer Telefonnummer fragt. Beide verwenden einen Vergleichscode und eine Bestätigung auf dem Gerät des Nutzers.

Die Wallet-Authentifizierung ist eine Methode innerhalb der ID-Verifizierung, neben der Dokumentenerfassung und der Non-Dokumenten-Suche. In der Workflow-API heißt diese Funktion OCR. Verfügbare Wallets hängen vom Land und der Umgebung ab. Beginne mit der Wallet-Dokumentation.

Welche digitalen ID-Wallets kann ich in Produktion aktivieren?

MitID, BankID Schweden, Finnish Trust Network, Smart-ID und Mobile-ID sind verfügbar. MitID deckt Dänemark ab, BankID deckt Schweden ab und Finnish Trust Network deckt Finnland ab; Smart-ID deckt Estland, Lettland, Litauen und Belgien ab; Mobile-ID deckt Estland und Litauen ab. Weitere gelistete Wallets, darunter iDIN, BankID Norwegen, Freja eID, ConnectID und die EUDI-Wallet, folgen in Kürze.

Wähle die akzeptierten Wallets für jedes Land in der Konsole aus. Die Workflow-API verwendet den Katalog für deine Umgebung und dein Land. Nutze den Integrationsleitfaden, um den Dokumenten-Fallback zu konfigurieren.

Wie verifizieren Smart-ID- und Mobile-ID-Nutzer ihre Identität?

Der Nutzer wählt ein akzeptiertes Wallet aus, gibt seinen persönlichen Code ein und gibt eine Telefonnummer für Mobile-ID an. Didit zeigt einen Vergleichscode an. Der Nutzer überprüft, ob der Code mit dem auf seinem Telefon übereinstimmt, und genehmigt dort die Authentifizierungsanfrage. Die PIN wird nur auf dem Gerät des Nutzers eingegeben, niemals in Didit.

Didit wartet auf die signierte Antwort, überprüft die Signatur und den Zertifikatsstatus und gibt verifizierte Identitätsattribute an die Session zurück. Die Abschlusszeit hängt vom Nutzer und der Wallet-Antwort ab. Folge dem Smart-ID und Mobile-ID Leitfaden.

Wie verifiziert Didit die Smart-ID- und Mobile-ID-Authentifizierung?

Didit prüft die Authentifizierungssignatur gegen die Challenge für diese Session, verifiziert das Zertifikat gegen vertrauenswürdige Aussteller und prüft dessen Widerrufsstatus. Die zurückgegebene Identität muss mit dem persönlichen Code und dem Land übereinstimmen, die für die Anfrage verwendet wurden. Der gehostete Flow validiert auch sein Session-Token und lehnt wiederholte Abschlussversuche ab.

Diese Prüfungen verbinden die signierte Antwort mit dem erwarteten Nutzer und der Anfrage. Sie ersetzen nicht die Notwendigkeit für den Nutzer, Codes zu vergleichen und sein Gerät zu schützen. Lies die Verifizierungsmethode, den Wallet-Anbieter und die signierten Attribute im Session-Ergebnis und verifiziere Webhook-Signaturen, bevor du ein Ergebnis in deiner Anwendung verwendest. Siehe den technischen Leitfaden.

Was passiert, wenn ein User keine Wallet hat, abbricht oder der Login fehlschlägt?

Ein einziger Schalter deckt alle drei Fälle ab: keine Wallet, abgebrochen oder Login fehlgeschlagen. Er greift entweder auf die Dokumentenerfassung zurück oder lehnt die Session ab, und du legst das pro Land fest.

Das Ergebnis protokolliert die Methode, von der zurückgegriffen wurde, und den Grund, sodass ein abgebrochener Wallet-Login nie unsichtbar bleibt.

Welche Länder unterstützen Smart-ID und Mobile-ID in Didit?

Smart-ID ist für Estland, Lettland, Litauen und Belgien verfügbar. Mobile-ID ist für Estland und Litauen verfügbar. Mobile-ID wird für Lettland nicht unterstützt. Nutzer benötigen ein berechtigtes Credential für ihr ausgewähltes Wallet.

Aktiviere jedes Wallet für das entsprechende Land in deinem Workflow. Lies den Smart-ID und Mobile-ID Leitfaden für Authentifizierungsschritte, verifizierte Identitätsfelder und Dokumenten-Fallback.

Wo werden meine Kundendaten gespeichert und wie sind sie geschützt?

Verschlüsselt während der Übertragung und im Ruhezustand, in der von dir gewählten Region, unter SOC 2 Type 1 und Type 2, ISO 27001 und GDPR.

Eine Wallet teilt nur die Attribute, die die Anfrage verlangt, und du kannst jedes optionale Attribut deaktivieren, sodass es überhaupt nicht gespeichert wird. Erforderliche Attribute werden immer gespeichert, zusammen mit der signierten Assertionsreferenz, die ein Auditor benötigt.

Alle Details unter /security-compliance.

Ist Didit für meine Branche konform?

Didit ist bei über 3.000 Unternehmen in regulierten Branchen im Einsatz – Fintech, Banking, iGaming, Krypto, Marktplätze, Gesundheitswesen und Regierung.

Der Wallet-Login erreicht kryptografische Sicherheit, den stärksten Nachweis der drei Methoden, und das Sicherheitsniveau wird bei jeder Session protokolliert. Wenn eine Regulierungsbehörde eine spezifische nationale eID benennt, ist die Akzeptanz dieser Wallet meist der einfachste Weg, dies zu erfüllen.

Memos unter /security-compliance.

Wie schnell kann ich integrieren und Nutzer verifizieren?

Minuten, auf drei Arten.

  • No Code – Workflow in der Konsole erstellen, die akzeptierten Wallets pro Land auswählen und dem User einen Link senden.
  • SDK oder Redirect – Web, iOS, Android, React Native und Flutter oder eine gehostete Seite.
  • KI-Agent – den Integrations-Prompt von dieser Seite in Claude Code, Cursor oder Codex einfügen und das Ganze, inklusive Webhook, automatisch verbinden lassen.

Starte auf business.didit.me oder lies docs.didit.me/integration/integration-prompt.

Infrastruktur für Identität und Betrugsprävention.

Eine API für KYC, KYB, Transaktionsüberwachung und Wallet-Screening. In 5 Minuten integriert.

Lass dir diese Seite von einer KI zusammenfassen