Verify a real human performed an action — a watch, a sign-up, a visit — and get a signed credential your app and your advertisers can verify. Three steps, one API call per event. Drop it into any app or dashboard.
Sign up, buy credits, verify. Auth is a single Bearer key; verifications are prepaid.
# 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) Buy credits → 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 (1 credit) curl -X POST https://api.5arz.com/api/agents/verify \ -H "Authorization: Bearer arz_live_…" -d '{"sessionId":"…"}' # → { "pohf_jwt": "eyJ…", "verified": true }
Self-serve, 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, so your key, billing and dashboard never drift apart.
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 credit → 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.?format=csv downloads; ?since=&limit= to page.{ method:"webauthn"|"play_integrity"|"app_attest", nonce, subjectRef } → { attested, assurance }. Attested devices add a device claim to the credential.vt). Cookieless; sendBeacon-friendly.{ vt, name, value, currency } → { attributed }.?model=first|last|linear.uref on verify/track.?site=<agentId> → { task }./api/agents/verify.{ userRef, points } → { balance }. Idempotent.?userRef=… → { stars, lifetimeEarned }.{ userRef, stars } → { requestId, status }. Reviewed; no auto-transfer.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.{ sessionId } → signed PoHF credential (1 credit). 402 if no credits.{ memberId } → signed Proof-of-Personhood credential (1 credit).{ memberId, source:"receipt"|"geo_photo", lat, lng, photoHash } → scored session, mint a credential via /api/agents/verify. One-time-use per photo.Every 5arz credential is an ES256 JWT. Your advertisers/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.
Attach proof to your funnel: one tag adds a signed credential to each on-site action and conversion — so each one carries verifiable proof it came from a verified human. It augments your existing 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" });
Auto-captures active (focused) time, scroll depth, clicks, and pointer-entropy (a bot-on-site signal). 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. Drop the loader, then open a pop-up where the viewer completes a quick task and earns; 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 / 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 one human counts once and conversions attribute across devices.Bind a verified, unique human to a wallet so DeFi/RWA protocols can gate borrowers/depositors on real personhood (anti-sybil + compliance). Get a challenge, sign it with the wallet, 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", unique_human, 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 no credits (includes a buy link), 404 not found.