curl --request POST \
--url https://api.ornn.com/v1/orchestrator/drives \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "training-data"
}
'import requests
url = "https://api.ornn.com/v1/orchestrator/drives"
payload = { "name": "training-data" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: 'training-data'})
};
fetch('https://api.ornn.com/v1/orchestrator/drives', 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/drives",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'training-data'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.ornn.com/v1/orchestrator/drives"
payload := strings.NewReader("{\n \"name\": \"training-data\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.ornn.com/v1/orchestrator/drives")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"training-data\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ornn.com/v1/orchestrator/drives")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"training-data\"\n}"
response = http.request(request)
puts response.read_body{
"id": "77777777-7777-4777-8777-777777777777",
"source_drive_id": null,
"name": "training-data",
"status": "active",
"size_bytes": 0,
"file_count": 0,
"file_tree_status": "ready",
"content_epoch": 0,
"source": {
"status": "ready",
"region": "us-central1",
"read_only": false,
"github_repositories": []
},
"file_capabilities": {
"state": "ready",
"can_upload": true,
"message": null
},
"active_mount": null,
"active_mounts": [],
"created_at": "2026-10-14T12:00:00Z",
"updated_at": "2026-10-14T12:00:00Z"
}{
"code": "<string>",
"detail": "<string>"
}{
"code": "<string>",
"detail": "<string>"
}{
"code": "<string>",
"detail": "<string>"
}{
"code": "<string>",
"detail": "<string>"
}{
"detail": {
"code": "storage_drive_name_required",
"message": "Give the volume a name."
}
}{
"code": "<string>",
"detail": "<string>"
}Create a volume
Creates an empty volume, or duplicates one of your volumes when source_drive_id is set. A duplicate copies files in the background; its size is reported when the copy finishes. Creating a volume does not attach it to compute. Object storage is billed for the data stored. This request is not idempotent; after a timeout, list volumes by name before retrying.
curl --request POST \
--url https://api.ornn.com/v1/orchestrator/drives \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "training-data"
}
'import requests
url = "https://api.ornn.com/v1/orchestrator/drives"
payload = { "name": "training-data" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: 'training-data'})
};
fetch('https://api.ornn.com/v1/orchestrator/drives', 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/drives",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'training-data'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.ornn.com/v1/orchestrator/drives"
payload := strings.NewReader("{\n \"name\": \"training-data\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.ornn.com/v1/orchestrator/drives")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"training-data\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ornn.com/v1/orchestrator/drives")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"training-data\"\n}"
response = http.request(request)
puts response.read_body{
"id": "77777777-7777-4777-8777-777777777777",
"source_drive_id": null,
"name": "training-data",
"status": "active",
"size_bytes": 0,
"file_count": 0,
"file_tree_status": "ready",
"content_epoch": 0,
"source": {
"status": "ready",
"region": "us-central1",
"read_only": false,
"github_repositories": []
},
"file_capabilities": {
"state": "ready",
"can_upload": true,
"message": null
},
"active_mount": null,
"active_mounts": [],
"created_at": "2026-10-14T12:00:00Z",
"updated_at": "2026-10-14T12:00:00Z"
}{
"code": "<string>",
"detail": "<string>"
}{
"code": "<string>",
"detail": "<string>"
}{
"code": "<string>",
"detail": "<string>"
}{
"code": "<string>",
"detail": "<string>"
}{
"detail": {
"code": "storage_drive_name_required",
"message": "Give the volume a name."
}
}{
"code": "<string>",
"detail": "<string>"
}ornn volumes create --name training-data --yes --idempotency-key <key> --format json.Authorizations
Create an organization API key in Account Settings > Developer. Do not send this key to the Kubernetes API server.
Body
Response
The new volume.
A volume. Responses can include additional fields; ignore fields you do not recognize.
active for a usable volume.
The volume this one was duplicated from.
Measured size. It can lag writes from mounted machines.
A preview of recently updated files. Use List volume files for a complete listing.
Increases whenever the volume's files change.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
The volume's mount on one VM or Bare Metal node.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Was this page helpful?