Developers · Human verification API

Build with
proof of human.

Issue a seal — a verifiable credential — with one API call. Anyone can check it offline, free.

  • REST + MCP
  • Standard JWTs
  • No card to start
Developer at a desk at dusk, wiring up a human verification API
Signature valid5arz-oracle-2 · ES256
32
API endpoints
9
MCP tools for agents
ES256
JWT signatures
$0
to check any seal
How the pieces fit

One call to issue. Zero calls to check.

Your server Holds the key. Asks for a seal.
api.5arz.com Signs with 5arz-oracle-2
Anyone verifies Offline, with our public key.
Quickstart

From key to verified seal.

  1. Get a key

    • Free plan: 1,000 seals + 10 document checks a month
    • API and MCP access, no card
    • Free test key for the sandbox, live key for production
    Get a free key →
    # .env — keep it on your server
    ARZ_KEY=arz_test_••••••••••••

    # for production
    ARZ_KEY=arz_live_••••••••••••
  2. Get a credential

    These endpoints cover most apps. Credentials come as a signed JWT, or as an SD-JWT VC (sd_jwt_vc).

    Full OpenAPI spec
    Endpoint · api.5arz.comReturns
    POST /api/agents/registerCreate an API keyAPI key
    POST /api/agents/verifyMint a PoHF credential: a person did thispohf_jwt
    POST /api/agents/verify-personhoodMint a proof-of-personhood credentialpop_jwt
    GET /api/attestations/{id}Fetch a receipt by attestation idreceipt
    GET /api/billing/plansThe price list. No auth.plans
    GET /.well-known/jwks.jsonOur public key, 5arz-oracle-2JWKS
  3. Verify it offline

    Any standard JWT library works. Cache our JWKS once — no call to 5arz after that. For an SD-JWT VC, verify the part before the first ~.

    Try it in the browser
    import { importJWK, jwtVerify } from "jose";
    
    const key = await importJWK(jwk, "ES256");
    const { payload } = await jwtVerify(pohf_jwt, key);
For agents

Let your agent prove a person is behind it.

Point any MCP client at our MCP server. It lists its own tools — including register_agent, so agents can sign themselves up. check_credential verifies pohf_jwt, pop_jwt or sd_jwt_vc with no key.

mcp.5arz.comMCP · remote
  • 9 tools
  • tools/list needs no auth
  • Same free plan
Framework-agnostic

Works with any MCP or HTTP client

Call 5arz from any framework that speaks MCP or HTTP. Examples only — not partnerships.

  • Claude
  • LangChain
  • CrewAI
  • AutoGen
  • LlamaIndex
  • Vercel AI SDK
  • OpenAI Agents SDK
  • Semantic Kernel
Not open yet

Coming soon

  • Coming soonPost work or hire a person via the API
  • TestnetOn-chain credential on mainnet, after an audit
Get notified
API reference

Every endpoint, with examples.

Base URL https://api.5arz.com. Auth: Authorization: Bearer <apiKey> (all but register + jwks).

Quickstart with curl

Sign up, verify, done. Auth is a single Bearer key. The Free plan includes 1,000 signed credentials a month, no card required; paid plans raise the ceiling.

quickstart.sh
# 1) Sign up → get your API key (shown once)
curl -X POST https://api.5arz.com/api/agents/register \
  -H "Content-Type: application/json" \
  -d '{"name":"Your Company","contactEmail":"you@company.com"}'

# 2) Optional: pick a paid plan → open the returned Stripe checkout
curl -X POST https://api.5arz.com/api/billing/checkout \
  -H "Authorization: Bearer arz_live_…" -d '{"plan":"starter"}'

# 3) Verify an event → a signed credential (one seal against your plan)
curl -X POST https://api.5arz.com/api/agents/verify \
  -H "Authorization: Bearer arz_live_…" -d '{"sessionId":"…"}'
# → { "pohf_jwt": "eyJ…", "verified": true }

Get your API key

Self-serve and instant. Your key is shown once — store it.

Start in Test mode: a free arz_test_ key with unlimited, uncharged verifications, so you can integrate end-to-end before paying. Test credentials are signed but carry test:true — never treat them as production proof.

Two fields, no card. Pick Test for a free sandbox key, or Live for production credentials — both on the same account.

Get your free API key →

Writing an autonomous agent that registers itself? Skip the browser and call POST /api/agents/register — see For AI agents.

The SDK

zero dependencies

