These docs cover everything: the Python SDK that gates your agent, the TypeScript and Node SDKs, the browser verifier, the policy language, and the cloud API. Everything is built on one Rust core, so a verdict is byte-identical whether it runs on your server or in a reviewer’s browser.
Start building
Pick the path that matches what you’re doing. Each quickstart is a complete, copyable walkthrough.
What a receipt is
The unit of HESO is the Action Receipt: a signed JSON object that records exactly one action, the policy verdict that gated it, who approved it (if anyone), and a hash that pins the bytes. Here is one for a vendor payment that policy allowed:
{ "alg": "heso-action/v2+ed25519", "content": { "action_version": "heso-action/2.0", "captured_at": "2026-01-14T18:04:31Z", "agent_identity": "ed25519:uP3…b1", "action": { "verb": "payment", "tool_name": "stripe.transfers.create", "workflow": "vendor-payouts", "account": "acct_19", "fields": { "amount_usd": "4200", "payee": "Globex LLC" } }, "policy": { "rule_id": "pay-cap", "rule_display": "Require approval to pay over $5,000", "matched_conditions": [{ "field": "amount_usd", "op": "lte", "value": "5000" }], "decision_path": "allow" }, "trust_level": "L0", "action_hash": "9f2c…e1c0" }, "signatures": [ { "algorithm": "Ed25519", "key_id": "operator", "public_key": "ed25519:uP3…b1", "signature": "3a9f…04af" } ]}
The receipt carries an action_hash (BLAKE3 over its canonical bytes) and an Ed25519 signature. To verify it, you recompute the hash and check the signature — which is exactly what the browser verifier does, locally.
A receipt proves the operator authorized this action under a known policy, and — at L1 — that a person approved it with a device-held key. It records what was authorized — the action, the rule, the approver — not whether the action succeeded downstream.
Core concepts
New to the model? These nine pages explain how an action becomes verifiable evidence.
The SDK family
One Rust core (canonicalization, BLAKE3, Ed25519) compiled to four SDKs. You never re-implement the crypto in your own language — you call the SDK that fits your runtime.
If you’re evaluating HESO, read How HESO works then Trust levels. If you’re integrating, jump straight to a quickstart and keep the SDK reference open.
