x-receipt-id header. Fetch the receipt:
{id} accepts the receipt id (rcpt-…) or the response id (chat id). See
GET /v1/aci/receipts/{id} for the response shape.
What a receipt commits to
GET /v1/aci/receipts/{id} returns the receipt directly, signed by a key from the attested keyset:
The
event_log carries the two hashes that matter most: request.received.body_hash (the request
the gateway observed) and response.returned.body_hash (the response it returned). Comparing these to
the bytes you sent and received proves the receipt covers your exact exchange.
The legacy alias
GET /v1/signature/{id} returns the same receipt wrapped in a compatibility envelope
that adds a text field ("<request body hash>:<response hash>"), a top-level signature, and
signing_address, for earlier API clients. New integrations should use the canonical
/v1/aci/receipts/{id} response above.The transparency event log
Theevent_log records the request’s path through the gateway. Each event carries a hash or a fact,
never your prompt text.
The signed receipt includes
request.received.body_hash and response.returned.body_hash, which
lets a verifier bind the receipt to the exact bytes you sent and received.
The upstream.verified event
This event tells you whether the model that ran your prompt was itself attested:
- For a confidential model,
resultisverified,requiredistrue, andsession_idreferences the attested session the channel was bound to. - For a routed model,
resultisfailed,requiredisfalse, and there is nosession_id. The gateway still served the request, but the upstream provider was not attested.
412 session_not_accepted and 503 upstream_verification_failed also
arrive via x-receipt-id: they record result: "failed", required: true, a reason, and no
session_id or request.forwarded event; response.returned hashes the error body.
Why hashes, not bodies
The gateway does not store your request or response. Receipts hold hashes, so they prove integrity without warehousing your data. A request rewrite appears as a difference betweenrequest.received.body_hash and request.forwarded.body_hash; a response rewrite appears as a
difference between response.received.body_hash and response.returned.body_hash.
Streaming
For streaming responses the gateway can returnx-receipt-id early, but the signed receipt is
complete only after the stream finishes, because response.returned.body_hash covers the full
streamed body. Fetch the receipt after the stream ends.
Hash the raw SSE bytes, including every data: line and blank line, rather than the reassembled text.
Related
Attested sessions
Follow
session_id to the verified security context behind a confidential response.Verify a response
Check a receipt signature and hashes yourself.