The Agent API runs inside a hardware-isolated confidential VM (Intel TDX, on Phala’s dstack). TLS ends inside that VM, so the machine that hosts it only ever carries ciphertext, and anyone can check which code is running.
At a glance
  • Inside the attested VM: the API server, its database on an encrypted disk, encrypted backups, TLS termination, the geofence and the transparency log notary.
  • Not inside it: agent funds. They sit in each agent’s wallet on NEAR Intents, under the policy the owner signed.
  • Proof: GET /tee/attestation returns a TDX quote that binds the API’s TLS key, the notary’s keys and your own nonce.
  • Verify it in about 15 minutes with curl, openssl, jq, xxd, base64 and Docker. No API key needed.

What it guarantees

What the TEE gives you

  • TLS ends inside the attested VM. Its certificate key is created there and never leaves it.
  • The host machine can’t read requests, keys or the database.
  • Every container image is pinned by digest in the compose file that the quote attests.
  • The notary that signs the transparency log holds keys bound into the same quote.

What it doesn't cover

  • Funds. They’re in the agent’s wallet on NEAR Intents, not in the VM. The policy limits what the API can do with them.
  • Gateway metadata. Phala’s gateway, in its own TEE, sees the caller’s IP address and the host name. Everything else is encrypted.
  • Logs and metrics. A telemetry container (Grafana Alloy) sends them out of the VM to Grafana Cloud. Before a log line leaves, every IPv4 address is replaced with <redacted> and Postgres DETAIL lines, which quote row values, are dropped. Its write token is a sealed secret.
  • Rebuilding from source. The images are built reproducibly, but the source isn’t public yet, so you can check which images run, not rebuild them.

What runs inside

Geofence

Connections from these jurisdictions are refused before TLS completes, matching the NEAR AI Cloud terms of service: Cuba, Iran, North Korea, Syria, and the Crimea (Sevastopol included), Donetsk and Luhansk regions of Ukraine. A refused client sees a closed connection, not an HTTP error. Addresses are placed by where they were allocated, so a caller on a rented foreign host is placed by that host.

Endpoints

All three are public GETs on the API host. /tee/info and /tee/attestation can answer 503 with {"error":"busy"} and Retry-After: 1 when quote requests are already in flight, so try again after a second. Either can answer 502 with {"error":"attestation_unavailable"} when the VM could not produce the answer. A nonce that is not 64 lowercase hex characters is a 400.

Verify it yourself

This walkthrough checks that a connection to api.agentsonintents.com ends inside a genuine, up-to-date TDX VM running the compose it publishes, and that the notary keys belong to that VM.
1

Prerequisites

curl, openssl, jq, xxd and Docker. Work in an empty directory:
2

Read the VM's identity

Note app_id. It stays the same across releases of this deployment. compose_hash changes with every release.
3

Ask for a quote with your own nonce

A fresh nonce proves the quote was made for you, now.
request_nonce must equal $NONCE.
4

Get the TLS key fingerprint yourself

The SHA-256 of the certificate’s public key (SubjectPublicKeyInfo), read from your own connection:
It must equal tls_cert_fingerprint in att.json. The certificate renews about every 60 days. If the two differ, run steps 3 and 4 again.
5

Check report_data

The quote’s report_data is 64 bytes: SHA-256(signing_address ‖ tls_fingerprint) followed by your nonce. signing_address is the notary’s log key followed by its cosigner key.
Then check that signing_address is exactly the two published notary keys. A key reads <name>+<key hash>+<base64>; the base64 decodes to one type byte and the 32-byte public key:
This is the same layout NEAR AI Cloud’s verifier checks.
6

Verify the quote with dstack-verifier

Run Phala’s verifier, pinned by digest, and send it the quote. It checks Intel’s signature chain and replays the event log.
A pass needs all of these:
7

Tie the compose to the quote

The quote attests a compose hash. /tee/info publishes the compose itself. They must match:
Now app_compose is exactly what the VM runs. Read it to see every image digest, every measured setting and the names of the sealed secrets:
With every check passing, a connection to the API host ends inside a genuine Intel TDX VM with a production OS image and an up-to-date TCB, running exactly the published compose, and the notary keys that sign the transparency log belong to that VM.
Steps 3 and 4 read the certificate over two separate TLS connections to the same host. That’s enough here, because the quote binds the key itself, and both connections must present it.

Next steps

Transparency Proofs

Check every execution’s audit trail against the log this notary signs.

How it works

The checks every action passes before it reaches the agent’s wallet.