Zero-knowledge identity

Prove you're Indian.
Reveal nothing.

Aadhaar-backed entry for your event in one React component. Your attendees scan once; you receive a verifiable proof, never their Aadhaar data.

No API key, no callback to host No PII crosses your servers Verify offline against one public key

Integrate in 3 steps

Install the package

npm i @digigo/verify

One dependency. Works in any React app.

Drop the component in your frontend

// wherever you gate entry — one component runs the whole QR flow
import { DigiGoVerify } from "@digigo/verify/react";

<DigiGoVerify
  eventKey="DEVCON-MUMBAI"
  onResult={(c) => fetch("/api/verify", {
    method: "POST",
    body: JSON.stringify({ proof: c.proof }),
  })}
/>

Renders the QR and runs the mint → poll flow, styled out of the box.onResult fires once with the credential; POST itsproof to your route.

Add the verify route

// app/api/verify/route.ts — the whole endpoint is one re-export
export { POST } from "@digigo/verify/server";

That one line is the whole endpoint. It fetches DigiGo's public JWKS once, then verifies every proof's signature locally. No secret, no callback to DigiGo.

What you receive

A small blob you verify cryptographically. No name, no Aadhaar number, no address, no photo.

{
  "format": "jws",
  "proof":  "eyJhbGciOiJFZ…",
  "publicSignals": {
    "indian": "INDIAN",
    "ageAbove18": true,
    "nullifier": "a3f9…",
    "eventCode": "DEVCON-MUMBAI"
  }
}
  • indianINDIAN · NOT_INDIAN
  • nullifierper-event pseudonym for de-dup — not an identity
  • ageAbove18only if the event asks for it

⚠ Absence is not "not Indian"

No smartphone, a failed face scan, a lapsed session, or someone who simply walked away all produce no credential — which is NOT_ESTABLISHED, not a negative. Treating a missing credential as "not Indian" wrongly rejects real Indians. Only ever act on a credential you received and verified.