Authentication where a breach exposes nothing.

A drop-in identity API built on zero-knowledge cryptography. The biometric never leaves the device. The server never sees it. What we store cannot be reversed, replayed, or sold.

00
Secrets stored
The database holds commitments, not credentials.
00
Bytes transmitted
The proof leaves the device. The biometric never does.
100%
Mathematically verified
Soundness reduces to discrete-log on BN128.
Live demo

A signup, end to end.

A real-time simulation of the protocol — enrollment, client-side proof generation, on-chain anchoring, and verification. The biometric never leaves the simulated device.

Quickstart

Up and running in five lines.

Spin up a tenant from the dashboard, grab an API key, and start issuing zero-knowledge proofs from any backend. SDKs for Node and Python; the REST API works from anywhere.

01Get an API key

Sign up to create a tenant. You'll get a za_test_… key for development and a separate za_live_… key for production.

02Register a user

POST a Poseidon commitment from the client SDK. ZeroAuth stores the commitment — never the underlying biometric.

03Verify the proof

On every login, send the Groth16 proof to /v1/verifications. Get back a verified principal in under 100 ms.

# 1. Register a user with a commitment
curl -X POST https://api.zeroauth.dev/v1/users/register \
  -H "Authorization: Bearer $ZEROAUTH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "external_id": "user_42",
    "commitment": "0x1f3c…"
  }'

# 2. Verify a Groth16 proof at login
curl -X POST https://api.zeroauth.dev/v1/verifications \
  -H "Authorization: Bearer $ZEROAUTH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "external_id": "user_42",
    "proof": { "a": [...], "b": [...], "c": [...] },
    "public_signals": ["0x1f3c…"]
  }'
import { ZeroAuth } from '@zeroauth/sdk';

const za = new ZeroAuth({ apiKey: process.env.ZEROAUTH_API_KEY });

// 1. Register a user from your backend
await za.users.register({
  externalId: 'user_42',
  commitment,                       // from client SDK
});

// 2. Verify a proof on login
const { verified, principal } = await za.verifications.create({
  externalId: 'user_42',
  proof,
  publicSignals,
});

if (verified) issueSession(principal);
from zeroauth import ZeroAuth

za = ZeroAuth(api_key=os.environ["ZEROAUTH_API_KEY"])

# 1. Register a user
za.users.register(
    external_id="user_42",
    commitment=commitment,
)

# 2. Verify a proof
result = za.verifications.create(
    external_id="user_42",
    proof=proof,
    public_signals=public_signals,
)

if result.verified:
    issue_session(result.principal)
How it works

Three steps. Zero secrets exposed.

The user proves they hold a biometric on their device. Only a Poseidon commitment and a Groth16 proof ever cross the network. Raw embeddings stay in memory and are destroyed after hashing.

01 — Enroll locally

User enrolls on-device

The user creates a credential on their own device. A cryptographic commitment is generated and stored — never the credential itself.

// On the user's device
const secret      = generateCredential();
const commitment  = poseidonHash(secret);
register({ commitment });
02 — Prove without revealing

ZK proof generated client-side

At login, a Groth16 zero-knowledge proof is generated on the device. It mathematically proves the user knows the credential — without transmitting any part of it.

// Client-side proof generation
const proof = await groth16.prove(
  circuit, { secret, commitment }
);
authenticate({ proof });
03 — Verify, on or off chain

Succinct verification

Proofs are verified against the commitment using succinct verification. Works on-chain via smart contracts or off-chain with a lightweight verifier.

// Server or smart contract
const valid = groth16.verify(
  verificationKey, proof, signals
);
// secrets exposed: 0
Built for developers

Everything you expect from a modern auth API.

A typed REST API, a developer console, granular audit logs, and a separation between live and test environments — so you can ship without flying blind.

REST & SDKs

A typed REST API with first-party SDKs for Node and Python. Predictable error codes and idempotent writes.

Live + test keys

Two isolated environments per tenant. Mint, rotate, and revoke za_live_ / za_test_ keys from the dashboard.

Audit log

Every signup, verification, key rotation, and device event — searchable, exportable, and tamper-evident.

Devices & attestation

Register hardware devices, attach battery + location telemetry, and tie verifications back to a specific endpoint.

Verify in < 100 ms

Groth16 verification on a single core. Run it inside our API or self-host the verifier — the math is the same.

Open source

API, dashboard, circuits, and docs are on GitHub. Audit it. Self-host it. Fork it.

What a breach costs

A $25M lesson, side by side.

In October 2023, Okta's support breach exposed every support customer's data and shaved more than 11% off the share price. In May 2024 an Indian contractor leaked 496 GB of biometric data. Here is the same scenario, with ZeroAuth.

Traditional auth · Okta breach

The cost of stored credentials

October 2023
Records exposedAll support customers
Incident response$2.1M+
Legal & regulatory$8M+
Customer churn$15M+
Stock price impact−11.6%
Total damage $25M+
ZeroAuth · same scenario

The cost of zero-knowledge

Database fully exfiltrated
Records exposed0 usable
Incident response$0
Legal & regulatory$0
Customer churn$0
Credential resetNone required
Total damage $0
Engineering

No magic. Just primitives, written down.

Every cryptographic choice, every architectural decision, every threat is documented in the open. The full source — verifier, circuit, on-chain contracts — is MIT licensed.

Stack
TypeScript · PostgreSQL · Circom · SolidityNode 20, strict mode. Hardhat for contracts. snarkjs for verification.
Crypto
Groth16 · BN128 · Poseidon · SHA-256Peer-reviewed primitives. Soundness reduces to discrete-log on BN128.
L2
Base Sepolia · DIDRegistry · Groth16VerifierOn-chain anchoring of identity commitments. Publicly auditable.
Audit
Append-only event log · Hash-chainedEvery write produces a verifiable row. Chain integrity is checkable from any commit.
Enterprise

SOC 2, SSO, or a private deployment?

Self-serve gets you to production for most workloads. For regulated industries or on-prem requirements, our team works directly with your security org — no rip-and-replace required.

Zero-trust by default

Your database becomes worthless to attackers. No password hashes, no tokens, no session secrets to exfiltrate.

Drop-in integration

Works alongside your existing IdP. Integrates via standard APIs and SDKs. Deploy in days, not quarters.

Compliance-ready

Designed for SOC 2, GDPR, DPDP, and HIPAA. Less data stored means less data to govern.

Mathematically proven

Built on peer-reviewed cryptographic primitives: Groth16 proofs, Poseidon hashing, and elliptic-curve pairings.

White paper

The cryptographic foundation.

Pramaan is the zero-knowledge biometric identity protocol underlying ZeroAuth. The paper describes the construction, the security reductions, the on-chain anchoring model, and the operational guarantees in detail.

Written for cryptographers and platform engineers. Includes the formal proof of soundness, the circuit specification, and the recommended deployment topology.

Patent
Indian Patent IN202311041001 · Granted
Format
PDF · 36 pages

36-page PDF, delivered to your inbox. We never share emails.