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].
POST /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
| Field | Type | Required | Notes |
|---|---|---|---|
| string | yes | RFC-5321 compliant email address | |
| context | string | no | Free-text label, e.g. "hiring/application" |
| anchor | string | no | External reference ID for receipt anchoring |
| threshold | int | no | Override 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
Returns the signed receipt for a verification. The receipt verifies offline against the Ed25519 key published at /.well-known/manav-keys.
POST /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.
| Band | Interpretation | Typical use |
|---|---|---|
| 90-100 | Strong verified human, long history | High-trust actions (wire transfers, admin) |
| 60-89 | Verified human, moderate history | Default threshold for most flows |
| 30-59 | Likely human, low history | Step-up to passkey before proceeding |
| 0-29 | Likely non-human or fraud pattern | Refuse 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
invalid_email- RFC-5321 parse failureinvalid_api_key- Bearer token missing or unrecognisedrate_limited- Demo key exceeded 60 req/mingraph_unavailable- Human graph temporarily unreachable; retry with exponential backoffWebhooks
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
| Tier | Limit | Burst |
|---|---|---|
| Demo (public) | 60 req/min | 10 req/sec |
| Free | 10k req/month | 50 req/sec |
| Pro | No fixed cap | 500 req/sec |
| Enterprise | Custom | Custom |
429 responses include Retry-After in seconds.