Case study 10 · Identity and documents
Liveness checks on both the person and their passport
We built remote identity verification for a German financial institution. A model was confident in about 98% of cases, and an operator confirmed every case.
98%
The model produced a confident recommendation in about 98% of cases, and an operator confirmed every case
Product sold at MVP stage
The story in 5 steps
Stack
- TensorFlow
- WebRTC
- React Native
- Node.js
- AWS
- NFC / ICAO 9303
01 · Context
We built remote identity verification as infrastructure to be resold to other institutions, separate from any one bank's app.
We built remote identity verification as infrastructure to be resold to other institutions, separate from any one bank's app. Customers went through six steps, randomized so that no session could be prepared in advance. The model produced a confident recommendation in about 98% of cases, and a person confirmed every case.
The product was sold at MVP stage.
02 · Could not change
Regulation required video identification, and that one requirement shaped the rest of the design.
Regulation required video identification, and that one requirement shaped the rest of the design. It is why the video was kept, why an operator confirmed every case and why the system recorded gestures as well as checking the face.
Each session had to produce the same evidence as a conversation with a human agent: a record that could be reviewed afterward and attributed to a named person. At the same time, an ordinary customer holding a phone had to be able to finish it.
The six steps were also required by regulation, so none of them could be removed. The work went into making each one easier to get through.
03 · What we did
Six randomized steps. The spoken digits and the gestures changed in every session, so a recording could not be prepared ahead of time or replayed.
Six randomized steps. The spoken digits and the gestures changed in every session, so a recording could not be prepared ahead of time or replayed. The steps were face capture, document capture, a video of the document turned through prescribed rotations, a finger placed on the document's edge, five random digits spoken aloud and a selfie video with random head movements.
The document had to pass a liveness check too. Most systems stop at checking that a live person is in front of the camera, but here the document also had to prove it was a physical object held in a hand. Turning it shows depth and how light falls on it, and a finger on the edge shows a hand holding it. Together these steps catch attacks that a check of a single photograph would miss.
Feedback while recording. Computer vision ran on the user's device, with the same layer on web and mobile, so recording started only once a face was in frame and each gesture was checked as it happened. With six steps that could each fail, that immediate feedback is what kept the process tolerable. One vision layer on both platforms also meant one behavior, and in identity verification that is a question of fairness: the same person should not pass on one device and fail on another.
Reading the passport chip. Later we added reading data directly from the NFC chip in German passports and ID cards. Until then everything was inferred from an image: the model looked at a document and judged it. Chip data is cryptographically signed by the issuer, which made this the largest single gain in reliability in the whole system.
Biometric data storage. The data stayed unlocked only while it was being processed, then moved to separate storage under a key held outside the development team. Every request and response was encrypted, and every token could be used only once.
A case file for the operator. The operator had to record a reason, assign the case and, when an action went beyond their permissions, hand it to a colleague who had them. If they judged a selfie insufficient but were not allowed to request another, the case moved on with a note explaining why. Permissions were set per action, not per role.
The client commissioned independent penetration and load testing.
04 · Result
The model produced a confident recommendation in about 98% of cases, and an operator confirmed every case
- The model produced a confident recommendation in about 98% of cases, and an operator confirmed every case
- Support for three German document types, with chip reading on passports and ID cards
- Independent security testing, commissioned by the client
- Product sold at MVP stage
An operator confirmed every case because in regulated banking both wrongly accepting and wrongly rejecting a customer have consequences, and each decision has to be attributable to a named person. We built the system as decision support for that person.
05 · Differently
We never established what the model's accuracy actually was, only how often it was confident.
We never established what the model's accuracy actually was, only how often it was confident. Confidence and correctness are different measurements, and we shipped without the second one.
Related services
The services that draw on this work.
- MobileHardware integration in React NativeReading the NFC chip in German passports and ID cards during remote identity verification for a German financial institution, 2020.
- Regulated and sensitive systemsIdentity verification and KYCLiveness checks on the person and the document for a German financial institution, across a web app, a mobile app and an API.
- MobileReact Native developmentThe web app, the mobile app and the API for remote identity verification at a German financial institution, with one computer-vision layer running on both web and mobile.
- Backend, data and integrationsPermissions and RBACIn a regulated identity check for a German financial institution, operator permissions were set per action rather than per role. When an action was beyond one operator, the case went to a colleague who held that permission, with a note.
- Regulated and sensitive systemsGovernment documents and audit trailsRemote identity verification in which the operator records a reason for every decision and is named on it, so the record holds up in a review years later.
- AIAI agents and LLM integrationFor a German financial institution’s remote identity checks, the model made a confident recommendation in about 98% of cases, and an operator confirmed every case. The 98% measures only how often the model was sure of itself.
Case study 10
Working on a similar problem? We reply within one business day.
The first call takes 30 minutes, and you’re under no obligation.