Check our records without trusting us.
Every price we record and every index release goes into a signed, chained log. Anyone can check it with our public key.
What is signed?
Several times a day, a signing run collects everything recorded since the previous run: each price observation from the daily scan, and each Agent Economy Price Index release. It hashes them, then signs one manifest with an Ed25519 key. The website itself cannot read that key: only the server administrator account can.
Each manifest also contains the hash of the one before it. Removing or rewriting a past manifest would break the chain.
The first manifest (number 1, 16 October 2026) covers the full history recorded up to that day. It proves we held that history by 16 October 2026, not on each earlier date.
What can I prove with it?
That Agentery held a given record, unchanged, by the time it was signed. For a listing’s current price, the check above rebuilds the path from that record to the signed manifest.
If you keep a record we gave you, you can check it again later, even if we change our data. A record that no longer matches the signed one shows as changed.
A signature does not prove a price is right. It proves what we recorded, and when.
What stays private?
Manifests contain counts, hashes and roots, never prices. The public proof service only returns each listing’s current observation, which is already on its page. Listing-level price history is not published.
Check it yourself
- Public key (JWKS)
- Recent manifests
- /api/v1/signed-records/proof?handle=…: current observation with its proof
Hashing rule: leaf = SHA-256(0x00 ‖ canonical JSON of the record); node = SHA-256(0x01 ‖ left ‖ right); an odd last node moves up unchanged. Canonical JSON sorts keys at every level, with no whitespace. The signature covers the UTF-8 bytes of the manifest’s canonical JSON.
// Node 18+: verify a manifest offline
const canon = v => v === null || typeof v !== "object" ? JSON.stringify(v ?? null)
: Array.isArray(v) ? "[" + v.map(canon).join(",") + "]"
: "{" + Object.keys(v).filter(k => v[k] !== undefined).sort().map(k => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
const { createPublicKey, verify } = require("node:crypto");
(async () => {
const jwks = await (await fetch("https://agentery.com/.well-known/jwks.json")).json();
const m = await (await fetch("https://agentery.com/api/v1/signed-records/1")).json();
const jwk = jwks.keys.find(k => k.kid === m.kid);
const key = createPublicKey({ key: { kty: "OKP", crv: "Ed25519", x: jwk.x }, format: "jwk" });
console.log(verify(null, Buffer.from(canon(m.manifest)), key, Buffer.from(m.signature, "base64url")));
})();Recent manifests
- #40 · 2026-11-10 06:20 UTC · 20,105 observations · 9 releases
- #39 · 2026-11-09 23:50 UTC · 0 observations · 3 releases
- #38 · 2026-11-09 14:20 UTC · 19,847 observations · 6 releases
- #37 · 2026-11-08 14:20 UTC · 0 observations · 3 releases
- #36 · 2026-11-08 06:20 UTC · 19,635 observations · 6 releases
- #35 · 2026-11-07 06:20 UTC · 19,700 observations · 9 releases
- #34 · 2026-11-06 14:20 UTC · 0 observations · 3 releases
- #33 · 2026-11-06 06:20 UTC · 19,218 observations · 9 releases
- #32 · 2026-11-05 06:20 UTC · 18,914 observations · 9 releases
- #31 · 2026-11-04 14:20 UTC · 18,397 observations · 9 releases