Issue a seal — a verifiable credential — with one API call. Anyone can check it offline, free.
These endpoints cover most apps. Credentials come as a signed JWT, or as an SD-JWT VC (sd_jwt_vc).
Full OpenAPI specPOST /api/agents/registerCreate an API keyAPI keyPOST /api/agents/verifyMint a PoHF credential: a person did thispohf_jwtPOST /api/agents/verify-personhoodMint a proof-of-personhood credentialpop_jwtGET /api/attestations/{id}Fetch a receipt by attestation idreceiptGET /api/billing/plansThe price list. No auth.plansGET /.well-known/jwks.jsonOur public key, 5arz-oracle-2JWKSAny 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 browserimport { importJWK, jwtVerify } from "jose"; const key = await importJWK(jwk, "ES256"); const { payload } = await jwtVerify(pohf_jwt, key);
import jwt # pip install "pyjwt[crypto]" key = jwt.PyJWK(jwk) payload = jwt.decode(pohf_jwt, key.key, algorithms=["ES256"])
# Fetch the key once. Keep it with your code.
curl https://api.5arz.com/.well-known/jwks.json \
-o 5arz-jwks.json
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.
Call 5arz from any framework that speaks MCP or HTTP. Examples only — not partnerships.
What a seal holds and how it’s signed.
Read →All 32 endpoints, requests and responses.
Open JSON →Connect agents and frameworks.
Read →Paste one and check it in your browser.
Try it →Our one public key, 5arz-oracle-2.
Open JSON →Security, privacy and how we sign.
Visit →Base URL https://api.5arz.com. Auth: Authorization: Bearer <apiKey> (all but register + jwks).
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.
# 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 }
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.
A thin JavaScript client for browsers and Node 18+. Import it directly, or copy the file into your project.
// 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.
Base URL https://api.5arz.com. Auth: Authorization: Bearer <apiKey> (all but register + jwks).
{ name, contactEmail, mode? } — pass mode:"test" for a free arz_test_ sandbox key. → { apiKey, agentId, mode }. No auth. Key shown once.{ plan: "starter" | "growth" | "scale" } → { checkoutUrl } (Stripe). The plan activates on payment. Test keys skip this — unlimited free.{ sessionId } → signed PoHF credential (one seal). 402 with an upgrade object when the monthly allowance is used.{ memberId } → signed Proof-of-Personhood credential (one seal).{ memberId, source:"receipt"|"geo_photo", lat, lng, photoHash } → scored session, mint a credential via /api/agents/verify. One-time-use per photo.{ method:"webauthn"|"play_integrity"|"app_attest", nonce, subjectRef } → { attested, assurance }. Attested devices add a device claim to the credential.?format=csv downloads; ?since=&limit= to page.vt). Cookieless; sendBeacon-friendly.{ vt, name, value, currency } → { attributed }.?model=first|last|linear.uref on verify/track and a viewer on phone + web + app counts once. The grouping comes from your uref, not from 5arz.?site=<agentId> → { task }./api/agents/verify.{ userRef, points } → { balance }. Idempotent.?userRef=… → { stars, lifetimeEarned }.{ userRef, stars } → { requestId, status }.personal_sign with an EVM wallet, then bind it via verify-personhood (adds a wallet claim).{ url, events } → { id, signingSecret } (once). HMAC-signed (X-5arz-Signature); fires personhood.wallet_bound.The full list, with schemas, is in the OpenAPI spec.
Every 5arz credential is an ES256 JWT. Your advertisers and partners verify it themselves with any standard JWT library, or our SDK.
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.
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>.
<!-- 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.
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.
<!-- 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).
Everything works on mobile web and inside native iOS, Android and React Native apps.
fetch + WebCrypto, no DOM. Call verify(), credits, metrics() as usual; pass photoHash/lat/lng from native capture.app_attest (iOS) or play_integrity (Android) at /api/agents/attest/verify to prove a genuine app, not an emulator. WebAuthn covers mobile web.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.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.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.
// 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.
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.{ ok:false, error }. 401 bad/no key, 402 monthly allowance used (includes an upgrade link), 404 not found.Free plan, 1,000 seals a month. No card.