curl --request GET \
--url https://odyssey.asteroid.ai/agents/v2/environments/{environmentId} \
--header 'X-Asteroid-Agents-Api-Key: <api-key>'import requests
url = "https://odyssey.asteroid.ai/agents/v2/environments/{environmentId}"
headers = {"X-Asteroid-Agents-Api-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Asteroid-Agents-Api-Key': '<api-key>'}};
fetch('https://odyssey.asteroid.ai/agents/v2/environments/{environmentId}', 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://odyssey.asteroid.ai/agents/v2/environments/{environmentId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Asteroid-Agents-Api-Key: <api-key>"
],
]);
$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://odyssey.asteroid.ai/agents/v2/environments/{environmentId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Asteroid-Agents-Api-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://odyssey.asteroid.ai/agents/v2/environments/{environmentId}")
.header("X-Asteroid-Agents-Api-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://odyssey.asteroid.ai/agents/v2/environments/{environmentId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Asteroid-Agents-Api-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"connection": {
"cdpUrl": "<string>",
"cua": {
"sessionId": "<string>",
"anchorBaseUrl": "<string>",
"daytonaToolboxBaseUrl": "<string>"
}
},
"createdAt": "2023-11-07T05:31:56Z",
"expiresAt": "2023-11-07T05:31:56Z",
"hasRecording": true,
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organizationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"owner": {
"agentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"executionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "execution"
},
"state": {
"environmentType": "browser",
"hasRecording": true,
"height": 123,
"width": 123,
"browserIp": "<string>",
"liveViewUrl": "<string>",
"providerConfig": {
"type": "anchor",
"sessionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sessionUrl": "<string>"
},
"recordingStartedAt": "2023-11-07T05:31:56Z",
"recordingUrl": "<string>"
},
"agentProfileId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"readyAt": "2023-11-07T05:31:56Z",
"stoppedAt": "2023-11-07T05:31:56Z"
}{
"code": 400,
"message": "<string>"
}{
"code": 401,
"message": "<string>"
}{
"code": 403,
"message": "<string>"
}{
"code": 404,
"message": "<string>"
}{
"code": 500,
"message": "<string>"
}Get environment
Read an environment, including the provider state the live view renders from. Terminal environments are returned too, so the caller can play the recording.
curl --request GET \
--url https://odyssey.asteroid.ai/agents/v2/environments/{environmentId} \
--header 'X-Asteroid-Agents-Api-Key: <api-key>'import requests
url = "https://odyssey.asteroid.ai/agents/v2/environments/{environmentId}"
headers = {"X-Asteroid-Agents-Api-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Asteroid-Agents-Api-Key': '<api-key>'}};
fetch('https://odyssey.asteroid.ai/agents/v2/environments/{environmentId}', 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://odyssey.asteroid.ai/agents/v2/environments/{environmentId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Asteroid-Agents-Api-Key: <api-key>"
],
]);
$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://odyssey.asteroid.ai/agents/v2/environments/{environmentId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Asteroid-Agents-Api-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://odyssey.asteroid.ai/agents/v2/environments/{environmentId}")
.header("X-Asteroid-Agents-Api-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://odyssey.asteroid.ai/agents/v2/environments/{environmentId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Asteroid-Agents-Api-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"connection": {
"cdpUrl": "<string>",
"cua": {
"sessionId": "<string>",
"anchorBaseUrl": "<string>",
"daytonaToolboxBaseUrl": "<string>"
}
},
"createdAt": "2023-11-07T05:31:56Z",
"expiresAt": "2023-11-07T05:31:56Z",
"hasRecording": true,
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organizationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"owner": {
"agentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"executionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "execution"
},
"state": {
"environmentType": "browser",
"hasRecording": true,
"height": 123,
"width": 123,
"browserIp": "<string>",
"liveViewUrl": "<string>",
"providerConfig": {
"type": "anchor",
"sessionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sessionUrl": "<string>"
},
"recordingStartedAt": "2023-11-07T05:31:56Z",
"recordingUrl": "<string>"
},
"agentProfileId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"readyAt": "2023-11-07T05:31:56Z",
"stoppedAt": "2023-11-07T05:31:56Z"
}{
"code": 400,
"message": "<string>"
}{
"code": 401,
"message": "<string>"
}{
"code": 403,
"message": "<string>"
}{
"code": 404,
"message": "<string>"
}{
"code": 500,
"message": "<string>"
}Authorizations
Path Parameters
The environment to read.
Response
The request has succeeded.
A single environment: what it is, its provider state, and how to drive it. state is the same shape the execution endpoint returns, so the LiveView/OsLiveView components render either without branching.
How to connect to it.
Show child attributes
Show child attributes
When the environment row was created.
Browser or OS.
browser, os When the reaper will tear the environment down if no graceful Stop arrives first.
Whether a playable recording has been persisted (GCS object or provider URL). The playable URL itself is minted on the by-id read.
Environment identifier.
The organisation the environment belongs to.
Who the environment belongs to, and the identity that owner carries.
- Option 1
- Option 2
- Option 3
Show child attributes
Show child attributes
Environment state (browser or OS): live-view URL, viewport, provider config and a freshly-minted recording URL when one exists.
- Option 1
- Option 2
Show child attributes
Show child attributes
Current status, terminal states included. Lists exclude terminal environments unless includeTerminal is set.
requested, provisioning, ready, stopping, stopped, failed, dead Profile snapshot the environment was booted against, if any.
Operating system for OS environments. Absent for browser environments; linux when an OS environment predates explicit osType storage.
linux, windows When the environment first became ready, if it reached that state.
When the environment reached a terminal state. Set after Stop runs.

