Verifiable responses

How to check that a relay didn't swap your model

On Wokey raw passthrough paths, a response can carry a signed proof issued by an AWS Nitro Enclave over the raw bytes the official upstream returned. You check it on your own machine with an open-source verifier, without trusting Wokey.

The response content alone proves nothing

A relay can put anything in the model field of its JSON, and answer quality is a judgment call. To show that a response is exactly what the official upstream returned, you need a signature the relay cannot forge and you can check independently.

How a proof is produced

The official exit runs inside an AWS Nitro Enclave, an isolated trusted execution environment. For each request the enclave:

  1. 1terminates the TLS connection to the official upstream inside the enclave and validates the upstream certificate against a CA bundle built into the image;
  2. 2streams the response back to you while hashing it, without buffering the full body;
  3. 3signs a statement with an Ed25519 key that is generated at boot and never leaves the enclave. The statement lists the upstream host, path, method, status, content type, and the SHA-256 of the request body and of the response body;
  4. 4attaches an AWS Nitro attestation that binds the signing public key and the enclave image measurement (PCR0) to the AWS Nitro root certificate.

What you can check locally

  • the attestation chains to the Nitro root certificate you pinned from AWS documentation;
  • PCR0 matches the value published in the open-source repository, which you can reproduce by building it yourself, so the enclave runs that public source;
  • the bytes you received hash to response_body_sha256 in the statement, so the relay did not change a single byte;
  • the upstream host in the statement is an official one, for example api.anthropic.com for Claude requests. The model field in the response is part of the signed raw bytes returned by the official upstream.

Which responses carry a proof

Requirement: turn on "Official verification" for the API key on the API page.

RequestHow the proof is delivered
Anthropic Messages streaming (/v1/messages, stream: true)Upstream SSE is passed through as-is, followed by a trailing event: tee.proof
OpenAI Responses streaming (/v1/responses, official Codex routes)Upstream SSE is passed through as-is, followed by a trailing event: tee.proof
Non-streaming Messages / ResponsesSend the header x-wokey-tee-proof-mode: multipart to get multipart/mixed: part one is the raw upstream bytes (upstream SSE for Responses), part two is the proof

Which responses carry no proof

  • Responses Wokey converts or re-serializes for format compatibility, such as calling Claude through Chat Completions. Signing altered bytes would be misleading, so these responses never carry a proof.
  • Image generation and image edits, including Studio, always bypass the enclave and produce no proof.
  • When the enclave is temporarily unavailable, the request falls back to the official exit without the enclave, and that response has no proof.
  • If you request a multipart proof on a route that cannot pass the response through as-is, Wokey returns HTTP 422 tee_proof_multipart_requires_raw_passthrough instead of a fake proof.

One rule covers it: treat any response without tee.proof as unproven.

What a proof does not show

  • It proves integrity, not confidentiality. The Wokey relay still handles plaintext in transit (it is not stored). If you need the operator to be unable to read your traffic, this does not cover it.
  • The request body hash covers the body actually sent upstream. When the gateway rewrites a request (Responses requests get some fields filled in, for example), it will not match your original local body, so Responses proofs currently prove the response only.
  • Between byte-identical requests, such as retries, the verifier cannot tell an old response being replayed.
  • The root of trust is AWS, which signs the Nitro attestation.

Verify one yourself

  1. 1

    Turn on verification for a key

    Create an API key on the API page and turn on "Official verification".

  2. 2

    Save a streaming response

    Send a streaming Messages request and save the full response to a file as-is. The file should end with event: tee.proof.

    Save a streaming response
    curl -sN https://api.wokey.ai/v1/messages \
      -H "x-api-key: YOUR_API_KEY" \
      -H "anthropic-version: 2023-06-01" \
      -H "Content-Type: application/json" \
      -d '{"model":"claude-sonnet-5","max_tokens":256,"stream":true,"messages":[{"role":"user","content":"Hello"}]}' \
      -o captured-response
  3. 3

    Check it with the open-source verifier

    Replace <PCR0> with the canonical PCR0 published in the repository README, then run the verifier. You can also paste the file into the browser verifier; every check runs locally.

    Check it with the open-source verifier
    git clone https://github.com/focuxdot/proof-of-observation
    cd proof-of-observation/verifier
    npm install
    npx tsx tee-verify-stream.ts ../../captured-response --pcr0 <PCR0>