Provn

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

CallLocation
Chat completion or sandbox runx-provn-receipt, x-provn-receipt-sig and x-provn-receipt-signer headers
Streamed chat completionAn event: provn.receipt event with {receipt, signature, signer}, sent before data: [DONE]
Terminal runThe 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"
}
FieldMeaning
vPayload version, 1 for this format.
kindinference, sandbox or terminal.
request_idMatches the x-provn-request-id header.
run_idThe run the call joined through x-provn-run.
prevSHA-256 (hex) of the previous receipt payload in the run, null on the first.
content_fingerprintFirst 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.
modelThe id you called.
engineThe upstream model that served it.
units{prompt_tokens, completion_tokens} for inference, {cpu_ms, mem_limit_mb} for sandbox and Terminal.
cost_micro_usdThe amount billed, in millionths of a dollar.
key_idThe key that paid, null for Terminal runs.
statusok, error, timeout or cap_reached. Failed sandbox runs add error_class.
loggingmetadata-only.
chain_id4663, Robinhood Chain.
issued_atISO 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.