Devices, sites & groups
Devices and how they're organised into sites and groups; a device's details, utilisation history and commands; running a command on a device.
| Method | Path | Summary |
|---|---|---|
| GET | /v1/app/rmm/sites | List sites (legacy) |
| GET | /v1/app/rmm/deivce/:deivceid: | Get a device (legacy, misspelt path) |
| POST | /v1/app/rmm/groups | List groups in a site (legacy) |
| POST | /v1/app/rmm/devices | List devices in a group (legacy) |
| POST | /v1/app/rmm/device/utilization | A device's utilisation (legacy) |
| POST | /v1/app/rmm/device/command | Send a command to a device (legacy) |
| GET | /v1/app/rmm/device/:id | Get a device (legacy) |
| POST | /v1/app/rmm/group/commands/list | Recent commands in a group (legacy) |
| POST | /v1/app/rmm/device/commands/list | A device's recent commands (legacy) |
| GET | /v2/app/rmm/sites | List sites and groups |
| POST | /v2/app/rmm/groups | List groups in a site |
| GET | /v2/app/rmm/groups/:siteId | Fetch groups for a specific site (tenant-scoped) |
| POST | /v2/app/rmm/devices | Body { site_id?, group_id? |
| GET | /v2/app/rmm/device/:id | Get a device |
| PUT | /v2/app/rmm/device/:id | Update editable device fields |
| DELETE | /v2/app/rmm/device/:id | Remove a device from the dashboard immediately (hidden from every list/ get below) but defer the actual hard delete: queue the uninstall script, mark the dev… |
| POST | /v2/app/rmm/device/:id/proxmox-config | Save a Proxmox VE host's API login |
| POST | /v2/app/rmm/device/:id/pbs-config | Save a Proxmox Backup Server's API login |
| GET | /v2/app/rmm/device/:id/backup-status | ComputeGuestBackupPosture / summariseProxmoxHealth live in services/proxmox-health.js (shared with the check engine) |
| GET | /v2/app/rmm/sites/:siteId/backup-coverage | Cross-references this site's Proxmox hosts against their linked PBS servers (which may live in a different site — see note above) to compute per-guest backup… |
| POST | /v2/app/rmm/device/:id/fetch-log | Queues a fetch_log command — the agent reads its own local agent.log (tail, capped at ~200KB) and returns it as the command's stdout |
| POST | /v2/app/rmm/device/:id/refresh | Queues a refresh_data command — the agent immediately re-posts heartbeat/utilization/full inventory instead of waiting for its normal 60s/30min timers |
| POST | /v2/app/rmm/device/maintenance/toggle | Toggle maintenance mode for a device |
| POST | /v2/app/rmm/device/command | Send a command to a device |
| POST | /v2/app/rmm/device/commands/list | A device's recent commands and their results |
| GET | /v2/app/rmm/device/commands/:id/output | Output of a command archived to BRM-Blob (services/rmm-history.js); the list endpoints return output_archived = 1 and no output for those |
| GET | /v2/app/rmm/device/utilization/history | Utilisation for a device over a date range (YYYY-MM-DD), including days archived to BRM-Blob |
| POST | /v2/app/rmm/group/commands/list | Command log for RMM2's site/group selection: body { site_id?, group_id?, limit } (neither = every device) |
| GET | /v2/app/rmm/enrollment/keys | List enrolment keys (for install commands) |
#List sites (legacy)
/v1/app/rmm/sites- Address
https://<your-org>.brambleit.cloud/api/v1/app/rmm/sites- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Response 200
| Field | Type | Description |
|---|---|---|
sites | array of object | |
sites[].id | integer | |
sites[].tenant_id | integer | |
sites[].client_id | integer, or null | |
sites[].site_name | string | |
sites[].managed_tenant_id | integer, or null |
Example response
{
"sites": [
{
"id": 42,
"tenant_id": 1,
"client_id": 7,
"site_name": "Example site name",
"managed_tenant_id": 7
}
]
}Errors
| Status | Message |
|---|---|
| 404 | User not found |
| 404 | No Sites Found |
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/rmm/sites' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/rmm/sites', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/rmm/sites",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/rmm/sites' -Headers $headers#Get a device (legacy, misspelt path)
/v1/app/rmm/deivce/:deivceid:Note
Kept for old pages. Use GET /v2/app/rmm/device/:id.
- Address
https://<your-org>.brambleit.cloud/api/v1/app/rmm/deivce/:deivceid:- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Path parameters
| Name | Type | Description |
|---|---|---|
deivceidrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
sites | array of object | |
sites[].id | integer | |
sites[].tenant_id | integer | |
sites[].client_id | integer, or null | |
sites[].site_name | string | |
sites[].managed_tenant_id | integer, or null |
Example response
{
"sites": [
{
"id": 42,
"tenant_id": 1,
"client_id": 7,
"site_name": "Example site name",
"managed_tenant_id": 7
}
]
}Errors
| Status | Message |
|---|---|
| 404 | User not found |
| 404 | No Sites Found |
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/rmm/deivce/1:' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/rmm/deivce/1:', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/rmm/deivce/1:",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/rmm/deivce/1:' -Headers $headers#List groups in a site (legacy)
/v1/app/rmm/groups- Address
https://<your-org>.brambleit.cloud/api/v1/app/rmm/groups- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Request body JSON
| Name | Type | Description |
|---|---|---|
site_id | integer |
Response 200
| Field | Type | Description |
|---|---|---|
groups | array of object | |
groups[].id | integer | |
groups[].tenant_id | integer | |
groups[].site_id | integer | |
groups[].group_name | string | |
site | any |
Example response
{
"groups": [
{
"id": 42,
"tenant_id": 1,
"site_id": 7,
"group_name": "Example group name"
}
],
"site": null
}Errors
| Status | Message |
|---|---|
| 404 | User not found |
| 404 | No Sites Found |
| 404 | No Groups Found |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/rmm/groups' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"site_id":7}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/rmm/groups', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"site_id":7}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/rmm/groups",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"site_id":7},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"site_id":7}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/rmm/groups' -Headers $headers -ContentType 'application/json' -Body $body#List devices in a group (legacy)
/v1/app/rmm/devices- Address
https://<your-org>.brambleit.cloud/api/v1/app/rmm/devices- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Request body JSON
| Name | Type | Description |
|---|---|---|
group_id | integer | The group. |
Response 200
| Field | Type | Description |
|---|---|---|
devices | array of object | |
devices[].id | integer | |
devices[].tenant_id | integer | |
devices[].site_id | integer | |
devices[].group_id | integer, or null | |
devices[].device_id | string | |
devices[].hostname | string, or null | |
devices[].display_name | string, or null | |
devices[].os_type | string: "windows" | "linux" | "mac" | "other" | |
devices[].device_type | string: "server" | "workstation" | "laptop" | "virtual" | "other" | |
devices[].maintenance_mode | boolean | |
devices[].full_inventory | object, or null | |
devices[].api_key | string, or null | |
devices[].last_seen | string (date-time) | |
devices[].agent_version | string, or null | |
devices[].agent_callback_url | string, or null | |
devices[].agent_cert_fingerprint_sha256 | string, or null | |
devices[].agent_cert_serial | string, or null | |
devices[].agent_cert_pem | string, or null | |
devices[].agent_cert_issued_at | string (date-time), or null | |
devices[].agent_cert_expires_at | string (date-time), or null | |
devices[].is_maintenance | boolean, or null | |
devices[].is_network_probe | boolean | |
devices[].pending_removal_at | string (date-time), or null | |
devices[].pending_removal_command_id | integer, or null | |
group | any |
Example response
{
"devices": [
{
"id": 42,
"tenant_id": 1,
"site_id": 7,
"group_id": 7,
"device_id": "string",
"hostname": "office-pc-01",
"display_name": "Example display name",
"os_type": "windows",
"device_type": "server",
"maintenance_mode": false,
"full_inventory": {},
"api_key": "…",
"last_seen": "2026-11-12T09:30:00.000Z",
"agent_version": "string",
"agent_callback_url": "https://example.com/…",
"agent_cert_fingerprint_sha256": "string",
"agent_cert_serial": "string",
"agent_cert_pem": "string",
"agent_cert_issued_at": "2026-11-12T09:30:00.000Z",
"agent_cert_expires_at": "2026-11-12T09:30:00.000Z",
"is_maintenance": true,
"is_network_probe": true,
"pending_removal_at": "2026-11-12T09:30:00.000Z",
"pending_removal_command_id": 7
}
],
"group": null
}Errors
| Status | Message |
|---|---|
| 404 | User not found |
| 404 | No Devices Found |
| 404 | No Groups Found |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/rmm/devices' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"group_id":7}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/rmm/devices', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"group_id":7}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/rmm/devices",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"group_id":7},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"group_id":7}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/rmm/devices' -Headers $headers -ContentType 'application/json' -Body $body#A device's utilisation (legacy)
/v1/app/rmm/device/utilization- Address
https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/utilization- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Request body JSON
| Name | Type | Description |
|---|---|---|
device_id | integer |
Response 200
| Field | Type | Description |
|---|---|---|
utilization | array of object | |
utilization[].cpu_load | number, or null | |
utilization[].ram_usage | number, or null | |
utilization[].disk_usage | number, or null | |
utilization[].network_usage | number, or null |
Example response
{
"utilization": [
{
"cpu_load": 12.5,
"ram_usage": 12.5,
"disk_usage": 12.5,
"network_usage": 12.5
}
]
}Errors
| Status | Message |
|---|---|
| 404 | User not found |
| 404 | No Utilization data Found |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/utilization' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"device_id":7}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/utilization', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"device_id":7}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/utilization",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"device_id":7},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"device_id":7}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/utilization' -Headers $headers -ContentType 'application/json' -Body $body#Send a command to a device (legacy)
/v1/app/rmm/device/command- Address
https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/command- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Request body JSON
| Name | Type | Description |
|---|---|---|
device_idrequired | integer | |
commandrequired | any | |
data | any |
Response 201
| Field | Type | Description |
|---|---|---|
message | string |
Example response
{
"message": "Saved"
}Errors
| Status | Message |
|---|---|
| 400 | device_id, command |
| 404 | User not found |
| 404 | Device not found |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/command' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"device_id":7,"command":"…","data":"…"}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/command', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"device_id":7,"command":"…","data":"…"}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/command",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"device_id":7,"command":"…","data":"…"},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"device_id":7,"command":"…","data":"…"}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/command' -Headers $headers -ContentType 'application/json' -Body $body#Get a device (legacy)
/v1/app/rmm/device/:id- Address
https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/:id- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
device | any | |
utilization | array of object | |
utilization[].cpu_load | number, or null | |
utilization[].ram_usage | number, or null | |
utilization[].disk_usage | number, or null | |
utilization[].network_usage | number, or null |
Example response
{
"device": null,
"utilization": [
{
"cpu_load": 12.5,
"ram_usage": 12.5,
"disk_usage": 12.5,
"network_usage": 12.5
}
]
}Errors
| Status | Message |
|---|---|
| 404 | User not found |
| 404 | Device not found |
| 403 | Unauthorized: device does not belong to user's tenant |
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/42' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/42', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/42",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/42' -Headers $headers#Recent commands in a group (legacy)
/v1/app/rmm/group/commands/list- Address
https://<your-org>.brambleit.cloud/api/v1/app/rmm/group/commands/list- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Request body JSON
| Name | Type | Description |
|---|---|---|
group_id | integer |
Response 200
| Field | Type | Description |
|---|---|---|
commands | array of object | |
commands[].id | integer | |
commands[].device_id | string | |
commands[].status | string | |
commands[].command | string | |
commands[].data | any | |
commands[].result | string, or null | |
commands[].created_at | string (date-time) | |
commands[].display_name | string, or null | |
commands[].hostname | string, or null |
Example response
{
"commands": [
{
"id": 42,
"device_id": "string",
"status": "active",
"command": "string",
"data": null,
"result": "string",
"created_at": "2026-11-12T09:30:00.000Z",
"display_name": "Example display name",
"hostname": "office-pc-01"
}
]
}Errors
| Status | Message |
|---|---|
| 400 | Missing group_id in request body |
| 404 | User not found |
| 404 | No commands found for devices in this group |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/rmm/group/commands/list' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"group_id":7}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/rmm/group/commands/list', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"group_id":7}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/rmm/group/commands/list",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"group_id":7},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"group_id":7}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/rmm/group/commands/list' -Headers $headers -ContentType 'application/json' -Body $body#A device's recent commands (legacy)
/v1/app/rmm/device/commands/list- Address
https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/commands/list- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Request body JSON
| Name | Type | Description |
|---|---|---|
device_id | integer |
Response 200
| Field | Type | Description |
|---|---|---|
commands | array of object | |
commands[].device_id | string | |
commands[].status | string | |
commands[].command | string | |
commands[].data | any | |
commands[].result | string, or null | |
commands[].display_name | string, or null | |
commands[].hostname | string, or null |
Example response
{
"commands": [
{
"device_id": "string",
"status": "active",
"command": "string",
"data": null,
"result": "string",
"display_name": "Example display name",
"hostname": "office-pc-01"
}
]
}Errors
| Status | Message |
|---|---|
| 400 | Missing device_id in request body |
| 404 | User not found |
| 404 | No commands found for this device |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/commands/list' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"device_id":7}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/commands/list', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"device_id":7}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/commands/list",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"device_id":7},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"device_id":7}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/rmm/device/commands/list' -Headers $headers -ContentType 'application/json' -Body $body#List sites and groups
/v2/app/rmm/sites- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/sites- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Response 200
| Field | Type | Description |
|---|---|---|
sites | array of any |
Example response
{
"sites": []
}Errors
| Status | Message |
|---|---|
| 404 | User not found |
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/sites' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/sites', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/sites",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/sites' -Headers $headers#List groups in a site
/v2/app/rmm/groups- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/groups- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Request body JSON
| Name | Type | Description |
|---|---|---|
site_id | integer | The site. |
Response 200
| Field | Type | Description |
|---|---|---|
groups | array of any | |
site | any |
Example response
{
"groups": [],
"site": null
}Errors
| Status | Message |
|---|---|
| 404 | User not found |
| 404 | Site not found |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/groups' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"site_id":7}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/groups', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"site_id":7}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/groups",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"site_id":7},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"site_id":7}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/groups' -Headers $headers -ContentType 'application/json' -Body $body#Fetch groups for a specific site (tenant-scoped)
/v2/app/rmm/groups/:siteId- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/groups/:siteId- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Path parameters
| Name | Type | Description |
|---|---|---|
siteIdrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
groups | array of any | |
site | any |
Example response
{
"groups": [],
"site": null
}Errors
| Status | Message |
|---|---|
| 404 | User not found |
| 404 | Site not found |
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/groups/1' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/groups/1', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/groups/1",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/groups/1' -Headers $headers#Body { site_id?, group_id?
/v2/app/rmm/devicesBody { site_id?, group_id? } — RMM2's site/group selector (services/rmm-scope.js); neither = every device in the tenant.
- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/devices- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Response 200
| Field | Type | Description |
|---|---|---|
devices | array of any | |
group | any | |
scope | any |
Example response
{
"devices": [],
"group": null,
"scope": null
}Errors
| Status | Message |
|---|---|
| 404 | User not found |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/devices' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/devices', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/devices",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/devices' -Headers $headers#Get a device
/v2/app/rmm/device/:idEverything RMM knows about one device — inventory, status, utilisation, signed-in user.
- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/:id- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer | The device's device_id. |
Response 200
| Field | Type | Description |
|---|---|---|
device | any | |
utilization | any |
Example response
{
"device": null,
"utilization": null
}Errors
| Status | Message |
|---|---|
| 404 | User not found |
| 404 | Device not found |
| 403 | Unauthorized |
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42' -Headers $headers#Update editable device fields
/v2/app/rmm/device/:id- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/:id- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Request body JSON
| Name | Type | Description |
|---|---|---|
display_name | string | |
device_type | string | |
site_id | integer | |
group_id | integer |
Response 200
| Field | Type | Description |
|---|---|---|
message | string |
Example response
{
"message": "Saved"
}Errors
| Status | Message |
|---|---|
| 400 | Invalid site |
| 400 | Invalid group |
| 404 | User not found |
| 404 | Device not found |
Example request
curl -X PUT 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"display_name":"Example display name","device_type":"string","site_id":7,"group_id":7}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42', {
method: 'PUT',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"display_name":"Example display name","device_type":"string","site_id":7,"group_id":7}),
});
const data = await res.json();import os, requests
r = requests.put(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"display_name":"Example display name","device_type":"string","site_id":7,"group_id":7},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"display_name":"Example display name","device_type":"string","site_id":7,"group_id":7}'
Invoke-RestMethod -Method PUT -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42' -Headers $headers -ContentType 'application/json' -Body $body#Remove a device from the dashboard immediately (hidden from every list/ get below) but defer the actual hard delete: queue the uninstall script, mark the dev…
/v2/app/rmm/device/:idRemove a device from the dashboard immediately (hidden from every list/ get below) but defer the actual hard delete: queue the uninstall script, mark the device pending_removal, and let services/rmm-device-cleanup.js finish the job once that command completes OR PENDING_REMOVAL_TIMEOUT_MINUTES passes, whichever's first. An offline device that comes back online later still gets uninstalled instead of becoming a silent orphan the dashboard can no longer reach — the earlier immediate-hard-delete version of this endpoint couldn't do that, since deleting device_commands+devices in the same request left nothing for a later check-in to find.
- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/:id- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
message | string |
Example response
{
"message": "Saved"
}Errors
| Status | Message |
|---|---|
| 404 | User not found |
| 404 | Device not found |
Example request
curl -X DELETE 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42', {
method: 'DELETE',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.delete(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method DELETE -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42' -Headers $headers#Save a Proxmox VE host's API login
/v2/app/rmm/device/:id/proxmox-config- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/:id/proxmox-config- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/proxmox-config' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/proxmox-config', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/proxmox-config",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/proxmox-config' -Headers $headers#Save a Proxmox Backup Server's API login
/v2/app/rmm/device/:id/pbs-config- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/:id/pbs-config- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/pbs-config' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/pbs-config', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/pbs-config",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/pbs-config' -Headers $headers#ComputeGuestBackupPosture / summariseProxmoxHealth live in services/proxmox-health.js (shared with the check engine)
/v2/app/rmm/device/:id/backup-statusComputeGuestBackupPosture / summariseProxmoxHealth live in services/proxmox-health.js (shared with the check engine). GET /device/:id/backup-status — per-guest backup posture for a single Proxmox host, using its own hypervisor-links. Powers the status shield next to each guest in the device page's Hypervisor tab.
- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/:id/backup-status- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
guests | array of any |
Example response
{
"guests": []
}Errors
| Status | Message |
|---|---|
| 400 | Not a Proxmox host |
| 404 | User not found |
| 404 | Device not found |
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/backup-status' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/backup-status', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/backup-status",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/backup-status' -Headers $headers#Cross-references this site's Proxmox hosts against their linked PBS servers (which may live in a different site — see note above) to compute per-guest backup…
/v2/app/rmm/sites/:siteId/backup-coverageCross-references this site's Proxmox hosts against their linked PBS servers (which may live in a different site — see note above) to compute per-guest backup posture across the whole site.
- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/sites/:siteId/backup-coverage- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Path parameters
| Name | Type | Description |
|---|---|---|
siteIdrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
site | any | |
proxmoxHosts | array of any | |
guests | array of any | |
summary | object | |
summary.protected | integer | |
summary.attention | integer | |
summary.unprotected | integer | |
summary.unlinked | integer |
Example response
{
"site": null,
"proxmoxHosts": [],
"guests": [],
"summary": {
"protected": 1,
"attention": 1,
"unprotected": 1,
"unlinked": 1
}
}Errors
| Status | Message |
|---|---|
| 404 | User not found |
| 404 | Site not found |
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/sites/1/backup-coverage' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/sites/1/backup-coverage', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/sites/1/backup-coverage",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/sites/1/backup-coverage' -Headers $headers#Queues a fetch_log command — the agent reads its own local agent.log (tail, capped at ~200KB) and returns it as the command's stdout
/v2/app/rmm/device/:id/fetch-logQueues a fetch_log command — the agent reads its own local agent.log (tail, capped at ~200KB) and returns it as the command's stdout. Returns the new command's id so the caller can poll /device/commands/list for it (same list the Command Log feed already reads) rather than needing a dedicated result-polling endpoint.
- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/:id/fetch-log- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Response 201
| Field | Type | Description |
|---|---|---|
message | string | |
command_id | integer |
Example response
{
"message": "Saved",
"command_id": 7
}Errors
| Status | Message |
|---|---|
| 404 | User not found |
| 404 | Device not found |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/fetch-log' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/fetch-log', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/fetch-log",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/fetch-log' -Headers $headers#Queues a refresh_data command — the agent immediately re-posts heartbeat/utilization/full inventory instead of waiting for its normal 60s/30min timers
/v2/app/rmm/device/:id/refreshQueues a refresh_data command — the agent immediately re-posts heartbeat/utilization/full inventory instead of waiting for its normal 60s/30min timers. Returns the new command's id so the caller can poll /device/commands/list for the ack, same pattern as fetch-log.
- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/:id/refresh- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Response 201
| Field | Type | Description |
|---|---|---|
message | string | |
command_id | integer |
Example response
{
"message": "Saved",
"command_id": 7
}Errors
| Status | Message |
|---|---|
| 404 | User not found |
| 404 | Device not found |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/refresh' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/refresh', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/refresh",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/42/refresh' -Headers $headers#Toggle maintenance mode for a device
/v2/app/rmm/device/maintenance/toggle- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/maintenance/toggle- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Request body JSON
| Name | Type | Description |
|---|---|---|
device_idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
is_maintenance | boolean |
Example response
{
"is_maintenance": true
}Errors
| Status | Message |
|---|---|
| 400 | device_id required |
| 404 | User not found |
| 404 | Device not found |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/maintenance/toggle' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"device_id":7}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/maintenance/toggle', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"device_id":7}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/maintenance/toggle",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"device_id":7},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"device_id":7}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/maintenance/toggle' -Headers $headers -ContentType 'application/json' -Body $body#Send a command to a device
/v2/app/rmm/device/commandQueues a command for the device's agent; it's picked up on the next check-in. Read the output with POST /v2/app/rmm/device/commands/list.
- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/command- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Request body JSON
| Name | Type | Description |
|---|---|---|
device_idrequired | integer | The device. |
commandrequired | any | The command name. |
data | any | Its arguments. |
Response 201
| Field | Type | Description |
|---|---|---|
message | string |
Example response
{
"message": "Saved"
}Errors
| Status | Message |
|---|---|
| 400 | device_id and command are required |
| 404 | User not found |
| 404 | Device not found |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/command' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"device_id":7,"command":"…","data":"…"}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/command', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"device_id":7,"command":"…","data":"…"}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/command",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"device_id":7,"command":"…","data":"…"},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"device_id":7,"command":"…","data":"…"}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/command' -Headers $headers -ContentType 'application/json' -Body $body#A device's recent commands and their results
/v2/app/rmm/device/commands/list- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/commands/list- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Request body JSON
| Name | Type | Description |
|---|---|---|
device_idrequired | integer | The device. |
Response 200
| Field | Type | Description |
|---|---|---|
commands | array of any |
Example response
{
"commands": []
}Errors
| Status | Message |
|---|---|
| 400 | device_id is required |
| 404 | User not found |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/commands/list' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"device_id":7}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/commands/list', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"device_id":7}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/commands/list",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"device_id":7},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"device_id":7}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/commands/list' -Headers $headers -ContentType 'application/json' -Body $body#Output of a command archived to BRM-Blob (services/rmm-history.js); the list endpoints return output_archived = 1 and no output for those
/v2/app/rmm/device/commands/:id/output- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/commands/:id/output- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | number |
Response 200
Errors
| Status | Message |
|---|---|
| 404 | No archived output for this command |
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/commands/12.5/output' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/commands/12.5/output', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/commands/12.5/output",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/commands/12.5/output' -Headers $headers#Utilisation for a device over a date range (YYYY-MM-DD), including days archived to BRM-Blob
/v2/app/rmm/device/utilization/historyUtilisation for a device over a date range (YYYY-MM-DD), including days archived to BRM-Blob. Points are [unix time, cpu, ram, disk, net].
- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/utilization/history- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Query parameters
| Name | Type | Description |
|---|---|---|
device_idrequired | integer | |
from | any | |
to | any |
Response 200
Errors
| Status | Message |
|---|---|
| 400 | device_id, from and to (YYYY-MM-DD) are required |
| 400 | Ask for 92 days or fewer at a time |
| 404 | Device not found |
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/utilization/history?device_id=7' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/utilization/history?device_id=7', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/utilization/history?device_id=7",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/device/utilization/history?device_id=7' -Headers $headers#Command log for RMM2's site/group selection: body { site_id?, group_id?, limit } (neither = every device)
/v2/app/rmm/group/commands/listCommand log for RMM2's site/group selection: body { site_id?, group_id?, limit } (neither = every device). Kept at /group/... for existing callers.
- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/group/commands/list- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Request body JSON
| Name | Type | Description |
|---|---|---|
limit | integer |
Response 200
| Field | Type | Description |
|---|---|---|
commands | array of any |
Example response
{
"commands": []
}Errors
| Status | Message |
|---|---|
| 404 | User not found |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/group/commands/list' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"limit":1}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/group/commands/list', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"limit":1}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/group/commands/list",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"limit":1},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"limit":1}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/group/commands/list' -Headers $headers -ContentType 'application/json' -Body $body#List enrolment keys (for install commands)
/v2/app/rmm/enrollment/keys- Address
https://<your-org>.brambleit.cloud/api/v2/app/rmm/enrollment/keys- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: RMM.
Response 200
| Field | Type | Description |
|---|---|---|
keys | array of any |
Example response
{
"keys": []
}Errors
| Status | Message |
|---|---|
| 404 | User not found |
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/enrollment/keys' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v2/app/rmm/enrollment/keys', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v2/app/rmm/enrollment/keys",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v2/app/rmm/enrollment/keys' -Headers $headersWas this page helpful?
Thanks for your feedback.