Verifying a receipt
Anyone holding a Veyto receipt can check it. No account, no API key, no access to the instance that issued it — verification needs only the receipt's own bytes and a published list of signing keys.
curl -X POST https://verify.veyto.io/api/verify-receipt \
-H 'content-type: application/json' \
-d '{"body_canonical":"…","signature":"…"}'Or paste the receipt into the page at verify.veyto.io.
The four answers
| verdict | meaning |
|---|---|
verified_trusted_key | signature valid and the key is one of Veyto's. The only accepting result. |
verified_unrecognized_key | the bytes are intact, but the key is not in the published history — a forgery looks exactly like this |
signature_invalid | the receipt was altered, or the signature is not its own |
malformed | not a receipt the verifier can read |
⚠️ Switch on verdict, never on signature_valid alone. A well-formed forgery sets
signature_valid to true; what it cannot do is present a key Veyto published.
What verification proves
That these bytes are the bytes that were signed, by the holder of that key. Nothing was
altered afterwards — not the amount, not the payee, not the policy_digest.
What it does not prove
- that the goods arrived;
- that settlement is final;
- that anyone is who they claim to be;
- that the payment was lawful or appropriate.
Those are separate questions with separate evidence. A signature is a statement about bytes, and treating it as a statement about the world is the most common way cryptographic evidence gets misread.
Verifying it yourself
The receipt is self-describing: sig.alg, sig.kid, sig.pub and canon_v are inside
the signed body, so a receipt can be checked years later with nothing but Ed25519 and
Veyto's published key history.