Real-world scenarios
Concrete products you can build with OwlID. Each shows the user-facing flow plus the SDK calls that drive it.
1. Age gate for a bar / venue
Goal: confirm a customer is 18+ before serving alcohol. No name, no birthday — just the green check.
What the bar sees: valid: true, plus the issuer's public key (a trusted government IdP). Nothing else.
What the bar does NOT see: name, exact age, address, document number, photo.
Privacy properties:
- Per-credential salt prevents linking this proof to other venues.
- The challenge is single-use — a recorded token cannot be replayed.
- The user's passkey signs the token in the secure enclave; the wallet never exports key material.
2. EU-only marketplace listing
Goal: a service operates only in the EU and needs to confirm sellers are EU residents.
The proof is a Groth16 ZK proof that the seller's nationality belongs to the
27-member eu dataset (AT, BE, BG, …) — the verifier learns yes/no,
never the specific country. The dataset is registered in zk-circuits and
served by the verification service at GET /circuit-data/eu; the verifier
recomputes the canonical Merkle root server-side rather than trusting any
list the holder sends.
3. Hire-only-KYC-verified contractors
Goal: a remote-work platform requires every contractor to have completed at least KYC tier 2 with any approved provider.
Name comes back in plaintext (it's on the offer letter); KYC tier is a ZK predicate — the platform never sees the underlying KYC report.
4. Anti-bot signup (verified humans only)
Goal: a forum or event signup wants to confirm visitors are real humans without learning their identity.
The user proves they hold a credential issued by a trusted KYC provider, plus an age threshold. The signup form learns nothing else — no email, no document, no profile data — and gets bot-resistance for free.
5. Conference / event ticketing
Goal: gate access to a paid event. Each ticket is a credential issued at purchase; holders present a single-use proof at the door without exposing the QR-code-as-bearer-token pattern that gets screenshots resold on Telegram.
Issuance — when someone buys a ticket, your back office mints a credential bound to a holder public key (the user's wallet, registered at checkout):
At the door — the scanner runs a QR presentation flow, asking only for eventId, the validity window, and (for VIP-only fast-track) the tier:
Why it beats QR-image tickets:
- The token is single-use — the platform consumes the door's nonce on
verify(). A screenshot replays asvalid: false. - The wallet signs each token with the user's passkey at scan time. A photo of the wallet screen has no signing material.
- If a ticket is refunded or charged back, the issuer revokes the credential. The door's verifier sees the change in real time via
subscribeRevocations. - Hidden attributes stay hidden — you can put the buyer's name on the credential for support reasons without the door scanner ever reading it.
Per-session passes (multi-day badge): same credential, holder generates a fresh token per scan. Each scan binds to a new door challenge — no replay window.
Transferable tickets (resale market): set transferable: true and re-issue under the new buyer's key when ownership changes. Old credential goes on the revocation registry the same instant.
6. Anonymous voting / DAO membership
Goal: prove "I'm a member of this group" without revealing which member. Ring signatures attach a signature that any one of N ring keys could have produced — verifiers learn the holder is in the ring, not which one.
Verifier-side:
7. Stolen-device credential revocation
Goal: a user's phone is stolen. The issuer revokes the credential; subsequent verifications fail immediately and verifiers can drop cached results.
Issuer side (operator dashboard or your back office):
Verifier side, optional live invalidation:
Next verify() call returns { valid: false, error: 'Credential revoked' }.
8. GDPR right-to-erasure
Goal: an EU resident exercises their right to be forgotten. Their identifying data on the platform is anonymized; cryptographic audit trails remain hash-only.
The user (or their support rep) triggers erasure from the operator dashboard. The platform:
- Revokes every active credential bound to the holder's public key.
- Replaces stored claim data with anonymised placeholders.
- Retains hash-only audit records (compliance) but strips PII.
- Returns a signed receipt the user keeps as proof.
OwlID was designed so the platform mostly stores hashes already — there's very little PII to erase. The flow exists for compliance, not because the system retains a copy of the user's documents.
Common patterns
- Render the QR full-screen so phones don't have to crop the camera frame.
- Use a short challenge TTL (60 s) for unattended kiosks, longer (5 min) for online flows.
- Cache verification results keyed by token hash, expire on either TTL or a revocation push event.
- Map
result.errorto user-friendly messages — the platform returns codes likeCredential revoked,Token expired,Untrusted issuer. - For mobile-only verifiers, use
OwlVerifier.openPresentation()plus a deep link rather than QR.