Manav.id
Quickstart

Ship verified-human in 5 lines.

Install the SDK, init with the public demo key, call verify(). You'll get a yes/no verdict and a trust score in under 500ms. Works on localhost without provisioning a production key.

import { Manav } from '@manav/sdk';

const manav = new Manav({ apiKey: 'mnv_demo_public_key' });
const result = await manav.verify({ email: '[email protected]' });

console.log(result.is_human, result.trust_score);
// true 87

Install the SDK

SDKs published to npm, PyPI, Go modules, RubyGems, and Maven Central.

npm install @manav/sdk
pip install manav
go get github.com/manav-protocol/manav-go
gem install manav

Authentication

All API calls authenticate with a bearer token in the Authorization header.

Authorization: Bearer mnv_live_4f81c0a3b...

The public demo key mnv_demo_public_key is rate-limited to 60 req/min and clearly marked as test traffic on every proof page. Production keys are provisioned within 24 hours of email request to [email protected].

Core endpoint

POST /v1/verify

POSThttps://api.manav.id/v1/verify

Returns a yes/no verdict for whether the email belongs to a verified human, plus a trust score 0-100 and the underlying signals.

Request

FieldTypeRequiredNotes
emailstringyesRFC-5321 compliant email address
contextstringnoFree-text label, e.g. "hiring/application"
anchorstringnoExternal reference ID for receipt anchoring
thresholdintnoOverride default verdict threshold (default 50)

Response

{
  "is_human": true,
  "trust_score": 87,
  "reason": "verified_human",
  "signals": {
    "verified_at": "2024-09-12",
    "platforms": 6,
    "biometric_anchor": "sha256:7c4a8d…"
  },
  "key_id": "k_demo_2026q1",
  "proof_url": "https://manav.id/proof/?slug=mnv_demo_a8x9c2",
  "latency_ms": 312
}

GET /v1/receipts/:id

GEThttps://api.manav.id/v1/receipts/{id}

Returns the signed receipt for a verification. The receipt verifies offline against the Ed25519 key published at /.well-known/manav-keys.

POST /v1/delegations

POSThttps://api.manav.id/v1/delegations

Issues a scoped delegation token for an AI agent acting on behalf of a verified human. The agent then signs each action under the delegation; the chain verifies back to the originating human passkey.

const delegation = await manav.delegate({
  delegateKey:   agentPublicKey,
  scope: {
    actions:     ['approve_wire_transfer'],
    constraints: { amount: { currency: 'USD', max: 50000 } }
  },
  notAfter:      '2026-08-01T00:00:00Z',
  maxChainDepth: 1
});

Trust score

A 0-100 integer derived from verification recency, platform breadth, biometric anchor strength, and behavioural signals. Higher = more confident this is a real, accountable human.

BandInterpretationTypical use
90-100Strong verified human, long historyHigh-trust actions (wire transfers, admin)
60-89Verified human, moderate historyDefault threshold for most flows
30-59Likely human, low historyStep-up to passkey before proceeding
0-29Likely non-human or fraud patternRefuse or require manual review

Receipt format

Every verification produces a signed receipt, a small JSON object that binds the action's canonical hash to a per-context pseudonymous key plus the issuer's Ed25519 signature.

Offline verification

Any party that fetches Manav's published Ed25519 key once can verify any receipt independently, no callback to Manav required. A Manav outage does not break verification.

import { verifyReceipt } from '@manav/verify';

const jwks   = await fetch('https://manav.id/.well-known/manav-keys');
const result = await verifyReceipt(receipt, jwks);
// { ok: true, actor: 'pk_acme_4f81...', action: 'verify' }

Error codes

400
invalid_email- RFC-5321 parse failure
401
invalid_api_key- Bearer token missing or unrecognised
429
rate_limited- Demo key exceeded 60 req/min
503
graph_unavailable- Human graph temporarily unreachable; retry with exponential backoff

Webhooks

Configure a webhook URL in the dashboard. Receive verify.completed, delegation.revoked, and receipt.disputed events. HMAC-signed with your endpoint secret. Live test send from the dashboard delivers in under two seconds.

Rate limits

TierLimitBurst
Demo (public)60 req/min10 req/sec
Free10k req/month50 req/sec
ProNo fixed cap500 req/sec
EnterpriseCustomCustom

429 responses include Retry-After in seconds.