Verification Scenarios
zk-id includes 9 pre-configured verification scenarios for common real-world use cases. These scenarios compose age and nationality claims into named verification workflows, making it easy to implement compliant verification without understanding the underlying proof structure.
Quick Start
Here’s a complete example using the ADULT_CONTENT scenario for age verification:
import { SCENARIOS, createScenarioRequest } from '@zk-id/core';
import { ZkIdClient } from '@zk-id/sdk';
// 1. Server: Create scenario request
const scenarioRequest = createScenarioRequest(SCENARIOS.ADULT_CONTENT, 'server-nonce-12345');
// 2. Client: Use ZkIdClient to generate and verify proof
const client = new ZkIdClient({
verificationEndpoint: 'https://yoursite.com/api/verify',
});
// verifyScenario handles proof generation and server verification
const verified = await client.verifyScenario(scenarioRequest);
if (verified) {
console.log('✓ User verified as 18+');
// Grant access to age-restricted content
} else {
console.log('✗ Verification failed');
// Deny access
}
What happens: User proves they’re 18+ without revealing their birth date. The server only learns that age >= 18 is true.
For server-side verification, see the Integration Guide for multi-claim proof handling.
Available Scenarios
| Scenario | ID | Use Case | Requirements |
|---|---|---|---|
| US Voting Eligibility | VOTING_ELIGIBILITY_US | Voting eligibility | Age ≥ 18, US national |
| US Alcohol Purchase | ALCOHOL_PURCHASE_US | Alcohol sales | Age ≥ 21 |
| US Tobacco Purchase | TOBACCO_PURCHASE_US | Tobacco sales | Age ≥ 21 |
| US Gambling | GAMBLING_US | Online gambling | Age ≥ 21 |
| Senior Discount | SENIOR_DISCOUNT | Senior citizen discounts | Age ≥ 65 |
| US Rental Car | RENTAL_CAR_US | Car rental | Age ≥ 25 |
| EU GDPR Age Consent | EU_GDPR_AGE_CONSENT | GDPR age of consent | Age ≥ 16 |
| Adult Content Access | ADULT_CONTENT | Adult content access | Age ≥ 18 |
| Adult Content Performer | ADULT_CONTENT_PERFORMER | Performer verification (2257) | Age ≥ 18 |
| EU Citizenship | custom | Prove EU residency/citizenship | Nationality in EU member states |
| US or EU Residency | custom | Prove US or EU residency | Nationality in US or EU member states |
Scenario Details
US Voting Eligibility
ID: VOTING_ELIGIBILITY_US
Verify user meets requirements for voting in US federal elections.
Requirements:
- Age ≥ 18
- US nationality (ISO 3166-1: 840)
Use Cases:
- Voter registration systems
- Election information portals
- Civic engagement platforms
Example:
import { SCENARIOS, createScenarioRequest } from '@zk-id/core';
const request = createScenarioRequest(SCENARIOS.VOTING_ELIGIBILITY_US, 'nonce-from-server');
US Alcohol Purchase
ID: ALCOHOL_PURCHASE_US
Verify user meets legal drinking age in the United States.
Requirements:
- Age ≥ 21
Use Cases:
- Alcohol e-commerce
- Bar/restaurant age gates
- Liquor delivery services
Compliance Notes:
- Meets state-level alcohol sales requirements
- Consider additional identity verification for high-value transactions
US Tobacco Purchase
ID: TOBACCO_PURCHASE_US
Verify user meets legal tobacco purchase age in the United States (federal Tobacco 21 law).
Requirements:
- Age ≥ 21
Use Cases:
- Tobacco/vape e-commerce
- Age-gated tobacco product listings
- Retail POS systems
Compliance Notes:
- Federal law raised tobacco age to 21 in December 2019
- All US states must comply with Tobacco 21
US Gambling
ID: GAMBLING_US
Verify user meets legal gambling age for most US jurisdictions.
Requirements:
- Age ≥ 21
Use Cases:
- Online casinos
- Sports betting platforms
- Poker/gaming sites
Compliance Notes:
- Most states require 21+ for gambling
- Some jurisdictions allow 18+ for lottery/bingo (use custom scenario)
- Consider geolocation verification alongside age verification
Senior Discount
ID: SENIOR_DISCOUNT
Verify user qualifies for senior citizen discounts.
Requirements:
- Age ≥ 65
Use Cases:
- E-commerce discount verification
- Travel/transportation senior fares
- Entertainment/venue pricing
Privacy Benefit:
- Users prove eligibility without revealing exact age
- No need to upload ID or reveal birth date
US Rental Car
ID: RENTAL_CAR_US
Verify user meets standard age requirement for rental car companies (avoiding young driver surcharges).
Requirements:
- Age ≥ 25
Use Cases:
- Car rental booking systems
- Ride-sharing driver verification
- Vehicle insurance quotes
Compliance Notes:
- Many rental companies charge fees for drivers under 25
- This scenario verifies standard rate eligibility
EU GDPR Age of Consent
ID: EU_GDPR_AGE_CONSENT
Verify user meets GDPR age of consent for data processing (Article 8).
Requirements:
- Age ≥ 16
Use Cases:
- EU social media platforms
- Online services targeting children
- GDPR-compliant data collection
Compliance Notes:
- GDPR Article 8 sets 16 as default age of consent
- Member states may lower to 13 (check local law)
- Parental consent required below threshold
References:
Adult Content Access
ID: ADULT_CONTENT
Verify user is 18+ for accessing adult content (customer/viewer age gate).
Requirements:
- Age ≥ 18
Use Cases:
- Adult content platforms
- Age-restricted media streaming
- Dating apps (18+ sections)
Compliance Notes:
- Meets UK Online Safety Act requirements for age verification
- Compliant with EU Digital Services Act age verification obligations
- Privacy-preserving alternative to uploading ID documents
Privacy Benefit:
- Users prove they’re 18+ without revealing birth date
- No identity document storage required
- Zero-knowledge proofs prevent tracking across sites
References:
Adult Content Performer
ID: ADULT_CONTENT_PERFORMER
Verify performer is 18+ for adult content production (2257 compliance).
Requirements:
- Age ≥ 18
Use Cases:
- Adult content production platforms
- Performer onboarding systems
- 2257 record-keeping compliance
Compliance Notes:
- US 18 USC § 2257 requires maintaining records of performer age
- This scenario provides zero-knowledge age verification
- Important: 2257 still requires maintaining performer identification records; zk-id provides privacy-preserving age verification but does not replace full 2257 compliance obligations
- Consider combining with traditional ID verification for record-keeping
Privacy Benefit:
- Performers can prove age to platforms without revealing birth date to public viewers
- Age verification can be separated from public performer profiles
References:
Using Scenarios
Basic Usage
import { SCENARIOS, createScenarioRequest, verifyScenario } from '@zk-id/core';
// Create a verification request
const request = createScenarioRequest(SCENARIOS.ADULT_CONTENT, 'server-nonce');
// User generates proof (client-side)
const proof = await generateMultiClaimProof(credential, request);
// Server verifies proof
const result = await verifyMultiClaimProof(proof, verificationKeys);
// Check scenario satisfaction
const scenarioResult = verifyScenario(SCENARIOS.ADULT_CONTENT, result);
if (scenarioResult.satisfied) {
console.log('Age verified! User is 18+');
} else {
console.log('Failed claims:', scenarioResult.failedClaims);
}
Listing All Scenarios
import { listScenarios } from '@zk-id/core';
const allScenarios = listScenarios();
allScenarios.forEach((scenario) => {
console.log(`${scenario.name}: ${scenario.description}`);
});
Getting Scenario by ID
import { getScenarioById } from '@zk-id/core';
const scenario = getScenarioById('adult-content');
if (scenario) {
console.log(`Found: ${scenario.name}`);
}
EU Citizenship
Prove nationality is an EU member state without revealing which country. Uses the nationality-set-verify circuit.
Requirements:
- Nationality is one of the 27 EU member states (ISO 3166-1 numeric)
Use Cases:
- EU-only service access
- eIDAS 2.0 cross-border recognition
- EU residency verification for financial services
- DSA compliance — verify “EU user” without profiling specific nationality
Example:
import { REGION_EU } from '@zk-id/core';
const euCitizenshipScenario = {
id: 'eu-citizenship',
name: 'EU Citizenship',
description: 'Prove EU citizenship without revealing specific member state',
claims: [
{
label: 'eu-member',
claimType: 'nationality-set',
allowedCodes: REGION_EU,
},
],
};
const verified = await client.verifyScenario(euCitizenshipScenario);
Privacy Benefit:
- Proves the user is an EU citizen without revealing which of the 27 member states
- Zero-knowledge: verifier learns only “is/is not EU citizen”
- No personal data (birth date, national ID, exact nationality) transmitted
US or EU Residency
Prove nationality is in the US or any EU member state. Useful for services open to “Western” markets or GDPR-adjacent compliance.
Requirements:
- Nationality is USA (840) or any of the 27 EU member states
Example:
import { REGION_US_EU } from '@zk-id/core';
const usOrEuScenario = {
id: 'us-or-eu-residency',
name: 'US or EU Residency',
description: 'Verify user is from the US or an EU member state',
claims: [
{
label: 'us-or-eu',
claimType: 'nationality-set',
allowedCodes: REGION_US_EU,
},
],
};
Custom Scenarios
You can define custom scenarios for your specific requirements:
import { VerificationScenario, createScenarioRequest } from '@zk-id/core';
const customScenario: VerificationScenario = {
id: 'airline-unaccompanied-minor',
name: 'Airline Unaccompanied Minor',
description: 'Verify child is 5-14 years old for unaccompanied minor service',
claims: [
{
label: 'min-age',
claimType: 'age',
minAge: 5,
},
{
label: 'max-age',
claimType: 'age',
minAge: 15,
inverted: true, // Proves age < 15
},
],
};
const request = createScenarioRequest(customScenario, 'nonce');
Scenario Architecture
Scenarios are composable verification workflows built on the multi-claim system:
- Scenario Definition — Named combination of claims (age, nationality, etc.)
- Request Creation — Generate multi-claim request from scenario
- Proof Generation — User generates ZK proof for all claims (client-side)
- Verification — Server verifies all proofs in the multi-claim
- Scenario Satisfaction — Check if all claims passed
Benefits:
- Reusability — Define once, use across your application
- Composability — Combine age, nationality, and future claim types
- Type Safety — TypeScript interfaces prevent configuration errors
- Standards — Built on W3C Verifiable Credentials data model
Compliance Mapping
| Scenario | Regulations | Documentation |
|---|---|---|
| Adult Content Access | UK OSA 2023, EU DSA | Compliance Guide |
| Adult Content Performer | US 18 USC § 2257 | Compliance Guide |
| EU GDPR Age Consent | GDPR Article 8 | Compliance Guide |
| US Voting Eligibility | Federal voting law (26 USC § 18) | Standards |
| Alcohol/Tobacco Purchase | State/federal sales laws | Integration Guide |
| Gambling | State gambling regulations | Integration Guide |
Next Steps
- Review Compliance Documentation for regulatory mapping
- See Integration Guide for implementation examples
- Check API Reference for detailed API documentation
- Read Protocol Specification for technical details