Don't Trust Us — Check the Chain: Public Verification for AI Agent Verdicts AgentBadge shipped public verification for every verdict its evaluator signs, letting anyone re-check a verdict on-chain without calling AgentBadge's servers. Each paid response now carries an inline receipt with a deterministic memo id, and the standalone package @agentbadge/verify-verdict re-checks the memo anchor, epoch head anchor, and full chain recompute against the memo contract 0x5294E9927c3306DcBaDb03fe70b92e01cCede505 on Arc, exiting 0 when every executed proof passes and 1 on invalid, unanchored, or typed errors such as rpc_unavailable. The public GET /api/verify/:verdictId endpoint returns the verdict artifact, reason codes, memo anchor state, hash-chain status, and the PROOF_KINDS_V1 registry, with unanchored verdicts rendering pending rather than valid. Don't Trust Us — Check the Chain: Public Verification for AI Agent Verdicts Every verdict ships with an on-chain receipt: GET /api/verify/:verdictId public facade , the /verify SSR page accepting verdict id | tx hash | memo id, and @agentbadge/verify-verdict — a standalone package that re-checks the memo anchor, epoch head anchor, and full chain recompute with zero calls to our server. Every AgentBadge verdict can be verified independently of our server. GET /api/verify/:verdictId returns the artifact, reason codes, memo anchor, hash-chain status, and the PROOF KINDS V1 registry verdict | witness | anchor-head; ?kind= narrows per layer, unknown → 400 unknown proof kind . The paid response itself carries an inline receipt — verify:{api,page,memoId} — with the deterministic memo id. Level-2 is npx @agentbadge/verify-verdict: proofs across verdict anchor, anchor-tx, anchor-head, and chain-recompute firstBrokenSeq on tamper , exit 0/1, memo contract 0x5294E9927c3306DcBaDb03fe70b92e01cCede505. Unanchored renders pending, never valid; RPC failure is an honest rpc unavailable error. What happens if we lie to you? Not a bug — a lie. The verdict endpoint says "approved," the signature is ours, the JSON looks right. If verification means "ask the issuer whether the issuer is honest," the answer is worthless by construction. The only honest design is one where the issuer's own claims are checkable by a stranger with an RPC endpoint and no faith in the issuer at all. That is what we shipped for every verdict our evaluator signs. Each paid response now carries its own verification receipt — links and a deterministic memo id — and every claim in that receipt re-verifies on-chain through a standalone package that never calls our API. If our server disappears tomorrow, the proofs still check. How do you verify a verdict through the public API? One GET, no auth: GET /api/verify/:verdictId returns the stored verdict artifact, machine reason codes , the per-verdict memo anchor state status , memoId , txHash , blockNumber , the hash-chain status anchored / pending / disabled with a head ref pointer for offline recomputation , and a proof kinds registry summary. Unknown id → 404 verdict not found ; it never answers a fake-valid. The response is layered by design. ?kind=verdict returns only the verdict layer artifact + memo anchor ; ?kind=anchor-head returns only the chain layer; ?kind=witness answers implemented:false — the kind is declared in the registry so verifiers can feature-detect it before it ships. Ask for an unregistered kind and you get 400 unknown proof kind with the full known list, not a silent fallback. What does the /verify page do? It is the same check for humans: a server-rendered page at /verify that accepts a verdict id, an anchor transaction hash, or a memo id — all 0x -prefixed 64-hex strings — and resolves which one you pasted via the anchor reverse-lookup. It renders the verdict, the reason codes, the anchor status with an explicit pending banner when the on-chain write has not landed, explorer links, and JSON-LD metadata — all without JavaScript, so it works in curl and in an agent's text browser. Honest statuses are the point. An unanchored verdict renders "pending," never "valid." A malformed id is a 400 , a well-formed unknown id is a 404 , and the page tells you which of the two happened. How do you verify without trusting AgentBadge at all? Run the standalone package. @agentbadge/verify-verdict re-checks everything against the chain itself — the memo contract at 0x5294E9927c3306DcBaDb03fe70b92e01cCede505 on Arc, no call to our API, no account, no key: npx @agentbadge/verify-verdict 0x