Skip to main content

API Reference

ZeroAuth is a hosted API. No packages to install — authenticate with an API key and make HTTP calls.

Base URL

https://zeroauth.dev

Authentication

All /v1/* endpoints require an API key:

# Option A: Authorization header (recommended)
-H "Authorization: Bearer za_live_YOUR_KEY"

# Option B: X-API-Key header
-H "X-API-Key: za_live_YOUR_KEY"

Get your API key: Quickstart -> Step 1

For the reusable Week 1 product core, see Central API.

Response Headers

Every authenticated response includes rate limit info:

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 97
X-RateLimit-Reset: 1710412800
X-ZeroAuth-Tenant: a1b2c3d4-...
X-ZeroAuth-Plan: free

ZKP Authentication

POST /v1/auth/zkp/register

Register a new biometric identity. The biometric template is processed on the server, a Poseidon commitment is generated, and the template is immediately discarded.

Required scope: zkp:register

Request:

curl -X POST https://zeroauth.dev/v1/auth/zkp/register \
-H "Authorization: Bearer za_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"biometricTemplate": "BASE64_ENCODED_DATA"}'

Response (201):

{
"did": "did:zeroauth:base:8f3ac2d1...",
"commitment": "12345678901234567890",
"didHash": "98765432109876543210",
"biometricSecret": "11111111111111111111",
"salt": "22222222222222222222",
"txHash": "0xabc123...",
"blockNumber": 38817143,
"dataStored": false,
"message": "Identity registered. Store biometricSecret and salt securely on the client."
}

Errors: 400 invalid template, 401 bad API key, 403 insufficient scope, 429 rate limited


POST /v1/auth/zkp/verify

Verify a Groth16 zero-knowledge proof and issue session tokens.

Required scope: zkp:verify

Request:

curl -X POST https://zeroauth.dev/v1/auth/zkp/verify \
-H "Authorization: Bearer za_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"proof": {
"pi_a": ["1", "2", "1"],
"pi_b": [["1", "2"], ["3", "4"], ["1", "0"]],
"pi_c": ["5", "6", "1"],
"protocol": "groth16",
"curve": "bn128"
},
"publicSignals": ["<commitment>", "<didHash>", "<identityBinding>"],
"nonce": "8eb8b0db-c143-4e29-8e6c-6c26078ba2c8",
"timestamp": "2026-03-14T10:30:00.000Z"
}'

Response (200):

{
"accessToken": "eyJhbGci...",
"refreshToken": "eyJhbGci...",
"tokenType": "Bearer",
"expiresIn": 3600,
"verified": true,
"sessionId": "6e92d480-...",
"provider": "zkp",
"dataStorageConfirmation": {
"biometricDataStored": false,
"message": "Zero biometric data stored. Ever."
}
}

Errors: 401 proof failed or bad API key, 429 rate limited

Validation rules:

  • Timestamp must be within 5 minutes of server time
  • Nonce must be UUID v4 format
  • publicSignals must contain exactly 3 elements

GET /v1/auth/zkp/nonce

Generate a fresh nonce for client-side proof generation.

Required scope: nonce:create

curl https://zeroauth.dev/v1/auth/zkp/nonce \
-H "Authorization: Bearer za_live_YOUR_KEY"

Response:

{
"nonce": "8eb8b0db-c143-4e29-8e6c-6c26078ba2c8",
"timestamp": "2026-03-14T10:30:00.000Z",
"expiresIn": 300
}

GET /v1/auth/zkp/circuit-info

Returns circuit metadata for client-side proof generation setup.

Required scope: zkp:verify

curl https://zeroauth.dev/v1/auth/zkp/circuit-info \
-H "Authorization: Bearer za_live_YOUR_KEY"

Response:

{
"circuit": "identity_proof",
"protocol": "groth16",
"curve": "bn128",
"wasmPath": "circuits/build/identity_proof_js/identity_proof.wasm",
"vkeyAvailable": true,
"verifyOnChain": false,
"publicInputs": ["commitment", "didHash", "identityBinding"],
"privateInputs": ["biometricSecret", "salt"]
}

SAML SSO

GET /v1/auth/saml/login

Initiate SAML SSO flow.

Required scope: saml:login

curl https://zeroauth.dev/v1/auth/saml/login \
-H "Authorization: Bearer za_live_YOUR_KEY"

POST /v1/auth/saml/callback

Process SAML assertion from IdP. Returns session tokens.

Required scope: saml:callback

GET /v1/auth/saml/metadata

Returns SP metadata XML for IdP configuration.

Required scope: saml:login


OIDC / OAuth 2.0

GET /v1/auth/oidc/authorize

Initiate OIDC authorization code flow with PKCE.

Required scope: oidc:authorize

curl https://zeroauth.dev/v1/auth/oidc/authorize \
-H "Authorization: Bearer za_live_YOUR_KEY"

POST /v1/auth/oidc/callback

Handle OIDC authorization code callback. Returns session tokens.

Required scope: oidc:callback


Identity & Sessions

GET /v1/identity/me

Get the authenticated user's profile from a session token.

Required scope: identity:read

Additional header: X-Session-Token: <access_token from verify response>

curl https://zeroauth.dev/v1/identity/me \
-H "Authorization: Bearer za_live_YOUR_KEY" \
-H "X-Session-Token: eyJhbGci..."

POST /v1/identity/logout

Invalidate a user's session.

Required scope: identity:read

POST /v1/identity/refresh

Refresh a user's session tokens.

Required scope: identity:read

Body: { "refreshToken": "eyJhbGci..." }


Developer Console

These endpoints manage your ZeroAuth account. They use console session tokens, not API keys.

POST /api/console/signup

Create a developer account. Returns console token + first API key.

{ "email": "dev@co.com", "password": "secure123", "companyName": "Co" }

POST /api/console/login

Authenticate. Returns console token.

{ "email": "dev@co.com", "password": "secure123" }

GET /api/console/keys

List all API keys (active + revoked). Requires console token.

POST /api/console/keys

Create a new API key. Requires console token.

{ "name": "Production", "environment": "live", "scopes": ["zkp:verify"] }

DELETE /api/console/keys/:keyId

Revoke an API key. Irreversible. Requires console token.

GET /api/console/usage

Get usage summary, monthly history, and recent API calls.

GET /api/console/account

Get current account info (plan, limits, status).


Health

GET /api/health

No authentication required. Returns service status and subsystem health.


Error Format

All errors follow a consistent format:

{
"error": "error_code",
"message": "Human-readable description",
"docs": "/docs/relevant-page"
}

Common error codes:

CodeHTTPDescription
missing_api_key401No API key provided
invalid_api_key401Key is invalid, expired, or revoked
insufficient_scopes403Key lacks required permissions
tenant_inactive403Account suspended or deactivated
rate_limit_exceeded429Too many requests
monthly_quota_exceeded429Monthly quota exhausted
proof_verification_failed401ZK proof did not verify