99.94% of Aadhaar numbers, 100% of QR codes, on 10,001 real loan files
This page is the whole story: what was tested, how it was counted, what the figures are, and what the engine still misses. As of October 2026 no other Aadhaar masking vendor publishes a measured figure, and none claims more than 99.9%.
Last updated
- of Aadhaar numbers masked
- 99.94%
- 13,541 of 13,549 Aadhaar numbers on 10,001 real loan files, counted by an independent reader and checked by eye.
- of Aadhaar QR codes masked
- 100%
- 2,498 of 2,498 Aadhaar QR codes in the same test.
- pages a minute
- 500
- About 500 pages a minute with 40 parallel masking environments; 425 pages a minute measured end to end through the API with 24 files in flight from one office connection.
- service errors
- 0
- 0 errors and 0 throttles in 11,128 masking calls during the test (CloudWatch).
Measured on 10,001 real loan files, 15 October 2026; method on the Accuracy page. The misses are listed too: how it was measured.
Loan files as customers upload them
10,001 files from loan cases, taken as they were uploaded by customers of a housing-finance lender: card photos from phones, scans, e-Aadhaar printouts, multi-page PDFs of KYC sets and deeds, ZIP archives and spreadsheets. 18,893 pages in all. Nothing was selected or cleaned up.
Every file was sent to the hosted API on 15 October 2026 exactly as a customer would send it, 24 files in flight at a time from one office connection. 9,946 files came back masked; 55 were refused with a message saying why: unsupported formats such as .xlsb, .htm and .docx, password-protected PDFs, an empty ZIP and an unfinished browser download.
The documents are the lender's and the holders'. None appears on this site, and every figure here is a count.
- Files sent
- 10,001
- Pages
- 18,893
- Files masked
- 9,946
- Refused by design
- 55
- Aadhaar numbers found by the reader
- 13,549
- Aadhaar QR codes found by the reader
- 2,498
- Masking calls
- 11,128
- Errors · throttles
- 0 · 0
- Wall-clock time
- 44.5 minutes
An independent reader, and a person for every flag
An independent reader
A separate text and QR reader, not part of the product, read every page of every input and every output. An Aadhaar number is twelve digits starting 2–9 that pass the Verhoeff checksum, printed 4-4-4 or beside Aadhaar wording. A QR code counts when its contents are Aadhaar's. A number or code is masked when it can no longer be read on the same page of the output.
Eyes on every flag
Every number or code the reader said was still readable was looked at by a person. Reader mistakes were removed from the count: PAN numbers in handwriting, years, phone and account numbers that happened to look like twelve digits.
Wrong covers, two ways
A cover on something that is not an Aadhaar number hides information a reviewer needs. Pages were reviewed one by one for covers on anything else, and a random 35 of the 323 pages where the engine covered something the reader could not read were checked by eye: 33 were real Aadhaar numbers or codes the reader had missed, 2 were PAN QR codes on e-PAN pages, covered by policy because they share UIDAI's format.
UIDAI's rule is followed: the last four digits stay readable on 13,432 of the masked numbers. Where the engine cannot place the cut exactly, the whole number is covered rather than risk a digit showing. Virtual IDs are left as printed, by decision: 4,043 were seen.
8 numbers of 13,549
Every one checked by eye. Six are card photos the detector does not find, which is the next training round; two are numbers in Hindi deeds.
| What | Kind | Numbers | Status |
|---|---|---|---|
| A card inside a collage of several documents | Card photo | 1 | Needs detector training |
| An old card where a cover was drawn beside the number | Card photo | 1 | Needs detector training |
| A card photographed sideways, the number at its edge | Card photo | 1 | Needs detector training |
| A clear card in a plastic sleeve the detector did not find | Card photo | 1 | Needs detector training |
| A blurred photo of a card's back | Card photo | 1 | Needs detector training |
| A small, faint card in a large photo | Card photo | 1 | Needs detector training |
| A number read a digit short, its label garbled | Hindi deed | 1 | A re-read finds it but nothing labels it |
| A number on a phone photo of a deed the page read finds no line on | Hindi deed | 1 | Open |
Tested the same way before it ships
Labelled sets in the build
Six labelled sets of real and synthetic documents, 231 files, run on every change: each labelled number must be covered and each labelled name, date and amount must be left alone. A change that fails a set does not merge. A release is also run side by side with the one before it on the files that changed, and every moved cover is looked at.
Try it yourself
The quickest check is your own file: a card photo from a field app, a page of a deed, a form with the number written in. You see the masked copy and the per-page record, and the file is deleted within 24 hours.
Try it with your own fileSee it on your documents
Thirty minutes with an engineer: your document types, your volumes, and the edition that fits where your documents may go.
Or email support@habilelabs.io · Monday to Friday, 10:00–19:00 IST (excluding public holidays)