Vérifie n'importe quelle pièce d'identité, partout dans le monde.
Vérifie un passeport, une carte d'identité nationale, un permis de conduire ou un titre de séjour de n'importe quel pays. Plus de 14 000 documents, verdict en moins de 2 secondes, 0,15 $ par vérification, 500 gratuites/mois.
Approuvé par plus de 2000 organisations dans le monde entier.
Couverture mondiale
Plus de 14 000 documents. Plus de 220 pays.
DNI espagnol, My Number japonais, passeport britannique. De nouveaux documents sont ajoutés chaque mois,
toujours 0,15 $ par vérification, même format de verdict, même réponse en moins de 2 secondes.
Trois façons de vérifier
Une fonctionnalité. Trois méthodes par pays.
Active les méthodes réellement prises en charge par un pays. Chaque méthode aboutit au même contrat de résultat, de sorte que ton code lit une forme unique, quel que soit le chemin emprunté par l'utilisateur.
Méthode 01
Capture de document
Photographie un passeport, une carte d'identité nationale, un permis de conduire ou un titre de séjour. Plus de 220 pays, plus de 14 000 documents, un verdict en moins de deux secondes.
De l'inscription à l'utilisateur vérifié en quatre étapes.
Étape 01 / 04
01
Crée le workflow
Choisis les vérifications que tu souhaites, identité, détection du vivant, correspondance faciale, sanctions, adresse, âge, téléphone, e-mail, questions personnalisées. Glisse-les dans un flux sur le tableau de bord, ou publie le même flux via notre API. Crée des branches conditionnelles, exécute des tests A/B, aucun code requis.
Intègre
Intègre nativement avec nos SDK Web, iOS, Android, React Native ou Flutter. Redirige vers une page hébergée. Ou envoie simplement un lien à ton utilisateur, par e-mail, SMS, WhatsApp, n'importe où. Choisis ce qui convient à ta stack.
L'utilisateur suit le parcours
Didit gère la caméra, les indications lumineuses, le transfert mobile et l'accessibilité. Pendant que l'utilisateur suit le parcours, nous évaluons plus de 200 signaux de fraude en temps réel et vérifions chaque champ par rapport à des sources de données fiables. Résultat en moins de deux secondes.
Tu reçois les résultats
Des webhooks signés en temps réel maintiennent ta base de données synchronisée dès qu'un utilisateur est approuvé, refusé ou envoyé en révision. Interroge l'API à la demande. Ou ouvre la console pour inspecter chaque session, chaque signal et gérer les cas à ta manière.
Conçu pour les développeurs · Conçu contre la fraude · Ouvert par nature
Six fonctionnalités. Un seul *feature flag*. ID_VERIFICATION.
Chaque fonctionnalité ci-dessous est un interrupteur sur le même module. Pas de niveaux de vente incitative, pas de SKU séparés, pas d'appels additionnels. Active-les par workflow dans la console, ou passe-les en ligne lorsque tu appelles le point de terminaison autonome.
Plus de 220 pays. Plus de 14 000 types de documents.
Passeports, cartes d'identité nationales, permis de conduire, titres de séjour. Plus de 130 langues, plus de 50 écritures (latin, arabe, cyrillique, CJK, devanagari, hébreu, thaï, géorgien). De nouveaux documents sont ajoutés chaque mois. Contrôles par sous-type et par pays : accepte les permis de l'Indiana et les permis améliorés de New York séparément si ta politique l'exige.
Documents pris en charge
Mis à jour ce mois-ci
En direct
220+
Pays
14,000+
Types de documents
130+
Langues
50+
Scripts
PasseportCarte d'identitéPermis de conduireTitre de séjour
🇪🇸ES
🇺🇸US
🇧🇷BR
🇩🇪DE
🇲🇽MX
🇮🇳IN
🇫🇷FR
🇬🇧GB
🇯🇵JP
🇳🇬NG
🇦🇪AE
🇸🇬SG
02 · Extraction de données
Champs visuels, MRZ et code-barres, recoupés.
Chaque champ visuel, MRZ (zone de lecture optique) et code-barres est extrait en une seule passe. Les trois sont recoupés avant que la réponse ne quitte notre edge. Les incohérences apparaissent comme des avertissements pour que tu puisses diriger le cas vers une révision manuelle.
Données personnelles
OCR · MRZ · Code-barres
Prénom
Olivia
Correspondances avec données fournies via API : Olivia
Nom de famille
Roy
Date de naissance
28/06/1971
Type de document
Passport
État émetteur
Spain🇪🇸
Numéro de document
3EB8726CC6E0F979
03 · Authenticité
Document réel. Portrait intact. Pas de capture d'écran.
Correspondance de modèle avec la base de données certifiée. Détection d'hologrammes et de micro-impressions. Vérification de l'intégrité du portrait. La détection de la vivacité du document déjoue quatre vecteurs d'attaque courants : captures d'écran, photos de téléphone, copies imprimées et substitutions de portrait sur des documents par ailleurs réels.
Authenticité des documents
Authentique
Portrait de document
Capture en direct
Similitude 94 %
Correspondance de modèle
Hologramme détecté
Micro-impression intacte
Vérification de la vivacité du document réussie
04 · Qualité de la capture
Rejette le flou et l'éblouissement avant qu'ils n'atteignent la révision.
La mise au point, la luminosité et la résolution sont notées de 0 à 100 par soumission, avec un score global pondéré. Les coins hors cadre et les côtés surexposés sont signalés explicitement. Des seuils ajustables rejettent les captures de mauvaise qualité en amont, afin qu'elles n'atteignent jamais ta file d'attente de révision manuelle.
Qualité de la capture
Prêt pour la capture
Stable
Score global
91/100
Mise au point92
Luminosité88
Résolution95
05 · Politique de risque
Décide. Révoque. Approuve. Par risque. Par application.
Chaque catégorie de risque, utilisateur en double, MRZ invalide, incohérence de données, faible vivacité du document, est associée à un refus, une révision ou une approbation. Ajuste la politique par application, pays et type de document. Les déclencheurs de refus automatique (expiré, liste noire, non pris en charge) restent appliqués quelles que soient tes préférences.
Politique de risque
5 catégories
Catégorie de risqueAction
Utilisateur dupliqué
Refuser
MRZ invalide
Examiner
Incohérence des données
Examiner
Validation invalide
Refuser
Faible vivacité du document
Approuver
06 · KYC continu
Les documents expirent. Détecte-le avant le régulateur.
Nous suivons l'expiration de chaque document que tu stockes. Lorsqu'un document expire, le statut KYC de l'utilisateur change automatiquement et nous te prévenons via webhook. Pas de tâche par lot, pas de sprint de ré-onboarding trimestriel, le rafraîchissement KYC est continu et tu restes conforme aux directives AML.
Surveillance des documents
Suivi auto de l'expiration · webhook sur changement de statut
En direct
1,284
Actif
47
Expire bientôt
9
Expiré
Webhook déclenché · usr_9f01a3c déplacé vers Kyc expiréIl y a 12 s
Ausr_a8c4f02Passeport12 mars 2027Actif
Musr_4d2b6e1Carte d'identité08 juin 2026Expire bientôt
Lusr_9f01a3cPermis de conduire21 sept. 2025KYC expiré
Intègre
Deux points de terminaison. Même JSON. Même prix.
Crée une session lorsque tu souhaites que notre interface utilisateur hébergée gère la capture, ou appelle le point de terminaison autonome lorsque tu as déjà l'image. Les deux renvoient le même rapport `id_verification`.
Déploie la vérification d'identité en un seul prompt.
Colle le bloc ci-dessous dans Claude Code, Cursor, Codex, Devin, Aider ou Replit Agent. Remplace le placeholder my_stack par ton framework, ton langage et ton cas d'utilisation. L'agent provisionne Didit, construit le workflow avec la vérification d'identité activée, connecte le webhook et déploie.
didit-integration-prompt.md
# Didit ID Verification — integrate in 5 minutes
You are integrating Didit's ID Verification module into <my_stack>. Follow
these steps exactly. 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).
- Or provision programmatically: POST https://apx.didit.me/auth/v2/programmatic/register/
(returns an API key bound to the workspace + application).
## 2. Two integration paths — pick one
### Path A — Workflow Builder (hosted UI)
Best when you want Didit to handle camera, lighting cues, retries,
mobile handoff, and accessibility for you.
1. Create a workflow that contains the ID Verification feature:
POST https://verification.didit.me/v3/workflows/
Authorization header: x-api-key: <your-api-key>
Body: workflow_label, features array with the single entry
{ feature: "OCR" } (UPPERCASE — strict enum; "OCR" is the
workflows-endpoint value for ID Verification, and the only one
POST /v3/workflows/ accepts for it)
2. Create a verification session for an end user:
POST https://verification.didit.me/v3/session/
Body: workflow_id (from step 1), vendor_data (your own user id).
Response: url (the hosted verification link) — redirect the user to it.
3. Listen for webhook callbacks (see "Webhooks" below).
### Path B — Standalone server-to-server API
Best when you already have the document image (mobile SDK capture, native
onboarding app, reseller pipeline).
POST https://verification.didit.me/v3/id-verification/
Content-Type: multipart/form-data
Body fields:
- front_image (required, file)
- back_image (optional, file)
- vendor_data (optional string, your user id)
Response: JSON report with extracted fields, image quality scores,
warnings array, and the verdict.
## 3. Webhooks (Path A only — Path B returns synchronously)
- Register a webhook destination once via
POST https://verification.didit.me/v3/webhook/destinations/
Body: url, subscribed_events: ["session.verified", "session.review_started",
"session.declined", "kyc_expired"]
- Response includes secret_shared_key — store it.
- Every webhook delivery carries an X-Signature-V2 header you MUST verify
before trusting the payload. X-Signature-V2 signs the CANONICAL JSON, not
the raw body bytes — that is what makes it survive a proxy or body parser
that re-encodes the payload. (The legacy X-Signature header is the one
computed over the raw bytes.) The canonical form is 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: the sender
signs 1000000000000000129 digit for digit, JSON.parse rounds it. Read
the body as TEXT (express.text, not express.json()) and re-emit
integers through BigInt(source). Register the webhook route ABOVE any
global app.use(express.json()): the first parser to run consumes the
stream, and the digits are gone before the route sees them.
- 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", and
U+FF21 before U+1F642 (JavaScript's default .sort() reverses the latter
because it compares UTF-16 code units).
- Serialise straight from the sorted entries; never rebuild an object
first, because JavaScript moves integer-like keys to the front.
Then HMAC-SHA256 with secret_shared_key, hex-encode, and compare to the
X-Signature-V2 header in constant time (crypto.timingSafeEqual).
- Freshness comes from the SIGNED body field "timestamp" (Unix seconds):
reject a delivery whose body timestamp is more than 300 seconds from now,
and require the X-Timestamp header to equal it. Never check the header
alone — it is not signed, so a replayed delivery with a rewritten header
would pass. This is the Node 22 + Express handler, paste it verbatim:
// Your endpoint receives a signed ID Verification 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, vendor_data } = body;
// status: Approved | Declined | In Review | Expired | Not Finished
res.sendStatus(200);
});
## 4. Reading the report
Both paths return the same FIELDS, in a different container:
- Path A (session decision + webhook): decision.id_verifications is an ARRAY
— one entry per ID Verification node in the workflow. Select the entry you
want by its node_id, never by index and never as a singular object:
const doc = decision.id_verifications.find(
(v) => v.node_id === "id_verification_1"
);
Every other feature is plural the same way: liveness_checks,
face_matches, aml_screenings, ip_analyses, nfc_verifications,
poa_verifications, database_validations.
- Path B (POST /v3/id-verification/): a single id_verification object on the
response body — this endpoint runs exactly one document.
Each id_verification entry includes:
- status: "Approved" | "Declined" | "In Review" | "Expired" | "Not Finished"
- document_type: "Passport" | "Identity Card" | "Driver's License" | "Residence Permit" | null
- document_number, personal_number
- front_image, back_image, portrait_image (signed URLs, expire in 1 hour)
- date_of_birth (YYYY-MM-DD), age (number)
- expiration_date, date_of_issue (YYYY-MM-DD)
- issuing_state, issuing_state_name (ISO 3166-1 alpha-3 + display name)
- first_name, last_name, full_name
- gender ("M" | "F" | "U"), nationality (ISO 3166-1 alpha-3)
- address, formatted_address, parsed_address (street_1, street_2, city,
region, postal_code, geometry { lat, lng })
- front_image_quality_score / back_image_quality_score (focus, brightness,
resolution, overall, each 0-100)
- warnings: Array<{ risk, log_type, short_description, long_description }>
## 5. Hard rules — do not change
- Base URL for /v3/* endpoints is verification.didit.me (NOT apx.didit.me).
- Feature enum is UPPERCASE: OCR (ID Verification), LIVENESS, FACE_MATCH, AML, IP_ANALYSIS.
- Auth header is x-api-key (lowercase, hyphenated).
- Webhook signature header is X-Signature-V2 (NOT X-Signature), and it signs
the canonical JSON — never HMAC the raw bytes under that header, and never
canonicalise a parsed object: read the body as text and serialise the
sender's bytes (see the handler in section 3).
- Webhook freshness is the signed body "timestamp" (300 s window); the
X-Timestamp header must equal it and is never checked on its own.
- decision.id_verifications is an array; select the node you want by node_id.
- Always verify webhook signatures before trusting payload data.
- Status casing matches exactly: "Approved", "Declined", "In Review",
"Expired", "Not Finished" (title-cased, space-separated).
## 6. Pricing reference (public)
- Path A bundled in a full KYC workflow: $0.33 per session
- Path B standalone /v3/id-verification/ call: $0.15 per call
- 500 free verifications every month, forever, on every account.
## 7. Verify your integration
- Sandbox starts on signup at https://business.didit.me — no separate flag.
- Test docs: deterministic synthetic IDs returned in sandbox.
- Switch to live: flip the application's environment toggle in console.
When in doubt: https://docs.didit.me/core-technology/id-verification/overview
Conforme par nature
Ouvre un nouveau pays en un clic. On s'occupe du plus dur.
Nous ouvrons les filiales locales, obtenons les licences, effectuons les tests d'intrusion, obtenons les certifications et nous alignons sur chaque nouvelle réglementation. Pour déployer des vérifications dans un nouveau pays, il suffit d'activer un interrupteur. Plus de 220 pays en direct, audités et testés chaque trimestre, le seul fournisseur d'identité qu'un gouvernement d'un État membre de l'UE a formellement jugé plus sûr que la vérification en personne.
Types de documents d'identité dans la base de données certifiée.
<2s
Inférence de bout en bout par vérification.
$0.15
Par vérification d'identité autonome. 500 gratuites chaque mois.
Trois niveaux, une seule grille tarifaire
Commence gratuitement. Payez à l'usage. Passez à l'Enterprise.
500 vérifications gratuites chaque mois, pour toujours. Ensuite, ne payez que lorsqu'un module s'exécute. Contrats personnalisés, résidence des données et accords de niveau de service (SLA) pour l'offre Enterprise.
Gratuit
$0/ mois · sans carte bancaire
Pour le développement, les tests et tes premiers utilisateurs.
Tout ce qu'il te faut pour démarrer :
500 vérifications KYC complètes chaque mois
ID, preuve de vie, correspondance faciale, appareil et IP
Plus de 200 signaux de fraude, liste noire, doublons
KYC réutilisable sur le réseau Didit
Éditeur de workflows, gestion des cas, SDK
Support IAAgent IA intégré à la console, documentation et communauté.