curl --request GET \
--url https://api.ornn.com/v1/orchestrator/controllers \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.ornn.com/v1/orchestrator/controllers"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.ornn.com/v1/orchestrator/controllers', 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.ornn.com/v1/orchestrator/controllers",
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.ornn.com/v1/orchestrator/controllers"
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.ornn.com/v1/orchestrator/controllers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ornn.com/v1/orchestrator/controllers")
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{
"controllers": [
{
"controller": {
"id": "44444444-4444-4444-8444-444444444444",
"kind": "kubernetes",
"state": "active",
"network_mode": "public",
"network_id": null,
"endpoint": "https://cluster.example.com:6443",
"credential_state": "active",
"metadata": {
"namespace": "k8s-22222222-2222-4222-8222-222222222222"
},
"backend_metadata": {
"kubernetes_launch": {
"reservation_id": "11111111-1111-4111-8111-111111111111"
}
},
"progress": {
"stages": [
{
"key": "create_plane",
"label": "Create the control plane",
"status": "completed",
"detail": null
},
{
"key": "prepare_hosts",
"label": "Prepare the hosts",
"status": "completed",
"detail": null
},
{
"key": "join_workers",
"label": "Join the workers",
"status": "completed",
"detail": null
},
{
"key": "apply_plane",
"label": "Apply the control plane",
"status": "completed",
"detail": null
},
{
"key": "issue_access",
"label": "Issue access",
"status": "completed",
"detail": null
}
]
},
"created_at": "2026-10-14T12:00:00Z",
"updated_at": "2026-10-14T12:20:00Z"
},
"nodes": [
{
"node_id": "33333333-3333-4333-8333-333333333333",
"controller_id": "44444444-4444-4444-8444-444444444444",
"reservation_id": "11111111-1111-4111-8111-111111111111",
"role": "worker",
"state": "ready",
"gpu_count": 8,
"linux_username": "tenant",
"ssh_port": 22
}
]
}
]
}{
"code": "<string>",
"detail": "<string>"
}{
"code": "<string>",
"detail": "<string>"
}{
"code": "<string>",
"detail": "<string>"
}List clusters and workers
Returns up to 500 of your organization’s newest Kubernetes and Slurm clusters, each with its workers. A cluster leaves this list when its teardown finishes. There is no cursor and no customer GET-by-ID route. Select one cluster by controller.id. Your organization runs at most one live cluster of each kind, so after a create times out, the live cluster of that kind is the one it created. Poll this resource to follow launch, worker, and teardown progress. controller.state is active once every launch worker has joined and access has been issued; it does not prove Kubernetes Node readiness or GPU capacity. Because the list is bounded, confirm that a specific cluster’s teardown finished with getClusterAccess, which then returns 404 cluster_not_found.
curl --request GET \
--url https://api.ornn.com/v1/orchestrator/controllers \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.ornn.com/v1/orchestrator/controllers"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.ornn.com/v1/orchestrator/controllers', 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.ornn.com/v1/orchestrator/controllers",
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.ornn.com/v1/orchestrator/controllers"
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.ornn.com/v1/orchestrator/controllers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ornn.com/v1/orchestrator/controllers")
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{
"controllers": [
{
"controller": {
"id": "44444444-4444-4444-8444-444444444444",
"kind": "kubernetes",
"state": "active",
"network_mode": "public",
"network_id": null,
"endpoint": "https://cluster.example.com:6443",
"credential_state": "active",
"metadata": {
"namespace": "k8s-22222222-2222-4222-8222-222222222222"
},
"backend_metadata": {
"kubernetes_launch": {
"reservation_id": "11111111-1111-4111-8111-111111111111"
}
},
"progress": {
"stages": [
{
"key": "create_plane",
"label": "Create the control plane",
"status": "completed",
"detail": null
},
{
"key": "prepare_hosts",
"label": "Prepare the hosts",
"status": "completed",
"detail": null
},
{
"key": "join_workers",
"label": "Join the workers",
"status": "completed",
"detail": null
},
{
"key": "apply_plane",
"label": "Apply the control plane",
"status": "completed",
"detail": null
},
{
"key": "issue_access",
"label": "Issue access",
"status": "completed",
"detail": null
}
]
},
"created_at": "2026-10-14T12:00:00Z",
"updated_at": "2026-10-14T12:20:00Z"
},
"nodes": [
{
"node_id": "33333333-3333-4333-8333-333333333333",
"controller_id": "44444444-4444-4444-8444-444444444444",
"reservation_id": "11111111-1111-4111-8111-111111111111",
"role": "worker",
"state": "ready",
"gpu_count": 8,
"linux_username": "tenant",
"ssh_port": 22
}
]
}
]
}{
"code": "<string>",
"detail": "<string>"
}{
"code": "<string>",
"detail": "<string>"
}{
"code": "<string>",
"detail": "<string>"
}ornn login:
ornn clusters list
ornn clusters show CLUSTER_ID
ornn clusters wait CLUSTER_ID --timeout 60m
Authorizations
Create an organization API key in Account Settings > Developer. Do not send this key to the Kubernetes API server.
Query Parameters
Filter by cluster type.
kubernetes, slurm Response
Clusters with their worker memberships. The example shows an active Kubernetes cluster.
Show child attributes
Show child attributes
Was this page helpful?