curl --request GET \
--url https://compute.{region}.basaltic.sh/v1/instances/{instance_id}/volumes \
--header 'Authorization: Bearer <token>'import requests
url = "https://compute.{region}.basaltic.sh/v1/instances/{instance_id}/volumes"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://compute.{region}.basaltic.sh/v1/instances/{instance_id}/volumes', 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://compute.{region}.basaltic.sh/v1/instances/{instance_id}/volumes",
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://compute.{region}.basaltic.sh/v1/instances/{instance_id}/volumes"
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://compute.{region}.basaltic.sh/v1/instances/{instance_id}/volumes")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://compute.{region}.basaltic.sh/v1/instances/{instance_id}/volumes")
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{
"volumes": [
{
"id": "5f8d2c1a-9b3e-4d7a-8c6f-1e2a3b4c5d6e",
"crn": "crn:storage:sa-saopaulo-1:my-account:volume/data-volume-01",
"name": "data-vol-01",
"tags": {
"environment": "production",
"team": "backend"
},
"volume_type": "ssd",
"size_gb": 100,
"performance": {
"requested": {
"iops": 3000,
"bytes_per_sec": 131072000,
"burst_iops": 0,
"burst_bytes_per_sec": 0,
"burst_seconds": 0
},
"applied": {
"iops": 3000,
"bytes_per_sec": 131072000,
"burst_iops": 0,
"burst_bytes_per_sec": 0,
"burst_seconds": 0
}
},
"included_io_limits": {
"iops": 3000,
"bytes_per_sec": 131072000,
"burst_iops": 0,
"burst_bytes_per_sec": 0,
"burst_seconds": 0
},
"status": "available",
"bootable": false,
"faults": [
{
"code": "BACKUP_FAILED",
"severity": "error",
"message": "Backup upload failed.",
"details": {},
"first_at": "2023-11-07T05:31:56Z",
"last_at": "2023-11-07T05:31:56Z",
"occurrences": 1
}
],
"created_at": "2026-01-15T09:30:00Z",
"updated_at": "2026-01-15T09:31:12Z",
"source_image": {
"id": "550e8400-e29b-41d4-a716-446655440004",
"crn": "crn:compute:sa-saopaulo-1:platform:image/ubuntu/architecture/amd64/version/24.04",
"name": "ubuntu"
},
"source_snapshot": {
"id": "550e8400-e29b-41d4-a716-446655440011",
"crn": "crn:storage:sa-saopaulo-1:my-account:volume/data/snapshot/nightly",
"name": "nightly"
},
"device": "vdb",
"boot_index": 1,
"delete_on_termination": false,
"description": "Primary data volume for app-01",
"mount_path": "/data",
"fstype": "ext4",
"mount": {
"state": "unknown",
"code": "unsafe_serial",
"message": "/dev/disk/by-id/virtio-9f2c has a gpt partition table but no mountable filesystem, so this agent will not format it; formatting would destroy what is there",
"since": "2023-11-07T05:31:56Z",
"reported_at": "2023-11-07T05:31:56Z"
}
}
],
"meta": {
"limit": 1,
"has_more": false
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication required",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "ACCESS_DENIED",
"message": "You don't have permission to perform this action",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "An internal error occurred",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}List the instance's attached volumes
Returns storage volume resources plus instance binding fields, ordered by boot index (boot disk first). The complete finite collection is wrapped in volumes with meta.
curl --request GET \
--url https://compute.{region}.basaltic.sh/v1/instances/{instance_id}/volumes \
--header 'Authorization: Bearer <token>'import requests
url = "https://compute.{region}.basaltic.sh/v1/instances/{instance_id}/volumes"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://compute.{region}.basaltic.sh/v1/instances/{instance_id}/volumes', 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://compute.{region}.basaltic.sh/v1/instances/{instance_id}/volumes",
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://compute.{region}.basaltic.sh/v1/instances/{instance_id}/volumes"
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://compute.{region}.basaltic.sh/v1/instances/{instance_id}/volumes")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://compute.{region}.basaltic.sh/v1/instances/{instance_id}/volumes")
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{
"volumes": [
{
"id": "5f8d2c1a-9b3e-4d7a-8c6f-1e2a3b4c5d6e",
"crn": "crn:storage:sa-saopaulo-1:my-account:volume/data-volume-01",
"name": "data-vol-01",
"tags": {
"environment": "production",
"team": "backend"
},
"volume_type": "ssd",
"size_gb": 100,
"performance": {
"requested": {
"iops": 3000,
"bytes_per_sec": 131072000,
"burst_iops": 0,
"burst_bytes_per_sec": 0,
"burst_seconds": 0
},
"applied": {
"iops": 3000,
"bytes_per_sec": 131072000,
"burst_iops": 0,
"burst_bytes_per_sec": 0,
"burst_seconds": 0
}
},
"included_io_limits": {
"iops": 3000,
"bytes_per_sec": 131072000,
"burst_iops": 0,
"burst_bytes_per_sec": 0,
"burst_seconds": 0
},
"status": "available",
"bootable": false,
"faults": [
{
"code": "BACKUP_FAILED",
"severity": "error",
"message": "Backup upload failed.",
"details": {},
"first_at": "2023-11-07T05:31:56Z",
"last_at": "2023-11-07T05:31:56Z",
"occurrences": 1
}
],
"created_at": "2026-01-15T09:30:00Z",
"updated_at": "2026-01-15T09:31:12Z",
"source_image": {
"id": "550e8400-e29b-41d4-a716-446655440004",
"crn": "crn:compute:sa-saopaulo-1:platform:image/ubuntu/architecture/amd64/version/24.04",
"name": "ubuntu"
},
"source_snapshot": {
"id": "550e8400-e29b-41d4-a716-446655440011",
"crn": "crn:storage:sa-saopaulo-1:my-account:volume/data/snapshot/nightly",
"name": "nightly"
},
"device": "vdb",
"boot_index": 1,
"delete_on_termination": false,
"description": "Primary data volume for app-01",
"mount_path": "/data",
"fstype": "ext4",
"mount": {
"state": "unknown",
"code": "unsafe_serial",
"message": "/dev/disk/by-id/virtio-9f2c has a gpt partition table but no mountable filesystem, so this agent will not format it; formatting would destroy what is there",
"since": "2023-11-07T05:31:56Z",
"reported_at": "2023-11-07T05:31:56Z"
}
}
],
"meta": {
"limit": 1,
"has_more": false
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication required",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "ACCESS_DENIED",
"message": "You don't have permission to perform this action",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "An internal error occurred",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}compute:GetInstance. See COMPUTE permissions for the full list, what each one covers, and an example policy.Authorizations
An OAuth 2.0 bearer token, sent as Authorization: Bearer <token>.
This is the recommended way to authenticate.
Get one by exchanging a service account's access key pair at
POST /v1/oauth/token with grant_type=client_credentials. It is the
standard client-credentials grant, so any OAuth-aware library will
obtain and refresh it for you.
curl -s -u "$KEY_ID:$SECRET" -d grant_type=client_credentials \ https://iam.basaltic.sh/v1/oauth/token
Tokens last an hour by default. The same access key pair is separately your AWS SigV4 credential for the S3-compatible object endpoint, which speaks nothing else.
Path Parameters
Instance ID
Query Parameters
Exact, case-sensitive name. Empty values match no named resources. Instance NIC lists match interface names within the instance bindings; multiple interfaces with the same name may match. Floating IPs have no name identity and return an empty list for this filter.
Exact resource CRN, intersected with all other filters before pagination. A foreign or mismatched CRN returns an empty page; malformed or empty CRNs return 400. Nested attachment lists filter the represented resource, not the binding.