A thin JavaScript client for browsers and Node 18+. Import it directly, or copy the file into your project.

sdk.js
// import directly (browser ESM or bundler)
import { Sarz } from "https://5arz.com/sdk/sarz.js";

const sarz = new Sarz({ apiKey: "arz_live_…" });
const { pohf_jwt } = await sarz.verify(sessionId);        // 1 seal → signed credential

// physical presence (receipt / on-site)
const photoHash = await Sarz.hashPhoto(file);
const { lat, lng } = await Sarz.captureGeo();
await sarz.submitPhysical({ memberId, source:"receipt", lat, lng, photoHash });

// your advertisers verify it themselves — no key needed
const { valid, payload } = await Sarz.verifyCredential(pohf_jwt);

npm i @5arz/sdk · or hosted at 5arz.com/sdk/sarz.js.

Endpoints

Base URL https://api.5arz.com. Auth: Authorization: Bearer <apiKey> (all but register + jwks).

Keys and plans
POST/api/agents/register
Sign up. Body { name, contactEmail, mode? } — pass mode:"test" for a free arz_test_ sandbox key. → { apiKey, agentId, mode }. No auth. Key shown once.
POST/api/billing/checkout
Subscribe { plan: "starter" | "growth" | "scale" } → { checkoutUrl } (Stripe). The plan activates on payment. Test keys skip this — unlimited free.
GET/api/agents/credits/balance
Your plan and remaining allowance → { plan, sealsUsed, sealsRemaining, plans }.
Credentials
POST/api/agents/verify
Attest a verified human session. Body { sessionId } → signed PoHF credential (one seal). 402 with an upgrade object when the monthly allowance is used.
POST/api/agents/verify-personhood
Prove a real, ID-verified, live human. Body { memberId } → signed Proof-of-Personhood credential (one seal).
POST/api/kinetic/submit
Physical presence. Body { memberId, source:"receipt"|"geo_photo", lat, lng, photoHash } → scored session, mint a credential via /api/agents/verify. One-time-use per photo.
GET/.well-known/jwks.json
Public keys. Anyone validates a 5arz credential’s ES256 signature against these — no 5arz software.
Device attestation
POST/api/agents/attest/challenge
Device attestation step 1 → one-time { nonce, challengeB64url } (anti-replay).
POST/api/agents/attest/verify
Step 2 — prove a genuine device, not an emulator. { method:"webauthn"|"play_integrity"|"app_attest", nonce, subjectRef } → { attested, assurance }. Attested devices add a device claim to the credential.
Analytics and attribution
GET/api/agents/metrics
Verified-attention analytics — summary + per-view rows (engagement and quality signals, fraud flags), each tagged with its credential id. ?format=csv downloads; ?since=&limit= to page.
POST/api/track/event
Public beacon from the post-click tag — on-site behavior tied to the verified view (vt). Cookieless; sendBeacon-friendly.
POST/api/agents/track/conversion
Server-side (backend-confirmed) conversion tied to a verified view. { vt, name, value, currency } → { attributed }.
GET/api/agents/metrics/funnel
Verified views → landed → engaged → conversions, with rate + value. Every step tied to a verified view.
GET/api/agents/metrics/attribution
Multi-touch — credit conversions across the verified views that led to them. ?model=first|last|linear.
GET/api/agents/metrics/unique-humans
Not a uniqueness check — a cross-device rollup by your own id. Pass the same stable uref on verify/track and a viewer on phone + web + app counts once. The grouping comes from your uref, not from 5arz.
Tasks
GET/api/tasks/next
Public — fetch a micro-task to embed in a pop-up. ?site=<agentId> → { task }.
POST/api/tasks/complete
Public — submit a completion (answer + timing). A verified completion mints a PoHF via /api/agents/verify.
Partner rewards
POST/api/partner/points/convert
Convert a viewer’s reward points → 5arz Stars. { userRef, points } → { balance }. Idempotent.
GET/api/partner/user/balance
A viewer’s Star balance. ?userRef=… → { stars, lifetimeEarned }.
POST/api/partner/payout/request
Records a cash-out request. Cash-out is paused right now; requests are recorded, not transferred. { userRef, stars } → { requestId, status }.
On-chain and webhooks
POST/api/agents/wallet/challenge
On-chain personhood — a nonce/message to personal_sign with an EVM wallet, then bind it via verify-personhood (adds a wallet claim).
POST/api/agents/webhooks
Register a push webhook. { url, events } → { id, signingSecret } (once). HMAC-signed (X-5arz-Signature); fires personhood.wallet_bound.

