Tanilo

Verification

Verify a receipt

A Tanilo receipt is a signed record of one check. You can check its signature yourself, offline, against the published key set. You don’t need to trust this website to do it.

Look inside the sample receipt
  1. Claim Paris is the capital of France.
  2. Recorded result The evaluator recorded “supported”.
  3. Signature Verify the original bytes below. Change one byte and check again.
verify — receipt.json

Historical signature demo · On 2 October 2026, /evaluate assessed the claim “Paris is the capital of France” under the gate rules then in use. This receipt belongs to that model assessment.

Runs in this page against the key set published at tanilo.io. If the key set can’t be fetched, the terminal says so and nothing is marked valid.

What a valid result means

A valid signature establishes that the signed bytes have not changed and verifies against the selected key. It does not establish that the assessment or claim is true, that an action was authorized, or that the receipt conforms to every rule of its profile.

The verifier’s three results are about the signature only.
ResultMeaning
validThe signature verifies over the canonical payload against a key in the set you supplied.
invalidThe signature does not verify: the bytes changed, or a different key signed them. A test key is refused.
indeterminateThe check could not be completed, for example because the key isn’t in the set you supplied. It is not a pass.

Three ways

Check one yourself

Python · offline after download

With tanilo-receipt-verify

shell
pip install tanilo-receipt-verify
curl -s https://raw.githubusercontent.com/TKCollective/tanilo-receipt-spec/a565999/examples/live-receipts/evaluate-demo-2026-10-02.json -o receipt.json && curl -s https://tanilo.io/.well-known/jwks.json -o jwks.json
python3 -c "import json; from tanilo_receipt_verify import verify; r=verify(json.load(open('receipt.json')), jwks_by_issuer={'https://tanilo.io/.well-known/jwks.json': json.load(open('jwks.json'))}); print(r.status, r.canonical_sha256)"

Expected output: valid sha256-baac7b81…, for the replayed /evaluate receipt issued on 2026-10-02. Use version 0.2.4 or later, which refuses test keys.

In this browser

On the homepage

The homepage records section verifies the same receipt in your browser against the live key set, lets you tamper with one byte, and resets.

Open the in-browser check

With the reference code

The receipt spec repository includes Node verification examples (examples/verify_node.mjs) and conformance vectors you can run from a clean clone.

tanilo-receipt-spec

Keys

Which keys to use

Test keys are served separately at /.well-known/jwks-test.json. A signature from a test key proves nothing about issuance, because its private key is public. Earlier verification instructions and their results are kept on the trust page.