Introduction
LKP lets your users prove facts about themselves (their age, nationality or audience size) without sharing the underlying documents with you.
Run your first verification in about 15 minutes.
Credentials, proofs, nullifiers and what each party sees.
Every endpoint, field and error code.
Get notified the moment a user verifies.
What you get#
When a user completes a verification, your server receives:
- A yes for every requirement you asked for, for example “18 or older” and “nationality: Netherlands”. LKP verifies the zero-knowledge proofs on its servers before anything reaches you.
- An anonymous user ID (the nullifier). It is stable for the same wallet in your app and different in every other app, so you can recognise returning users and block duplicate sign-ups from that wallet without being able to track anyone across services. It is not a biometric unique-human ID.
- Optionally, a signed ID token (an RS256 JWT) you can verify against our public keys.
You never receive a name, birth date, document image, document number or social handle. LKP does not persist them. Document images and KYC telemetry are processed by Didit under Didit's policy, not stored in LKP's database.
Two sides of the platform#
The free LKP wallet: verify once with an ID, phone, email or account, then prove facts anywhere.
Create an account, get API keys, and watch verifications and conversion in the console.
Supported checks#
| Requirement | Credential | Source | Status |
|---|---|---|---|
| AGE_OVER | Government ID | Didit | Live |
| COUNTRY_EQUALS | Government ID | Didit | Live |
| AGE_AT_MOST | Government ID | Didit | Live |
| SEX_EQUALS | Government ID | Didit | Live |
| DOCUMENT_VALID_FOR | Government ID | Didit | Live |
| DOCUMENT_TYPE_EQUALS | Government ID | Didit | Live |
| ISSUING_COUNTRY_EQUALS | Government ID | Didit | Live |
| FULL_NAME_EQUALS | Government ID | Didit | Live |
| DOCUMENT_NUMBER_EQUALS | Government ID | Didit | Live |
| RESIDENCE_COUNTRY_EQUALS | Government ID | Didit | Live |
| PHONE_VERIFIED | Phone number | Didit | Live |
| PHONE_COUNTRY_EQUALS | Phone number | Didit | Live |
| PHONE_NUMBER_EQUALS | Phone number | Didit | Live |
| EMAIL_VERIFIED | Work or school email | Didit | Live |
| EMAIL_DOMAIN_EQUALS | Work or school email | Didit | Live |
| EMAIL_ADDRESS_EQUALS | Work or school email | Didit | Live |
| FOLLOWERS_AT_LEAST | TLSNotary | Live | |
| INSTAGRAM_USERNAME_EQUALS | TLSNotary | Live | |
| INSTAGRAM_POSTS_AT_LEAST | TLSNotary | Live | |
| INSTAGRAM_VERIFIED | TLSNotary | Live | |
| X_FOLLOWERS_AT_LEAST | X | X | Live |
| X_USERNAME_EQUALS | X | X | Live |
| X_ACCOUNT_AGE_AT_LEAST | X | X | Live |
| X_VERIFIED | X | X | Live |
| X_POSTS_AT_LEAST | X | X | Live |
| TIKTOK_FOLLOWERS_AT_LEAST | TikTok | TikTok | Live |
| TIKTOK_USERNAME_EQUALS | TikTok | TikTok | Live |
| TIKTOK_LIKES_AT_LEAST | TikTok | TikTok | Live |
| TIKTOK_VERIFIED | TikTok | TikTok | Live |
| TIKTOK_VIDEOS_AT_LEAST | TikTok | TikTok | Live |
| GITHUB_FOLLOWERS_AT_LEAST | GitHub | GitHub | Live |
| GITHUB_USERNAME_EQUALS | GitHub | GitHub | Live |
| GITHUB_ACCOUNT_AGE_AT_LEAST | GitHub | GitHub | Live |
| GITHUB_TWO_FACTOR | GitHub | GitHub | Live |
| GITHUB_REPOS_AT_LEAST | GitHub | GitHub | Live |
| GITHUB_CONTRIBUTIONS_AT_LEAST | GitHub | GitHub | Live |
| GITHUB_ORG_MEMBER | GitHub | GitHub | Live |
| BALANCE_AT_LEAST | Bank account | Enable Banking | Live |
| BANK_ACCOUNT_EQUALS | Bank account | Enable Banking | Live |
| BANK_HOLDER_EQUALS | Bank account | Enable Banking | Live |
Parameters, limits and examples for each are in Verification types.
Prefer to see it first? The live demo shows a store using LKP next to the exact API traffic.