The architecture

How Identified verifies age without ever holding data worth stealing.

Four steps from passport scan to verified age. The raw birth date never leaves the device in readable form; our servers only ever hold opaque ciphertext and answer a single yes/no question.

On the phone
15 MAR/MAR 1990
plaintext, never transmitted
ciphertext
Our server
3a91 c4d2 e7f0 a18b 5c2d 9e4f 7b00 d3a1 …
≤ compare only, no decryption
ciphertext
Your service
old enough ✓
verified, nothing else to store
The flow

Four steps. Nothing that identifies a user leaves the phone.

01

The user scans their passport

Our app on the user's phone reads the NFC chip in their passport or national ID and verifies the government-issued signature chain. Forged documents don't progress past this step — and the chip data is never uploaded anywhere.

NFC
DG1 + SOD read, signature ✓
02

Birth date is encrypted on device

The birth date is encrypted before it leaves the phone — on-device, with a key the user holds. We never hold that key, so there is no credential an attacker could steal to unlock the data later.

3a91 c4d2 e7f0 a18b 5c2d 9e4f 7b00 d3a1
c4d2 e7f0 a18b 5c2d 9e4f 7b00 d3a1 c4d2
e7f0 a18b 5c2d 9e4f 7b00 d3a1 c4d2 e7f0
a18b 5c2d 9e4f 7b00 d3a1 c4d2 e7f0 a18b
03

Age comparison runs on encrypted data

The server runs a single operation on the ciphertext. The answer that comes out is also ciphertext. Nothing on our infrastructure ever holds a plaintext date, or even a plaintext yes/no.

TFHE · FheUint32::le
input257 KB
compute~80 ms
output16 KB
04

Your service gets a yes or no

The encrypted result is decrypted locally on the user's device and digitally signed. Your backend receives proof that the person is old enough — and literally nothing else. Nothing to store, nothing to secure, nothing to disclose if you're breached.

over 18
digitally signed
Blast radius

Who holds what — and what a breach would actually expose.

The user keeps

  • Full control — passport data is read, encrypted, sent and erased
  • The private key used to encrypt and decrypt
  • The plaintext answer

What our servers hold

  • Opaque ciphertext in, opaque ciphertext out
  • A pseudonymous session id
  • — that's the entire blast radius
~80 ms
API call
257 KB
encrypted data
1
API call
Ready when you are

See it verifying a passport in under a minute.