Product · Receipt Verifier
TestingFree · public · no authPaste any SynOI receipt URL.
See the cryptographic math.
Verifiability is only credible when it doesn't require trusting us. The Receipt Verifier is a public, unauthenticated surface: paste any receipt URL, the page renders the canonical body, the hybrid (Ed25519 + ML-DSA-65) signature, and the verification result. No account. No SynOI dependency. No SaaS in the loop. Auditors check receipts offline, with whatever crypto library they already trust.
Anatomy of a Decision Receipt
Every field is documented. Every field is verifiable.
The receipt below is a sample of the canonical body returned by the verifier. The signature is computed over the byte-exact canonical JSON encoding of this body. Every field is annotated. None of it is proprietary; the format spec is open and standards-based.
version 1
receipt_id rcpt_8b3c9f12...
tenant_id acme-prod
action_class tool.deploy
action_desc terraform apply
risk_level high
decision allow
mode enforce
approver a.rivera
approval_surface mobile
elapsed_ms 14_312
model claude-opus-4-7
oid_hex a3f8c21d9b4e...
recorded_at 2026-05-14T14:32:01Z
signature
3a9f2b1c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f1a (Ed25519 + ML-DSA-65)
receipt_id
Globally-unique. Embeds in the verify URL. Never reused across tenants.
action_class · action_desc · risk_level
What was attempted, in human-readable form. Tenant policy decides the risk class; the receipt reflects the policy decision.
decision
One of: allow · deny · hitl_approved · hitl_denied · remediate. The exit status of the governance evaluation.
approver · approval_surface
If HITL was required, who approved it and on what surface (mobile / slack / sms / desktop / email).
oid_hex
The content-addressed Object Identifier (OID): SHA-256 of the canonical body. Same content, same OID, across providers and time.
signature
Hybrid Ed25519 (RFC 8032) + ML-DSA-65 (NIST FIPS 204) over the canonical JSON encoding. Public key published. Verify offline with any standard library.
Why a public verifier matters
Verifiability is only credible when it doesn't require trusting the vendor.
Third-party verifiability
An auditor, a customer, or a regulator can check any receipt without a SynOI account, an API key, or a sales call. The verifier is a static page over a public key. There is no SaaS in the verification path.
Offline checking
The published public key is small and stable. Auditors can mirror it once, then verify receipts offline forever after. The signature mathematics doesn't require the issuer to be online.
Standards-based crypto
Ed25519 (RFC 8032) and ML-DSA-65 (NIST FIPS 204). Any major language ecosystem has libraries for Ed25519: Rust, Go, Python, Node, Java, C++, Swift, .NET. We don't invent the math.
Tamper-evident forever
The signature is over the canonical encoding. Any mutation (even whitespace) invalidates it. A receipt that verifies today verifies in five years, with the same key, regardless of what's happened to SynOI in the interim.
Survives vendor risk
The pitch is honest about this: if SynOI is acquired, pivots, or vanishes, the receipts your team produced under SynOI's governance keep verifying. The crypto doesn't care who owns the company.
Independent of receipt issuer
The verifier doesn't know about SynOI specifically. Any party can publish an Ed25519 + ML-DSA-65 public key pair and issue compatible receipts. The protocol is open; the verifier is a reference implementation, not a moat.
Verify in your own code
Three languages, three libraries, all standard.
Node · @noble/ed25519
import { ed25519 } from '@noble/curves/ed25519'
const body = await canonicalCbor(receipt)
const sig = receipt.signature
const pubKey = await fetchSynoIKey()
const ok = ed25519.verify(sig, body, pubKey)Python · cryptography
from cryptography.hazmat.primitives.asymmetric.ed25519 \ import Ed25519PublicKey body = canonical_cbor(receipt) sig = receipt['signature'] pub = fetch_synoi_key() Ed25519PublicKey.from_public_bytes(pub).verify(sig, body)
Rust · ed25519-dalek
use ed25519_dalek::{Signature, VerifyingKey, Verifier};
let body = canonical_cbor(&receipt);
let sig = Signature::from_bytes(&receipt.signature);
let pk = VerifyingKey::from_bytes(&fetch_key())?;
pk.verify(&body, &sig)?;The SynOI public key is published at verify.synoi.systems/.well-known/synoi-ed25519.pub and rotates on a documented schedule. Old keys remain valid for receipts they signed; the rotation policy is documented in /security.
Verifiability you don't have to take our word for.
The verifier is free. The crypto is standard. The receipts work without us. Try it on a sample now, then point a real workflow at the gateway and check your own.