Optional add-on · any plan

The scan works. The guest record stays sealed.

Data Encryption is a second lock on top of extraction. Names, document numbers, addresses, and dates leave the server as ciphertext. The phone holds one half of the key. OMGlens holds the other, and cannot finish the open.

Live desk · Partial mask

Partial. Each name keeps its first and last character. The date keeps the year.

This phone Sealed
Reading the passport
DocumentPassport CountryVN Confidence98%
Name
M•i N••••n
Original script
N••••n M•i
Document number
C••••••3
Date of birth
1994
Two shares
Device share stays in the phone key
Server share wrapped, then re-sealed to this phone

Neither side can open the record alone.

OMGlens Unreadable

DV1-P256-HKDF-SHA256-AES-256-GCM

scan_id
6f0c2a14-8b31-4d77-9c2e-1a04b7e5d918
mask
PARTIAL
name
not stored
payload
one sealed blob

The name is not a column. It sits inside one AES-256-GCM payload. This panel never opens it.

Fictional guests. Strict matches the API: those fields are absent, shown as —. Partial uses the same mask as the server. Mai Nguyen is M•i N••••n, the date is the year, and C4829103 is C••••••3. The payload is one AES-256-GCM blob, suite DV1-P256-HKDF-SHA256-AES-256-GCM.

Why this is different

A vault that does not belong to the vendor

Most ID APIs return a clear record and keep a copy they can read. OMGlens returns a public card, and the sensitive half opens only on the phone that scanned it.

  • Split key

    Two shares, one open

    The device share never leaves the phone. The server share is wrapped and only re-sealed to that same phone at decrypt time.

  • Per scan

    A fresh envelope every ID

    Each successful scan gets its own key. Opening one guest does not unlock the next passport in the line.

  • Strict or Partial

    You choose the public card

    Strict leaves name and number out of the result. Partial keeps the first and last character of each name, the year, and the first and last character of the document number.

  • Every stack

    One unmask, five SDKs

    Flutter, iOS, Android, React Native, and PhoneGap all return a public result plus a vault envelope, then decrypt on the device.

  • Separate bill

    The plan keeps scanning

    A failed add-on payment pauses encryption only. Captures still run. A failed plan payment is what suspends the account.

  • Honest limit

    The model sees the photo once

    Extraction still needs the image for that request. What we refuse to keep is a readable copy of the guest you just scanned.

What the desk sees

You choose the mask per organization. The next scan uses it. A scan already returned keeps the mask it was sealed with.

Strict · default

Before decrypt, the app receives document type, gender, country, state, language, and confidence. Name, number, address, and dates are absent.

Partial

The same public fields, plus a masked peek. Each name keeps its first and last character, so Mai Nguyen is M•i N••••n. A date keeps the year. A document number keeps its first and last character. A name of two characters or fewer stays fully hidden.

Same call on every SDK

Flutter, iOS, Android, React Native, and PhoneGap register the device key during initialize when the licence includes data_vault. scan() returns the public result and a vault envelope. unmask() asks for the server share and decrypts on the phone.

  • iOS decrypt needs iOS 17 or newer.
  • A lost device key cannot be recovered. That is the point of the split.
  • The model still sees the photo for that one request. This seals the extracted record, not the camera frame in transit to the model.

main.dart

1 import 'package:omg_lens_sdk/omg_lens.dart';
2  
3 final sdk = await OmgLens.initialize(
4 licenseKey: 'OMGL-XXXXX-XXXXX-XXXXX-XXXXX',
5 appBundleId: 'com.example.myapp',
6 );
7 final scan = await sdk.scan(
8 photoBytes,
9 options: const ScanOptions(detectFace: true),
10 );
11  
12 // Public view. Strict leaves the name null until unmask.
13 print(scan.data.firstName?.english);
14 print(scan.usage?.remaining);
15  
16 if (scan.vault != null) {
17 final full = await sdk.unmask(scan);
18 print(full.documentNumber);
19 print(full.firstName?.english);
20 }
21 sdk.dispose();

Billing stays separate from the plan

Turn it on

Any organization can add it. It is not bundled into a tier. Owners and tenant admins start a separate subscription on the card already used for the plan. A system admin can also set the add-on to Off, Active, or Suspended.

If the add-on payment fails

Scanning continues. Encryption pauses until the add-on is paid. The plan itself is not suspended. A failed plan payment still suspends the account, the same as today.