curl --request GET \
--url https://sailbox-api.sailresearch.com/v1/sailboxes/{sailbox_id}/executions \
--header 'Authorization: Bearer <token>'import requests
url = "https://sailbox-api.sailresearch.com/v1/sailboxes/{sailbox_id}/executions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sailbox-api.sailresearch.com/v1/sailboxes/{sailbox_id}/executions', 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://sailbox-api.sailresearch.com/v1/sailboxes/{sailbox_id}/executions",
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://sailbox-api.sailresearch.com/v1/sailboxes/{sailbox_id}/executions"
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://sailbox-api.sailresearch.com/v1/sailboxes/{sailbox_id}/executions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sailbox-api.sailresearch.com/v1/sailboxes/{sailbox_id}/executions")
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{
"executions": [
{
"execution_id": "exec_123",
"argv": [
"echo",
"hi"
],
"state": "EXEC_RECORD_STATE_SUCCEEDED",
"started_at_unix_nanos": "1792440000000000000",
"completed_at_unix_nanos": "1792440001000000000",
"return_code": 0,
"pty": false,
"stdout_truncated": false,
"stderr_truncated": false,
"output_evicted": false,
"metadata_truncated": false
}
],
"chunks": [],
"unavailable_reason": "",
"history_truncated": false
}Snapshot recent executions
Reads recent retained execution metadata, running executions first and then newest admission/completion. Output chunks are empty. Historical pagination is not supported.
These reads never start a command, wake or resume a Sailbox, attach a command output consumer, or extend its idle lifetime. A non-running Sailbox, unsupported installed software, or a temporary observation failure returns 200 with unavailable_reason. This is distinct from an available empty result.
Requires an organization API key or a valid Sail session bearer token. The Sailbox must belong to that organization. Private Sailboxes require their creator or an organization admin supplying an owner override reason. Output can contain arbitrary bytes; decode data from base64. All int64 values are decimal strings.
curl --request GET \
--url https://sailbox-api.sailresearch.com/v1/sailboxes/{sailbox_id}/executions \
--header 'Authorization: Bearer <token>'import requests
url = "https://sailbox-api.sailresearch.com/v1/sailboxes/{sailbox_id}/executions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sailbox-api.sailresearch.com/v1/sailboxes/{sailbox_id}/executions', 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://sailbox-api.sailresearch.com/v1/sailboxes/{sailbox_id}/executions",
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://sailbox-api.sailresearch.com/v1/sailboxes/{sailbox_id}/executions"
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://sailbox-api.sailresearch.com/v1/sailboxes/{sailbox_id}/executions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sailbox-api.sailresearch.com/v1/sailboxes/{sailbox_id}/executions")
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{
"executions": [
{
"execution_id": "exec_123",
"argv": [
"echo",
"hi"
],
"state": "EXEC_RECORD_STATE_SUCCEEDED",
"started_at_unix_nanos": "1792440000000000000",
"completed_at_unix_nanos": "1792440001000000000",
"return_code": 0,
"pty": false,
"stdout_truncated": false,
"stderr_truncated": false,
"output_evicted": false,
"metadata_truncated": false
}
],
"chunks": [],
"unavailable_reason": "",
"history_truncated": false
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
Lets an organization admin operate a private Sailbox someone else created. Say why in plain text; the reason goes into your organization's audit log, and the operation is refused without it. Ignored on Sailboxes you could already operate.
Pause, resume, sleep, scheduled wake, upgrade, reboot, and terminate accept an override, and so does deleting a checkpoint taken from the Sailbox. Setting an egress policy accepts one too. Running commands and moving files accept one through an SDK or the CLI. Publishing and unpublishing ports, adding and removing custom domains, checkpointing, and creating from a checkpoint stay with the creator.
^[ -~]*$Path Parameters
Id of the Sailbox, as returned by create. It is sb_ followed by a UUID.
Query Parameters
Exact execution id, URL-encoded and limited to 256 KiB of UTF-8. Empty or omitted selects the current window.
262144Maximum execution metadata records per response. Byte budgets may return fewer.
1 <= x <= 64Maximum decoded output bytes across all chunks per response. The executions endpoint validates this bound but returns no output.
1024 <= x <= 262144Response
Success.
A bounded snapshot with explicit defaults. It is not a complete or offline execution history.
64Show child attributes
Show child attributes
Independent stream tails. Replace the previous snapshot; do not append. Always empty for the executions listing.
128Show child attributes
Show child attributes
Empty when this observation is available. A nonempty reason means unavailable, not an empty history. sailbox_ means the Sailbox is not running. unsupported_guest means its installed software does not support observation. placement_unavailable, guest_unavailable and worker_unreachable indicate an unavailable or changing connection. execution_not_retained means the selected execution is absent from retained metadata. observation_unavailable means the read could not be completed. Treat unknown future reasons as unavailable.
The output window or metadata budget omitted records, or a record disappeared during the read. Historical pagination is not supported.