Skip to content

▪ 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?

▪ How verification works

Four steps,all transparent.

step 01

You paste a CID

TranscriptDigest CID or output hash. No auth, no API key, no rate limit on lookup.

step 02

We resolve the object

The hub looks up the content-addressed receipt and returns the redacted envelope.

step 03

We walk the lineage

PromptRoot, Policy, ExecutionPlan, Assignment, TranscriptDigest, TargetReceipt — each is content-addressed and resolvable.

step 04

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/ed25519
import * 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")