Session
curl --request GET \
--url https://api.example.com/aci/sessions/{session_id}import requests
url = "https://api.example.com/aci/sessions/{session_id}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/aci/sessions/{session_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/aci/sessions/{session_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/aci/sessions/{session_id}"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/aci/sessions/{session_id}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/aci/sessions/{session_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyAPI Reference
Session
The immutable attested-session record behind a confidential response.
GET
/
aci
/
sessions
/
{session_id}
Session
curl --request GET \
--url https://api.example.com/aci/sessions/{session_id}import requests
url = "https://api.example.com/aci/sessions/{session_id}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/aci/sessions/{session_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/aci/sessions/{session_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/aci/sessions/{session_id}"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/aci/sessions/{session_id}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/aci/sessions/{session_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyReturns an attested session: the immutable, content-addressed
record of the verified TEE channel a confidential request was bound to. A receipt’s
Returns
upstream.verified.session_id references it, so you can trace any confidential response back to the
exact verified security context, with its typed claims and channel binding.
GET /v1/aci/sessions/{session_id}
GET /v1/aci/sessions?upstream_name={upstream_name}&model={model}
Get one session
string
required
The bare 64-character lowercase hex id (no prefix) from a receipt’s
upstream.verified.session_id.Response
| Field | Type | Description |
|---|---|---|
api_version | string | ACI version token. |
upstream_name | string | The service-chosen upstream label for this channel. |
endpoint | string | The verified upstream origin. |
verifier_id | string | The verifier that produced this result. |
established_at | number | When the material was verified (Unix seconds). |
expires_at | number | Retention deadline (Unix seconds). |
identity | object | Verified upstream identity keys (for example a signing address). |
channel_binding | array | The enforceable binding(s): TLS SPKI, E2EE public key, or measured co-deployed proxy image/credential. |
claims | object | Typed claims (below). |
evidence | object | Byte-preserving evidence the verifier checked (digest + data URI). |
Binding types
| Type | Meaning |
|---|---|
tls_spki_sha256 | Pins the upstream TLS public key. |
e2ee_public_key_sha256 | Binds provider-facing encryption to a verified key. |
proxy_image_sha256 | Binds Privatemode forwarding to the co-deployed proxy’s measured image (proxy_image_digest) and startup-checked shared credential digest (credential_sha256); plaintext is sent only to its configured internal origin. |
Typed claims
Each claim carries astatus (asserted / refuted / unknown), a source
(hardware_proven / verifier_derived / provider_asserted / operator_asserted), and a reason. The
claim set: tee_attested, tcb_up_to_date, os_known_good, serving_software_known_good,
gpu_attested, model_weights_provenance, plus provider-specific entries in extra. See
Claims.
{
"api_version": "aci/1",
"upstream_name": "near-ai",
"endpoint": "https://cloud-api.near.ai",
"verifier_id": "private-ai-verifier/near-ai-gateway/v1",
"established_at": 1781588840,
"expires_at": 1781589140,
"channel_binding": [
{ "type": "tls_spki_sha256", "origin": "https://cloud-api.near.ai", "spki_sha256": "…" }
],
"claims": {
"tee_attested": { "status": "asserted", "source": "hardware_proven", "reason": "verified TDX quote" },
"tcb_up_to_date": { "status": "asserted", "source": "hardware_proven" },
"gpu_attested": { "status": "unknown" }
},
"evidence": { "digest": "sha256:…", "data": "data:application/json;base64,…" }
}
List current sessions
GET /v1/aci/sessions?upstream_name={upstream_name}&model={model} returns current attested sessions.
The endpoint is public. upstream_name is a service-chosen route label such as chutes or phala-267, rather than a catalog provider id. Use it as a preflight survey: inspect the verified identity, channel binding, and claims for a model
before sending a prompt.
curl "https://inference.phala.com/v1/aci/sessions?upstream_name=chutes"
{ "api_version": "aci/1", "sessions": [...] }. Each list entry includes its session_id
but omits the bulky evidence.data; fetch the full record before verifying its content hash.
Why content-addressed
The full session document does not contain its own id.session_id is the bare SHA-256 of the full session document in canonical JCS form. Any change
produces a new id, and sessions are never updated in place. Recompute the id after fetching the full
record to confirm it is exactly the document cited by the receipt.
Related
Verified upstreams
Get receipt
Was this page helpful?

