Disclosures
A disclosure is what the user’s proof attests to. You configure them per flow in the Configure tab, and which ones are available depends on the product. There are two kinds:
- Predicates: a pass or fail answer (age, country, OFAC). The underlying value stays hidden.
- Reveals: the actual value of a document field, returned only when you ask for it.
Security level
Choose how strictly the document is checked:
- Standard: the document is genuine.
- Hi-security: the user also physically scanned the document’s chip.
Each flow’s predicate set is captured as a small config object, and that same object is echoed back to you on the webhook as proof_attributes (see Event catalog). The keys below are what that config looks like.
Age (predicate)
Available in Pre-KYC and Age Verification. Set a minimum age; the user proves they meet it without revealing their birth date.
{ "minimumAge": 18 }
Country (predicate)
Available in Pre-KYC (optional) and Sovereign (required — it’s the whole product). There are two mutually exclusive ways to restrict by issuing country (ISO 3166-1 alpha-3 codes):
-
Excluded countries — a denylist. The user proves their document’s country isn’t on it, without revealing which country it is.
{ "excludedCountries": ["PRK", "IRN"] } -
Included countries — an allowlist. Only documents from a listed country pass. Because the allowlist is checked against the holder’s disclosed nationality, an allowlist flow reveals the user’s nationality to you (the Nationality reveal is forced on).
{ "includedCountries": ["USA", "CAN"] }For a Sovereign flow this allowlist is the entire configuration (it can’t be empty, and there’s no OFAC or age rule alongside it). The dashboard’s picker offers region presets (EU, APAC, EMEA, LATAM, GCC) to fill it a bloc at a time.
OFAC (predicate)
Available in Pre-KYC, Age Verification, and Proof of Human (a toggle, on by default); Sovereign has no OFAC check. The user proves they don’t match the OFAC sanctions list, which Self keeps updated daily. On a match, the verification is rejected.
{ "ofac": true }
Proof of human (predicate)
The core of the Proof of Human product, and present implicitly in the others since every verification is backed by a genuine document. The user proves they’re a unique, real human via a nullifier derived from the document, stable per person within your organization (the same across all your products and flows), unlinkable across organizations. See How verification works.
Additional data (reveals)
Available in Pre-KYC. Beyond the pass or fail predicates, you can ask the user to disclose specific document fields. Each is off by default, so request only what you need:
Full name, ID number, Date of birth, Gender, Nationality, Expiration date, Issuing state.
A reveal returns the actual value, so it’s personal data you then have to handle responsibly. The fields you enable are requested from the user’s wallet, and on a successful verification their values are returned to you in the webhook’s proof_attributes (see Event catalog).
What is never disclosed
- Anything you didn’t configure. Predicates return only a pass or fail; reveals return only the fields you turned on.
- The user’s biometric data and the raw document scan, those never leave the device.
Related
- Anatomy of a flow.
- Supported documents: which documents can satisfy which rules.
- How verification works: the model behind these predicates.
Thanks for your feedback!