By default a request has no attestation constraint. The gateway still verifies confidential
upstreams and still issues receipts, but a request without the constraint can be served by a routed
provider whose upstream is not attested. See
Confidential vs routed models.
Require an attested upstream
Add theprovider block to the request. Every inference endpoint accepts it:
/v1/chat/completions, /v1/messages, /v1/responses, /v1/embeddings, and
/v1/completions.
openai/gpt-4o-mini always fails
this check:
503. Failover retries stay inside the attested set, so a plaintext upstream never
receives the prompt as a fallback.
Setting "aci_verified": false, or omitting the field, applies no attestation constraint.
X-Upstream-Verification: none cannot relax this constraint. A request that asks to be pinned to an
attested upstream cannot also opt out of the attestation. The header still applies to requests that
do not set aci_verified.Pin a request to one attested channel
aci_verified accepts any upstream that is verified right now. To require one specific attested
channel, pass its session id. This is useful when you have already inspected a session’s evidence
and want subsequent requests to reach that exact channel or fail.
List the sessions that can serve your model. The unfiltered list covers every upstream the gateway
has verified, so filter it: a session belonging to another upstream will never match your request.
session_id of the form as_<64 hex characters>, the verifier that produced
it, its channel binding, and an expires_at timestamp. ?upstream_name= filters the same list by
upstream. See Attested sessions.
The most reliable id is the one that already served you. Every response’s receipt names the session
that served it, so a client can pin follow-up requests to the channel it just used.
Pin a request to one or more of them:
503 and no prompt is sent:
aci_session_ids implies aci_verified. Passing session ids together with "aci_verified": false
is rejected as a contradiction rather than resolved in either direction.
List the models you can use
true is the only accepted value. Any other value, including false, returns 400. Omit the
parameter for the full catalog.
Request validation
The gateway parses the attestation fields itself and rejects anything it cannot read, rather than treating it as an absent constraint. Every case below returns400 with type
invalid_request_error and forwards nothing.
aci_verified and aci_session_ids are read by the gateway and removed before the request reaches
a provider. They compose with the other provider fields, such as
zdr.
What the constraint guarantees
The check runs before any prompt bytes leave the gateway:- The route is classified as an attested provider.
- Verification is required for that route and cannot be waived by a request header.
- Verification returns a verified result and an enforceable channel binding.
- The request is forwarded over the bound channel.
Verify that it held
A successful attested request returnsx-receipt-id. Fetch that receipt and read its
upstream.verified event:
"result": "verified" with "required": true is the proof that the constraint held. session_id
names the channel that served the request, and is the id to pin for follow-up requests. The receipt
is signed by a key in the attested keyset, so this is evidence rather than a log line. See
Verify a response.
The request you sent is bound into the same receipt through request.received.body_hash, so you can
prove which constraint you asked for alongside the result you got.
Related
TEE-only Endpoint
Enforce attestation for every request with a base URL instead of a per-request block.
Attested Sessions
What a session id identifies and how long it lives.
Channel Binding
How a verified channel is enforced on the wire.
Zero Data Retention
The retention constraint, which composes with this one.
Chat Completions
The full
provider routing block.