▪ Verifier
Verify any Ryvion receipt.
Paste a TranscriptDigest CID. No auth. We return the lineage and the signature reference. Cross-check it against our public key bundle in your terminal — Ryvion holds no secret you need to be granted.
▪ verifier
no auth · no rate limit
Don't have a CID handy?
ryv1:sha256:9c1e4d7f42a8b3c1f0e5d8b29c61aae3▪ How verification works
Four steps,all transparent.
You paste a CID
TranscriptDigest CID or output hash. No auth, no API key, no rate limit on lookup.
We resolve the object
The hub looks up the content-addressed receipt and returns the redacted envelope.
We walk the lineage
PromptRoot, Policy, ExecutionPlan, Assignment, TranscriptDigest, TargetReceipt — each is content-addressed and resolvable.
You see the chain + signature
Lineage tree, Ed25519 signature reference, and node hardware. Re-verify offline against our public key bundle.
▪ Verify offline
Don't trust us.Verify in your terminal.
Pull our public key bundle, recompute the canonical envelope, validate the Ed25519 signature locally. Works in Node, Deno, Bun, or browser.
▪ verify-offline.ts
@ryvion/sdk · @noble/ed25519import * as ed from "@noble/ed25519"
import { encode } from "cbor-x"
import { fetchPubkeyBundle } from "@ryvion/sdk"
// 1. Pull the receipt from your local export.
const receipt = JSON.parse(fs.readFileSync("receipt.json", "utf8"))
// 2. Pull our published Ed25519 key bundle.
const bundle = await fetchPubkeyBundle()
const pubkey = bundle[receipt.node_id]
// 3. Recompute canonical envelope, verify Ed25519 signature.
const envelope = encode({
output_hash: receipt.output_hash,
model_id: receipt.model_id,
model_revision: receipt.model_revision,
node_id: receipt.node_id,
timestamp: receipt.timestamp,
transcript_digest_cid: receipt.transcript_digest_cid,
})
const ok = await ed.verify(receipt.signature, envelope, pubkey)
console.log(ok ? "PASS" : "FAIL")