Age verification without storing a birthdate
The unlinkability implementation described here is unaudited.
With that said: a checkout, a door, or a rental counter can receive a cryptographic yes to "is this person over 18?" without ever seeing a birthdate, a document number, or a name.
The mechanism
A standard KYC check verifies a full date of birth once, at issuance. Everywhere after that, the same check gets repeated in full, the same DOB handed to the hotel, the SIM dealer, the age-gated checkout, because there was never a way to prove just the threshold. Selective disclosure changes what crosses the wire, not what was checked.
The holder's credential contains the DOB, signed by whoever issued it. At presentation time, the holder's wallet derives a predicate proof, a cryptographic statement of the form "the signed date of birth satisfies age ≥ 18", without disclosing the date itself. The verifier's software checks that the proof is valid against the issuer's public key and gets a boolean. It never receives, stores, or logs the underlying birthdate. This is what selective disclosure means in practice: not redaction after the fact, but a proof constructed so the excluded fields were never transmitted.
Put simply: the calendar date never leaves the holder's device. Only an abstract proof token, not a copy of the date, not a truncated version of it, crosses the boundary to the gate.
Why this is the universal reuse primitive
Age verification needs no AML screening, no sanctions check, no document retention obligation of its own, it's a single predicate over a field that almost every identity credential already carries. That makes it the cleanest possible demonstration of what a reusable credential is for: it's not a new verification event, it's a free byproduct of one that already happened elsewhere.
A hotel guest-registration credential, a telecom SIM-activation credential, or a full KYC credential from any regulated onboarding, any of them, once issued at ≥L1 assurance, can emit an age-threshold proof at zero marginal verification cost. The retailer isn't asking the user to prove their age from scratch; they're asking whichever credential the user already holds to answer one narrow question about itself. This is the cross-vertical case for credential portability: the same underlying identity fact gets reused across contexts that have nothing else in common.
What this looks like for a buyer
For a POS or checkout vendor, this slots in as an optional fast lane bolted onto an existing flow, not a replacement for a clerk's or door staff's right to check ID manually. A cashier or bouncer who wants to look at a physical document still can. What this adds is a machine-checkable path for the cases where a manual check either isn't practical (self-checkout, an unattended kiosk, an online age-gated purchase) or is redundant with a check the customer already passed elsewhere. Solidus's protocol-floor unit economics put the marginal cost of a threshold check at a modeled fraction of a cent, math shown at /pricing, well below a repeated full KYC re-check, though the first check against any new issuer still costs more than a cached one, since there's no reuse to draw on yet.
The honesty limit
Zero-data is an architecturally true claim about what crosses the wire: it is not a claim that this eliminates circumvention. A credential holder can hand an unlocked phone to someone underage, exactly as a physical ID can be handed over at a counter today. Selective disclosure closes the data-exposure problem; it does not close the human-trust problem, and no age-verification method, cryptographic or physical, does. It's also worth stating plainly what this doesn't do: accepting a reused age-proof doesn't discharge a retailer's own regulatory age-verification obligation where one exists, it's a convenience and a cost reduction on top of that obligation, not a substitute for it.
See it run
This page describes the mechanism; it doesn't re-run the proof. The actual runnable artifact, two BBS+ presentations from the same holder, shown to share nothing correlatable, lives at /docs/unlinkability-demo. It's the same underlying construction described here, borrowed rather than duplicated: npm i @solidus-network/auth, run the bundled demo, no account required.