Attest a sandbox's host
curl --request GET \
--url https://api.zode.dev/v1/sandboxes/{id}/attestation \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.zode.dev/v1/sandboxes/{id}/attestation"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.zode.dev/v1/sandboxes/{id}/attestation', 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.zode.dev/v1/sandboxes/{id}/attestation",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.zode.dev/v1/sandboxes/{id}/attestation"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.zode.dev/v1/sandboxes/{id}/attestation")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zode.dev/v1/sandboxes/{id}/attestation")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"sandbox_id": "<string>",
"attestation": {
"host": "<string>",
"region": "<string>",
"report": {
"class": "tpm_quoted",
"release": "<string>",
"manifest": "aSDinaTvuI8gbWludGxpZnk=",
"manifest_digest": "<string>",
"bundle": {},
"measured": [
{
"name": "<string>",
"path": "<string>",
"sha256": "<string>",
"error": "<string>"
}
],
"measured_at": "2023-11-07T05:31:56Z",
"quote": {
"nonce": "<string>",
"attest": "aSDinaTvuI8gbWludGxpZnk=",
"signature": "aSDinaTvuI8gbWludGxpZnk=",
"ak_public": "<string>",
"pcrs": {}
},
"error": "<string>"
},
"verdict": {
"ok": true,
"class": "tpm_quoted",
"claimed": "<string>",
"checks": [
"<string>"
],
"release": "<string>",
"manifest_digest": "<string>",
"log": {
"log": "<string>",
"log_url": "<string>",
"log_index": 123,
"tree_size": 123,
"root_hash": "<string>",
"integrated_time": "2023-11-07T05:31:56Z",
"set": true
},
"limits": [
"<string>"
],
"problem": "<string>"
}
}
}{
"error": {
"code": "not_found",
"message": "<string>"
}
}{
"error": {
"code": "not_found",
"message": "<string>"
}
}{
"error": {
"code": "not_found",
"message": "<string>"
}
}{
"error": {
"code": "not_found",
"message": "<string>"
}
}{
"error": {
"code": "not_found",
"message": "<string>"
}
}{
"error": {
"code": "not_found",
"message": "<string>"
}
}{
"error": {
"code": "not_found",
"message": "<string>"
}
}Attestation
Attest a sandbox's host
Attestation of the host a sandbox runs on (owner, admin, member).
The host’s own report, relayed unchanged, plus this server’s verdict.
zode verify checks the report itself (Zode release signature,
Sigstore Rekor inclusion proof, measurements, and on tpm_quoted hosts
a TPM quote over the caller’s nonce) and does not rely on verdict.
GET
/
v1
/
sandboxes
/
{id}
/
attestation
Attest a sandbox's host
curl --request GET \
--url https://api.zode.dev/v1/sandboxes/{id}/attestation \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.zode.dev/v1/sandboxes/{id}/attestation"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.zode.dev/v1/sandboxes/{id}/attestation', 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.zode.dev/v1/sandboxes/{id}/attestation",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.zode.dev/v1/sandboxes/{id}/attestation"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.zode.dev/v1/sandboxes/{id}/attestation")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zode.dev/v1/sandboxes/{id}/attestation")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"sandbox_id": "<string>",
"attestation": {
"host": "<string>",
"region": "<string>",
"report": {
"class": "tpm_quoted",
"release": "<string>",
"manifest": "aSDinaTvuI8gbWludGxpZnk=",
"manifest_digest": "<string>",
"bundle": {},
"measured": [
{
"name": "<string>",
"path": "<string>",
"sha256": "<string>",
"error": "<string>"
}
],
"measured_at": "2023-11-07T05:31:56Z",
"quote": {
"nonce": "<string>",
"attest": "aSDinaTvuI8gbWludGxpZnk=",
"signature": "aSDinaTvuI8gbWludGxpZnk=",
"ak_public": "<string>",
"pcrs": {}
},
"error": "<string>"
},
"verdict": {
"ok": true,
"class": "tpm_quoted",
"claimed": "<string>",
"checks": [
"<string>"
],
"release": "<string>",
"manifest_digest": "<string>",
"log": {
"log": "<string>",
"log_url": "<string>",
"log_index": 123,
"tree_size": 123,
"root_hash": "<string>",
"integrated_time": "2023-11-07T05:31:56Z",
"set": true
},
"limits": [
"<string>"
],
"problem": "<string>"
}
}
}{
"error": {
"code": "not_found",
"message": "<string>"
}
}{
"error": {
"code": "not_found",
"message": "<string>"
}
}{
"error": {
"code": "not_found",
"message": "<string>"
}
}{
"error": {
"code": "not_found",
"message": "<string>"
}
}{
"error": {
"code": "not_found",
"message": "<string>"
}
}{
"error": {
"code": "not_found",
"message": "<string>"
}
}{
"error": {
"code": "not_found",
"message": "<string>"
}
}Authorizations
An API key (zode_tok_...). Create one in the console under API keys (https://console.zode.dev/tokens), or with zode login.
Query Parameters
⌘I