The full list, with schemas, is in the OpenAPI spec.

Verify a credential (the buyer side)

Every 5arz credential is an ES256 JWT. Your advertisers and partners verify it themselves with any standard JWT library, or our SDK.

verify.js
import { Sarz } from "https://5arz.com/sdk/sarz.js";
const { valid, payload } = await Sarz.verifyCredential(pohf_jwt);
// valid === signature OK + iss is 5arz + not expired

Prefer no code? Paste any credential into the in-browser verifier.

Post-click tracking

One tag adds a signed credential to each on-site action and conversion, so each carries proof it came from a verified human. It augments your analytics; it doesn’t replace them.

Cookieless. Redirect verified click-throughs with ?sarz_vt=<attestationId>.

advertiser-site.html
<!-- drop on the advertiser site -->
<script src="https://5arz.com/sdk/track.js" data-site="agt_your_id" async></script>

// fire a conversion anytime (value optional)
sarz("conversion", "purchase", { value: 49, currency: "USD" });

Captures on-site engagement (active time, scroll, clicks) tied to the verified view. Backend conversion? Use server-side POST /api/agents/track/conversion. See the funnel at GET /api/agents/metrics/funnel.

In-break task widget

Turn idle moments — a video break, a loading screen — into verified human work. The viewer completes a quick task in a pop-up and earns Stars.

A verified completion mints a signed PoHF a buyer can pay for.

partner-page.html
<!-- on the partner page -->
<script src="https://5arz.com/sdk/task-widget.js" data-site="agt_your_id" async></script>

// during a 60-second break:
SarzTask.open({ vt: viewToken, member: viewerId, onComplete: function(r){ } });

Mint the credential from a verified completion: POST /api/agents/verify with { sessionId: completionId } → a signed PoHF (work_kind task).

Mobile and apps

Everything works on mobile web and inside native iOS, Android and React Native apps.

  • React Native / Node — the SDK is pure fetch + WebCrypto, no DOM. Call verify(), credits, metrics() as usual; pass photoHash/lat/lng from native capture.
  • Native device attestation — use app_attest (iOS) or play_integrity (Android) at /api/agents/attest/verify to prove a genuine app, not an emulator. WebAuthn covers mobile web.
  • Native in-break tasks — no iframe needed: GET /api/tasks/next, render in your own UI, then POST /api/tasks/complete with dwellMs/focusedMs + the viewer’s memberRef. A verified completion credits Stars.
  • Cross-device — pass the same stable uref (your viewer id) on verify and on the tag (data-user) across phone, web and app, so each viewer id counts once and conversions attribute across devices.

Verified-human wallet

Testnet

Bind a verified, live human to a wallet, so DeFi and RWA protocols can gate borrowers and depositors on real personhood.

Get a challenge, sign it with the wallet, then mint a personhood credential carrying the wallet claim.

wallet-binding
// 1) challenge
POST /api/agents/wallet/challenge  -> { nonce, message }
// 2) wallet.personal_sign(message) -> walletSig
// 3) bind
POST /api/agents/verify-personhood  { memberId, wallet, walletSig, walletNonce: nonce }
   -> pop_jwt with claims: wallet, wallet_proof:"eip191", sybil_checked, liveness

On-chain consumers read it via a 5arz attestation/registry — require(sarz.isVerifiedHuman(wallet)). Reference contract + EAS schema in our onchain/ kit.

Live on Base Sepolia (testnet); mainnet after audit.

Auth, credits and errors

  • Auth — one Bearer API key per company. Keys are shown once at creation; rotate by registering again.
  • Test mode — an arz_test_ key (register with mode:"test") verifies for free and unlimited, and mints credentials marked test:true / env:"test". Integrate and validate end-to-end, then switch to a live key to go to production.
  • Plans — Free: 1,000 seals/mo + 10 document checks. Then Starter $99, Growth $499, Scale $2,499 per month. Each verify spends one seal. See pricing.
  • Errors — JSON { ok:false, error }. 401 bad/no key, 402 monthly allowance used (includes an upgrade link), 404 not found.
  • Standards — credentials follow Verifiable Intent / Visa Trusted Agent conventions and bind to payments on Agent Pay, Stripe, or USDC. 5arz is never in the payment path.

Ship your first seal.

Free plan, 1,000 seals a month. No card.