API reference
Base URL: https://braesystems.com/api
Every endpoint requires an API key:
Authorization: Bearer bs_live_...Servers
GET/api/v1/servers
List servers
Every server in your account, with its addresses and current status.
Example request
curl https://braesystems.com/api/v1/servers \
-H "Authorization: Bearer bs_live_..."Example response
{
"data": [
{
"id": "9f1c7d2e-4a3b-4c5d-8e6f-0a1b2c3d4e5f",
"name": "kelp-01",
"status": "provisioning",
"model": "PowerEdge R760xa",
"project_id": "9f1c7d2e-4a3b-4c5d-8e6f-0a1b2c3d4e5f",
"image": "ubuntu-24-04",
"ipv4": [
{
"address": "203.0.113.11",
"version": 4,
"kind": "public"
}
],
"ipv6": [
{
"address": "203.0.113.11",
"version": 4,
"kind": "public"
}
],
"created_at": "2026-07-29T14:03:11.000Z"
}
]
}Responses
| 200 | The servers in your account. |
| 401 | Missing or invalid API key. |
GET/api/v1/servers/{id}
Get a server
Path parameters
| id* | uuid | Server id. |
Example request
curl https://braesystems.com/api/v1/servers/$SERVER_ID \
-H "Authorization: Bearer bs_live_..."Example response
{
"data": {
"id": "9f1c7d2e-4a3b-4c5d-8e6f-0a1b2c3d4e5f",
"name": "kelp-01",
"status": "provisioning",
"model": "PowerEdge R760xa",
"project_id": "9f1c7d2e-4a3b-4c5d-8e6f-0a1b2c3d4e5f",
"image": "ubuntu-24-04",
"ipv4": [
{
"address": "203.0.113.11",
"version": 4,
"kind": "public"
}
],
"ipv6": [
{
"address": "203.0.113.11",
"version": 4,
"kind": "public"
}
],
"created_at": "2026-07-29T14:03:11.000Z"
}
}Responses
| 200 | The server. |
| 401 | Missing or invalid API key. |
| 404 | No such resource in this account. |
GET/api/v1/servers/{id}/ips
List a server's IP addresses
Both IPv4 and IPv6 addresses assigned to the server.
Path parameters
| id* | uuid | Server id. |
Example request
curl https://braesystems.com/api/v1/servers/$SERVER_ID/ips \
-H "Authorization: Bearer bs_live_..."Example response
{
"data": [
{
"address": "203.0.113.11",
"version": 4,
"kind": "public"
}
]
}Responses
| 200 | The server's addresses. |
| 401 | Missing or invalid API key. |
| 404 | No such resource in this account. |
POST/api/v1/servers/{id}/reboot
Reboot a server
Requests a graceful restart, escalating to a forced restart if the machine does not come back in time. Returns immediately with an action; poll `GET /api/v1/actions/{id}` to follow it.
Path parameters
| id* | uuid | Server id. |
Example request
curl -X POST https://braesystems.com/api/v1/servers/$SERVER_ID/reboot \
-H "Authorization: Bearer bs_live_..."Example response
{
"data": {
"id": "9f1c7d2e-4a3b-4c5d-8e6f-0a1b2c3d4e5f",
"server_id": "9f1c7d2e-4a3b-4c5d-8e6f-0a1b2c3d4e5f",
"kind": "reboot",
"status": "queued",
"error": null,
"simulated": false,
"created_at": "2026-07-29T14:03:11.000Z",
"completed_at": null
}
}Responses
| 202 | Reboot accepted. |
| 401 | Missing or invalid API key. |
| 404 | No such resource in this account. |
| 409 | The server is busy or not in a state that allows this. |
POST/api/v1/servers/{id}/reimage
Re-image a server
Wipes the server and installs a fresh operating system. **All data on the machine is destroyed.** The selected SSH keys are installed during the install — this is the only point at which keys reach a server. Returns immediately with an action; poll `GET /api/v1/actions/{id}` to follow it.
Path parameters
| id* | uuid | Server id. |
Request body
| image* | string | Slug of an image from GET /api/v1/images. |
| ssh_key_ids | uuid[] | Keys to install on the rebuilt machine. Defaults to every key on the account. This is the only point at which SSH keys reach a server. |
Example request
curl -X POST https://braesystems.com/api/v1/servers/$SERVER_ID/reimage \
-H "Authorization: Bearer bs_live_..." \
-H "Content-Type: application/json" \
-d '{"image":"ubuntu-24-04"}'Example response
{
"data": {
"id": "9f1c7d2e-4a3b-4c5d-8e6f-0a1b2c3d4e5f",
"server_id": "9f1c7d2e-4a3b-4c5d-8e6f-0a1b2c3d4e5f",
"kind": "reboot",
"status": "queued",
"error": null,
"simulated": false,
"created_at": "2026-07-29T14:03:11.000Z",
"completed_at": null
}
}Responses
| 202 | Re-image accepted. |
| 400 | Unknown image, or an SSH key id that is not on this account. |
| 401 | Missing or invalid API key. |
| 404 | No such resource in this account. |
| 409 | The server is busy or not in a state that allows this. |
Actions
GET/api/v1/actions/{id}
Get an action
Poll this to follow a reboot or re-image to completion.
Path parameters
| id* | uuid | Action id. |
Example request
curl https://braesystems.com/api/v1/actions/$ACTION_ID \
-H "Authorization: Bearer bs_live_..."Example response
{
"data": {
"id": "9f1c7d2e-4a3b-4c5d-8e6f-0a1b2c3d4e5f",
"server_id": "9f1c7d2e-4a3b-4c5d-8e6f-0a1b2c3d4e5f",
"kind": "reboot",
"status": "queued",
"error": null,
"simulated": false,
"created_at": "2026-07-29T14:03:11.000Z",
"completed_at": null
}
}Responses
| 200 | The action. |
| 401 | Missing or invalid API key. |
| 404 | No such resource in this account. |
Projects
GET/api/v1/projects
List projects
Every project on the account, not only the one this key is scoped to — listing them is what makes the scoping discoverable.
Example request
curl https://braesystems.com/api/v1/projects \
-H "Authorization: Bearer bs_live_..."Example response
{
"data": [
{
"id": "9f1c7d2e-4a3b-4c5d-8e6f-0a1b2c3d4e5f",
"name": "Staging EU",
"slug": "staging-eu",
"kind": "production",
"created_at": "2026-07-29T14:03:11.000Z"
}
]
}Responses
| 200 | The projects on your account. |
| 401 | Missing or invalid API key. |
POST/api/v1/projects
Create a project
The new project gets its own API key. A development project is also seeded with a server and an SSH key, so its endpoints return something useful immediately.
Request body
| name* | string | |
| kind | "production" | "development" | Defaults to production. A development project can never reach hardware. |
Example request
curl -X POST https://braesystems.com/api/v1/projects \
-H "Authorization: Bearer bs_live_..." \
-H "Content-Type: application/json" \
-d '{"name":"Staging EU"}'Example response
{
"data": {
"id": "9f1c7d2e-4a3b-4c5d-8e6f-0a1b2c3d4e5f",
"name": "Staging EU",
"slug": "staging-eu",
"kind": "production",
"created_at": "2026-07-29T14:03:11.000Z"
}
}Responses
| 201 | The project was created. |
| 400 | The name or kind was not acceptable. |
| 401 | Missing or invalid API key. |
| 409 | A project with that name already exists. |
SSH keys
GET/api/v1/ssh-keys
List SSH keys
Example request
curl https://braesystems.com/api/v1/ssh-keys \
-H "Authorization: Bearer bs_live_..."Example response
{
"data": [
{
"id": "9f1c7d2e-4a3b-4c5d-8e6f-0a1b2c3d4e5f",
"name": "work-laptop",
"public_key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDjG7RPA1EpqDMvKeai1v1ibjWe2ZBKQRqIEB3PvLJgq you@example.com",
"fingerprint": "SHA256:qqLkC/YxINXheBw7fxT6z9s92H80dJJkSIuDy3d/GJs",
"created_at": "2026-07-29T14:03:11.000Z"
}
]
}Responses
| 200 | The keys on your account. |
| 401 | Missing or invalid API key. |
POST/api/v1/ssh-keys
Add an SSH key
Adds a key to the account. Existing servers are unaffected — keys are installed during a re-image.
Request body
| name* | string | |
| public_key* | string | An OpenSSH public key, e.g. the contents of ~/.ssh/id_ed25519.pub |
Example request
curl -X POST https://braesystems.com/api/v1/ssh-keys \
-H "Authorization: Bearer bs_live_..." \
-H "Content-Type: application/json" \
-d '{"name":"work-laptop","public_key":"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDjG7RPA1EpqDMvKeai1v1ibjWe2ZBKQRqIEB3PvLJgq you@example.com"}'Example response
{
"data": {
"id": "9f1c7d2e-4a3b-4c5d-8e6f-0a1b2c3d4e5f",
"name": "work-laptop",
"public_key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDjG7RPA1EpqDMvKeai1v1ibjWe2ZBKQRqIEB3PvLJgq you@example.com",
"fingerprint": "SHA256:qqLkC/YxINXheBw7fxT6z9s92H80dJJkSIuDy3d/GJs",
"created_at": "2026-07-29T14:03:11.000Z"
}
}Responses
| 201 | The key was added. |
| 400 | The public key could not be parsed. |
| 401 | Missing or invalid API key. |
| 409 | A key with this fingerprint is already on the account. |
DELETE/api/v1/ssh-keys/{id}
Delete an SSH key
Removes the key from the account. Servers already carrying it keep it until they are re-imaged.
Path parameters
| id* | uuid | SSH key id. |
Example request
curl -X DELETE https://braesystems.com/api/v1/ssh-keys/$SSH_KEY_ID \
-H "Authorization: Bearer bs_live_..."Responses
| 204 | The key was deleted. |
| 401 | Missing or invalid API key. |
| 404 | No such resource in this account. |
Images
GET/api/v1/images
List operating system images
Images that can be passed as `image` to the re-image endpoint.
Example request
curl https://braesystems.com/api/v1/images \
-H "Authorization: Bearer bs_live_..."Example response
{
"data": [
{
"slug": "ubuntu-24-04",
"name": "Ubuntu 24.04 LTS"
}
]
}Responses
| 200 | Available images. |
| 401 | Missing or invalid API key. |