Every ID card, parsed in about 20 seconds.
Drop an ID — front, back, or both — and get back structured JSON with every field in both scripts, confidence scores, and validation status. No setup required.
One call in, one document out.
A clean JSON envelope with every field, a per-field confidence score, an MRZ checksum result, and a request id you can quote in support tickets.
- Document number
- Card number
- Last name
- First name
- Full name (native)
- Gender
- Nationality
- Date of birth
- Place of birth
- Issue date
- Expiry date
- Issuing authority
- Mother name
- Father name
- Spouse name
{
"success": true,
"request_id": "req_a3f19c…",
"latency_ms": 19840,
"fields": {
"document_number": { "value": "784-1985-1234567-1", "confidence": 99.6, "band": "verified" },
"last_name": { "value": "AL SAADI", "confidence": 99.1, "band": "verified" },
"first_name": { "value": "AHMED", "confidence": 99.0, "band": "verified" },
"full_name_native":{ "value": "أحمد محمد السعدي", "confidence": 97.0, "band": "verified" },
"nationality": { "value": "United Arab Emirates","confidence": 99.0, "band": "verified" },
"date_of_birth": { "value": "1985-03-15", "confidence": 99.9, "band": "verified" },
"expiry_date": { "value": "2030-01-01", "confidence": 99.8, "band": "verified" },
"mrz_valid": { "value": true, "confidence": 100, "band": "verified" }
},
// Added only when you request a target language (here: language=French).
// The English "fields" above never change. "native" is the value exactly as
// printed on the card — the ORIGINAL native script — and "translatory" its translation.
"translation": {
"fields": {
"last_name": { "label": "Nom", "native": "السعدي", "translatory": "AL SAADI", "band": "verified" },
"first_name": { "label": "Prénom", "native": "أحمد", "translatory": "AHMED", "band": "verified" },
"nationality": { "label": "Nationalité", "native": "الإمارات العربية المتحدة", "translatory": "Émirats arabes unis", "band": "verified" },
"date_of_birth": { "label": "Date de naissance", "native": "1985-03-15", "translatory": "15/03/1985", "band": "verified" }
}
}
}Designed for the hardest 1% of IDs.
Most OCRs handle clean scans. We're built for glare-flecked phone shots, laminated cards, bilingual layouts, and holograms that bleed across the text — any country, any script.
Every field, both scripts
Name, ID number, nationality, dates, issuing authority, parents — returned in a single response, each in Latin and its native script (Arabic, Cyrillic, CJK…) exactly as printed.
About 20 seconds, synchronously
Around 20 seconds end to end, measured on production traffic. No queueing, no warmup — built for synchronous KYC.
MRZ checksum validation
TD1, TD2 and TD3 machine-readable zones are auto-detected and every check digit is verified per ICAO 9303. No MRZ? The visual zone is read with the same care.
Front + back intelligent merge
Drop both sides in any order. The visual zone and MRZ are reconciled across sides into one authoritative value per field, and conflicts are surfaced.
Per-field confidence scores
Five confidence bands per field, not per document. Auto-route the one uncertain field to a reviewer instead of failing the whole call.
Images never stored · results purged in 30 days
The document image is processed in memory and never written to disk. The extracted fields are kept for up to 30 days so they appear in your extraction history, then purged — and purged immediately if you delete your account.
If it's an ID, we read it.
A universal pipeline benchmarked continuously against fresh in-the-wild documents from every region. Any issuing country, any written script, front and back — one integration.
2 free instantly. 5 with a free account. No card.
Test the full production API end-to-end before you ever talk to billing. It's the same credit that runs passports — one balance, both services. Volume pricing kicks in automatically when you keep going.
Put it in front of real customer IDs.
One API key, every government-issued ID, in production this afternoon.