Receipts
Receipt contents, delivery, and the limits of what a receipt proves.
Prove / receipts
Provn returns a receipt for each metered call. The gateway writes a canonical JSON payload, encodes it as base64url and signs the payload with secp256k1 using EIP-191 personal_sign.
Delivery
| Call | Location |
|---|---|
| Chat completion or sandbox run | x-provn-receipt, x-provn-receipt-sig and x-provn-receipt-signer headers |
| Streamed chat completion | An event: provn.receipt event with {receipt, signature, signer}, sent before data: [DONE] |
| Terminal run | The response, and GET /v1/receipts/:id for anyone |
Payload
json
{
"v": 1,
"kind": "inference",
"request_id": "req_4tQ8...",
"run_id": "run_9Kd2...",
"prev": "3f9c...e1",
"content_fingerprint": "9b1c4e0f2a7d6c31",
"model": "provn",
"engine": "gpt-oss-20b",
"units": { "prompt_tokens": 12, "completion_tokens": 48 },
"cost_micro_usd": 21,
"key_id": "key_7Hc...",
"status": "ok",
"logging": "metadata-only",
"chain_id": 4663,
"issued_at": "2026-09-16T12:00:00.000Z"
}| Field | Meaning |
|---|---|
v | Payload version, 1 for this format. |
kind | inference, sandbox or terminal. |
request_id | Matches the x-provn-request-id header. |
run_id | The run the call joined through x-provn-run. |
prev | SHA-256 (hex) of the previous receipt payload in the run, null on the first. |
content_fingerprint | First 8 bytes (16 hex characters) of SHA-256 over the request. Inference hashes the JSON body with sorted keys, and sandbox and Terminal hash the submitted code. |
model | The id you called. |
engine | The upstream model that served it. |
units | {prompt_tokens, completion_tokens} for inference, {cpu_ms, mem_limit_mb} for sandbox and Terminal. |
cost_micro_usd | The amount billed, in millionths of a dollar. |
key_id | The key that paid, null for Terminal runs. |
status | ok, error, timeout or cap_reached. Failed sandbox runs add error_class. |
logging | metadata-only. |
chain_id | 4663, Robinhood Chain. |
issued_at | ISO 8601 time from the gateway clock. |
Sharing
Your receipts are private. Turn on sharing for one in the dashboard and anyone can fetch it at GET /v1/receipts/:id. Terminal receipts start public.
What a valid receipt shows
- The holder of the published signer key issued this exact payload, and nobody edited it afterwards.
- The gateway metered the call under that key, model and engine, and charged the stated cost.
- A request you still hold matches the fingerprint, once you hash it and compare.
What it does not show
- That the model's answer is correct.
- The work the upstream host did on its own hardware. Provn records the engine it routed to and can't attest beyond that.
- A time other than the gateway's own clock, unless the receipt sits in an anchored batch.