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

ScenarioIDUse CaseRequirements
US Voting EligibilityVOTING_ELIGIBILITY_USVoting eligibilityAge ≥ 18, US national
US Alcohol PurchaseALCOHOL_PURCHASE_USAlcohol salesAge ≥ 21
US Tobacco PurchaseTOBACCO_PURCHASE_USTobacco salesAge ≥ 21
US GamblingGAMBLING_USOnline gamblingAge ≥ 21
Senior DiscountSENIOR_DISCOUNTSenior citizen discountsAge ≥ 65
US Rental CarRENTAL_CAR_USCar rentalAge ≥ 25
EU GDPR Age ConsentEU_GDPR_AGE_CONSENTGDPR age of consentAge ≥ 16
Adult Content AccessADULT_CONTENTAdult content accessAge ≥ 18
Adult Content PerformerADULT_CONTENT_PERFORMERPerformer verification (2257)Age ≥ 18
EU CitizenshipcustomProve EU residency/citizenshipNationality in EU member states
US or EU ResidencycustomProve US or EU residencyNationality 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

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:

  1. Scenario Definition — Named combination of claims (age, nationality, etc.)
  2. Request Creation — Generate multi-claim request from scenario
  3. Proof Generation — User generates ZK proof for all claims (client-side)
  4. Verification — Server verifies all proofs in the multi-claim
  5. 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

ScenarioRegulationsDocumentation
Adult Content AccessUK OSA 2023, EU DSACompliance Guide
Adult Content PerformerUS 18 USC § 2257Compliance Guide
EU GDPR Age ConsentGDPR Article 8Compliance Guide
US Voting EligibilityFederal voting law (26 USC § 18)Standards
Alcohol/Tobacco PurchaseState/federal sales lawsIntegration Guide
GamblingState gambling regulationsIntegration Guide

Next Steps