Request Evidence
On a backend that supports response evidence, add this header to your existing Encrypted request toPOST /v1/chat/completions:
stream to false in the JSON body. The native /api/v1/chat/completions route accepts the same option. Evidence requests require Encrypted transport and nonstreaming Chat Completions. Sending another nonempty header value, or requesting evidence with stream: true, returns 400 invalid_request.
Omitting the header keeps the existing completion response and skips signature lookup. In an encrypted tool loop, keep the option consistent across requests and verify each exchange separately.
Response Fields
The normal completion adds aresponse_evidence object:
proof_status: returned records that the backend supplied a proof envelope. Your client still checks its signature, hashes, signer, and attestation binding. Raw response bodies may contain additional backend fields; treat those fields as untrusted until checked.
Verify the Exchange
- Verify fresh attestation before the completion. Use your own challenge and retain the verified signing identity, algorithm, measurements, and model binding. Follow Verify It Yourself. Top-level key fields alone are insufficient to establish trust.
- Require available evidence. Check
body_status: availableandproof_status: returned. Select a verifier that explicitly supports the returnedproof_formatand version. Reject unknown formats or unsupported algorithms when your policy requires verification. - Decode the original bytes. Base64-decode the body and proof fields. Keep the original body bytes intact for hashing; parsing and reserializing JSON can change signed bytes.
- Check your request. Compare its ciphertext, model, and generation parameters with what you intended to send, accounting for Nito’s request mapping. A signed exchange must also match your request.
- Verify hashes and signature. Calculate SHA-256 hashes of the original body bytes. Follow the proof format’s rules for the exact signed text, signer scope, model binding, and signature verification against your verified attestation. An upstream gateway signature alone does not establish that a model-serving enclave signed the response.
- Consume the verified reply. Decrypt the ciphertext in the verified original response. When using normalized completion fields, first confirm they match the signed original fields you intend to use.
Limits and Unavailable Evidence
Each original body has a 1 MiB evidence limit. If either exceeds it,body_status is too_large and both body fields are omitted. Evidence is never silently truncated.
Proof lookup makes at most three attempts within a three-second timeout and accepts up to 256 KiB of proof JSON. Pending, missing, malformed, oversized, or failed proof responses produce proof_status: unavailable and omit proof_base64.
An unavailable proof preserves the successful completion and normal usage accounting. Apply your verification policy before consuming it. Repeating inference makes a new billable request; it does not retry proof retrieval for the original response. A separate evidence-retrieval endpoint is not available.
Handling Evidence
Evidence stays within the request and is returned withCache-Control: no-store. Nito does not log or persist these bodies or proofs. Keep evidence out of later model prompts and public conversation shares. The Browser App does not automatically verify response signatures or save this API evidence in chat history.

