Patching
Pending updates; patch jobs (security only, everything, chosen packages, or apps); patch policies that run on a schedule within a maintenance window; approvals for policies that need them; removing a package; OS release upgrades; and Windows Update profiles (categories, feature upgrades).
| Method | Path | Summary |
|---|---|---|
| GET | /api/updates | Pending updates across devices |
| POST | /api/approvals | Approve or reject updates waiting for approval |
| GET | /api/jobs | List patch jobs |
| GET | /api/jobs/:id | Get a patch job with per-device results |
| POST | /api/jobs | Start a patch job |
| POST | /api/patch/bulk | Patch everything that needs it |
| POST | /api/jobs/:id/cancel | Cancel a patch job |
| GET | /api/policies | List patch policies |
| POST | /api/policies | Create a patch policy |
| PUT | /api/policies/:id | Update a patch policy |
| DELETE | /api/policies/:id | Delete a patch policy |
| POST | /api/policies/:id/run | Run a patch policy now |
| POST | /api/removals | Plan removing a package |
| GET | /api/removals | List package removals |
| POST | /api/removals/:id/confirm | Confirm a package removal |
| POST | /api/removals/:id/cancel | Cancel a package removal |
| POST | /api/os-upgrades | Plan an OS release upgrade |
| GET | /api/os-upgrades | List OS upgrades |
| POST | /api/os-upgrades/:id/confirm | Confirm an OS upgrade |
| GET | /api/os-upgrades/:id/output | What the device printed, plus its release upgrade logs once fetched |
| POST | /api/os-upgrades/:id/logs | Fetch an upgrade's logs from the device |
| POST | /api/os-upgrades/:id/cancel | Cancel an OS upgrade |
| GET | /api/wu | Windows Update profiles |
| POST | /api/wu/profiles | Create a Windows Update profile |
| PUT | /api/wu/profiles/:id | Update a Windows Update profile |
| DELETE | /api/wu/profiles/:id | Delete a Windows Update profile |
#Pending updates across devices
GET
/api/updates- Address
https://<your-org>.brambleit.cloud/warden/api/updates- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Response 200
| Field | Type | Description |
|---|---|---|
updates | array of object | |
updates[].package | string | |
updates[].title | string, or null | |
updates[].candidate_version | string, or null | |
updates[].devices | integer | |
updates[].is_security | boolean | |
updates[].fixes_findings | number | |
updates[].severity | string, or null | |
updates[].origins | string | |
updates[].kind | string | |
updates[].category | string, or null | |
updates[].approval | any | |
approvals | array of any |
Example response
JSON
{
"updates": [
{
"package": "string",
"title": "Example title",
"candidate_version": "string",
"devices": 1,
"is_security": true,
"fixes_findings": 12.5,
"severity": "string",
"origins": "string",
"kind": "string",
"category": "string",
"approval": null
}
],
"approvals": []
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/updates', {
method: 'GET',
credentials: 'include',
});
const data = await res.json();#Approve or reject updates waiting for approval
POST
/api/approvals- Address
https://<your-org>.brambleit.cloud/warden/api/approvals- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Request body JSON
| Name | Type | Description |
|---|---|---|
items | array of any |
Response 200
| Field | Type | Description |
|---|---|---|
updated | integer |
Example response
JSON
{
"updated": 1
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/approvals', {
method: 'POST',
credentials: 'include',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"items":[]}),
});
const data = await res.json();#List patch jobs
GET
/api/jobs- Address
https://<your-org>.brambleit.cloud/warden/api/jobs- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Response 200
| Field | Type | Description |
|---|---|---|
jobs | array of any |
Example response
JSON
{
"jobs": []
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/jobs', {
method: 'GET',
credentials: 'include',
});
const data = await res.json();#Get a patch job with per-device results
GET
/api/jobs/:id- Address
https://<your-org>.brambleit.cloud/warden/api/jobs/:id- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
job | any | |
devices | array of object | |
devices[].name | integer | |
devices[].online | boolean | |
devices[].packages | array of any | |
devices[].result | any | |
devices[].result_json | any |
Example response
JSON
{
"job": null,
"devices": [
{
"…r": "…",
"name": 1,
"online": false,
"packages": [],
"result": null,
"result_json": null
}
]
}Errors
| Status | Message |
|---|---|
| 404 | Job not found |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/jobs/42', {
method: 'GET',
credentials: 'include',
});
const data = await res.json();#Start a patch job
POST
/api/jobs- Address
https://<your-org>.brambleit.cloud/warden/api/jobs- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Request body JSON
| Name | Type | Description |
|---|---|---|
update_class | string: "security" | "all" | "selected" | "apps" | security (security updates only), all, selected (just packages) or apps. |
reboot_policy | string: "never" | "if_required" | "always" | never, if_required or always. |
device_ids | array of any | Devices to patch. |
packages | array of any | Package names, with update_class: selected. |
name | string | A name for the job. |
include_apps | boolean | Also update applications. |
Response 201
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/jobs', {
method: 'POST',
credentials: 'include',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"update_class":"security","reboot_policy":"never","device_ids":[],"packages":[],"name":"Example name","include_apps":false}),
});
const data = await res.json();#Patch everything that needs it
POST
/api/patch/bulkFixes chosen vulnerable packages and updates on every in-scope device that needs them. dry_run shows what would happen.
- Address
https://<your-org>.brambleit.cloud/warden/api/patch/bulk- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Request body JSON
| Name | Type | Description |
|---|---|---|
vuln_packages | array of any | |
update_packages | array of any | |
dry_run | any | |
reboot_policy | string: "never" | "if_required" | "always" |
Response 200
| Field | Type | Description |
|---|---|---|
devices | array of object | |
devices[].device_id | integer | |
devices[].name | integer | |
devices[].online | boolean | |
devices[].packages | array of any | |
packages | array of any |
Example response
JSON
{
"devices": [
{
"device_id": 7,
"name": 1,
"online": false,
"packages": []
}
],
"packages": []
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/patch/bulk', {
method: 'POST',
credentials: 'include',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"vuln_packages":[],"update_packages":[],"dry_run":"…","reboot_policy":"never"}),
});
const data = await res.json();#Cancel a patch job
POST
/api/jobs/:id/cancel- Address
https://<your-org>.brambleit.cloud/warden/api/jobs/:id/cancel- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
message | string |
Example response
JSON
{
"message": "Saved"
}Errors
| Status | Message |
|---|---|
| 409 | Job is not running |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/jobs/42/cancel', {
method: 'POST',
credentials: 'include',
});
const data = await res.json();#List patch policies
GET
/api/policies- Address
https://<your-org>.brambleit.cloud/warden/api/policies- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Response 200
| Field | Type | Description |
|---|---|---|
policies | array of object | |
policies[].scope_ids | array of any | |
policies[].open_now | boolean |
Example response
JSON
{
"policies": [
{
"…p": "…",
"scope_ids": [],
"open_now": false
}
]
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/policies', {
method: 'GET',
credentials: 'include',
});
const data = await res.json();#Create a patch policy
POST
/api/policies- Address
https://<your-org>.brambleit.cloud/warden/api/policies- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Request body JSON
| Name | Type | Description |
|---|---|---|
schedule_days | array of any | Days of the week to run. |
window_start | any | When the maintenance window opens, HH:MM. |
timezone | any | The window's time zone, e.g. Europe/London. |
name | string | The policy's name. |
enabled | boolean | Whether it runs. |
scope_type | string: "all" | "site" | "group" | "device" | all, site, group or device. |
scope_ids | array of any | The sites, groups or devices (unless all). |
update_class | string: "all" | "apps" | all (OS updates) or apps. |
include_apps | array of any | Also update applications. |
windows_categories | array of any | Windows Update categories to include. |
approval_mode | string | Whether updates need approving first. |
window_minutes | integer | How long the window lasts. |
reboot_policy | string: "never" | "if_required" | "always" | never, if_required or always. |
exclude_packages | array of any | Packages never to update. |
pre_script_id | number | An RMM script to run before patching. |
post_script_id | number | An RMM script to run after patching. |
Response 201
| Field | Type | Description |
|---|---|---|
id | integer |
Example response
JSON
{
"id": 42
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/policies', {
method: 'POST',
credentials: 'include',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"schedule_days":[],"window_start":"…","timezone":"…","name":"Example name","enabled":true,"scope_type":"all","scope_ids":[],"update_class":"all","include_apps":[],"windows_categories":[],"approval_mode":"string","window_minutes":1,"reboot_policy":"never","exclude_packages":[],"pre_script_id":12.5,"post_script_id":12.5}),
});
const data = await res.json();#Update a patch policy
PUT
/api/policies/:id- Address
https://<your-org>.brambleit.cloud/warden/api/policies/:id- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Request body JSON
| Name | Type | Description |
|---|---|---|
schedule_days | array of any | |
window_start | any | |
timezone | any | |
name | string | |
enabled | boolean | |
scope_type | string: "all" | "site" | "group" | "device" | |
scope_ids | array of any | |
update_class | string: "all" | "apps" | |
include_apps | array of any | |
windows_categories | array of any | |
approval_mode | string | |
window_minutes | integer | |
reboot_policy | string: "never" | "if_required" | "always" | |
exclude_packages | array of any | |
pre_script_id | number | |
post_script_id | number |
Response 200
| Field | Type | Description |
|---|---|---|
ok | boolean |
Example response
JSON
{
"ok": true
}Errors
| Status | Message |
|---|---|
| 404 | Policy not found |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/policies/42', {
method: 'PUT',
credentials: 'include',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"schedule_days":[],"window_start":"…","timezone":"…","name":"Example name","enabled":true,"scope_type":"all","scope_ids":[],"update_class":"all","include_apps":[],"windows_categories":[],"approval_mode":"string","window_minutes":1,"reboot_policy":"never","exclude_packages":[],"pre_script_id":12.5,"post_script_id":12.5}),
});
const data = await res.json();#Delete a patch policy
DELETE
/api/policies/:id- Address
https://<your-org>.brambleit.cloud/warden/api/policies/:id- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
ok | boolean |
Example response
JSON
{
"ok": true
}Errors
| Status | Message |
|---|---|
| 404 | Policy not found |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/policies/42', {
method: 'DELETE',
credentials: 'include',
});
const data = await res.json();#Run a patch policy now
POST
/api/policies/:id/run- Address
https://<your-org>.brambleit.cloud/warden/api/policies/:id/run- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Response 201
Errors
| Status | Message |
|---|---|
| 404 | Policy not found |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/policies/42/run', {
method: 'POST',
credentials: 'include',
});
const data = await res.json();#Plan removing a package
POST
/api/removalsWorks out what removing a package would also remove, for you to confirm.
- Address
https://<your-org>.brambleit.cloud/warden/api/removals- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Request body JSON
| Name | Type | Description |
|---|---|---|
package | any | The package. |
device_ids | array of any | The devices. |
device_id | integer |
Response 201
| Field | Type | Description |
|---|---|---|
results | array of any |
Example response
JSON
{
"results": []
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/removals', {
method: 'POST',
credentials: 'include',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"package":"…","device_ids":[],"device_id":7}),
});
const data = await res.json();#List package removals
GET
/api/removals- Address
https://<your-org>.brambleit.cloud/warden/api/removals- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Query parameters
| Name | Type | Description |
|---|---|---|
ids | string | |
device_id | string | |
package | string |
Response 200
| Field | Type | Description |
|---|---|---|
removals | array of any |
Example response
JSON
{
"removals": []
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/removals', {
method: 'GET',
credentials: 'include',
});
const data = await res.json();#Confirm a package removal
POST
/api/removals/:id/confirm- Address
https://<your-org>.brambleit.cloud/warden/api/removals/:id/confirm- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | number |
Request body JSON
| Name | Type | Description |
|---|---|---|
accept_extra | any | Also remove the other packages that depend on it. |
Response 200
| Field | Type | Description |
|---|---|---|
message | string |
Example response
JSON
{
"message": "Saved"
}Errors
| Status | Message |
|---|---|
| 404 | Removal not found |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/removals/12.5/confirm', {
method: 'POST',
credentials: 'include',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"accept_extra":"…"}),
});
const data = await res.json();#Cancel a package removal
POST
/api/removals/:id/cancel- Address
https://<your-org>.brambleit.cloud/warden/api/removals/:id/cancel- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | number |
Response 200
| Field | Type | Description |
|---|---|---|
message | string |
Example response
JSON
{
"message": "Saved"
}Errors
| Status | Message |
|---|---|
| 409 | This removal can no longer be cancelled |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/removals/12.5/cancel', {
method: 'POST',
credentials: 'include',
});
const data = await res.json();#Plan an OS release upgrade
POST
/api/os-upgrades- Address
https://<your-org>.brambleit.cloud/warden/api/os-upgrades- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Request body JSON
| Name | Type | Description |
|---|---|---|
device_id | integer | The device. |
Response 201
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/os-upgrades', {
method: 'POST',
credentials: 'include',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"device_id":7}),
});
const data = await res.json();#List OS upgrades
GET
/api/os-upgrades- Address
https://<your-org>.brambleit.cloud/warden/api/os-upgrades- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Query parameters
| Name | Type | Description |
|---|---|---|
ids | string | |
device_id | string |
Response 200
| Field | Type | Description |
|---|---|---|
upgrades | array of any |
Example response
JSON
{
"upgrades": []
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/os-upgrades', {
method: 'GET',
credentials: 'include',
});
const data = await res.json();#Confirm an OS upgrade
POST
/api/os-upgrades/:id/confirm- Address
https://<your-org>.brambleit.cloud/warden/api/os-upgrades/:id/confirm- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | number |
Request body JSON
| Name | Type | Description |
|---|---|---|
confirm_name | string | The device's name, typed to confirm. |
reboot | any | Reboot when done. |
Response 200
| Field | Type | Description |
|---|---|---|
message | string |
Example response
JSON
{
"message": "Saved"
}Errors
| Status | Message |
|---|---|
| 404 | Upgrade not found |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/os-upgrades/12.5/confirm', {
method: 'POST',
credentials: 'include',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"confirm_name":"Example confirm name","reboot":"…"}),
});
const data = await res.json();#What the device printed, plus its release upgrade logs once fetched
GET
/api/os-upgrades/:id/output- Address
https://<your-org>.brambleit.cloud/warden/api/os-upgrades/:id/output- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
output | string | |
device_log | string | |
log_fetched_at | string (date-time) | |
log_state | string |
Example response
JSON
{
"output": "string",
"device_log": "string",
"log_fetched_at": "2026-11-12T09:30:00.000Z",
"log_state": "string"
}Errors
| Status | Message |
|---|---|
| 404 | Upgrade not found |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/os-upgrades/42/output', {
method: 'GET',
credentials: 'include',
});
const data = await res.json();#Fetch an upgrade's logs from the device
POST
/api/os-upgrades/:id/logs- Address
https://<your-org>.brambleit.cloud/warden/api/os-upgrades/:id/logs- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | number |
Response 200
Errors
| Status | Message |
|---|---|
| 404 | Upgrade not found |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/os-upgrades/12.5/logs', {
method: 'POST',
credentials: 'include',
});
const data = await res.json();#Cancel an OS upgrade
POST
/api/os-upgrades/:id/cancel- Address
https://<your-org>.brambleit.cloud/warden/api/os-upgrades/:id/cancel- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | number |
Response 200
| Field | Type | Description |
|---|---|---|
message | string |
Example response
JSON
{
"message": "Saved"
}Errors
| Status | Message |
|---|---|
| 409 | This upgrade can no longer be cancelled |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/os-upgrades/12.5/cancel', {
method: 'POST',
credentials: 'include',
});
const data = await res.json();#Windows Update profiles
GET
/api/wu- Address
https://<your-org>.brambleit.cloud/warden/api/wu- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Response 200
| Field | Type | Description |
|---|---|---|
profiles | array of any | |
devices | array of any | |
targets | array of any |
Example response
JSON
{
"profiles": [],
"devices": [],
"targets": []
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/wu', {
method: 'GET',
credentials: 'include',
});
const data = await res.json();#Create a Windows Update profile
POST
/api/wu/profiles- Address
https://<your-org>.brambleit.cloud/warden/api/wu/profiles- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Response 201
| Field | Type | Description |
|---|---|---|
id | integer |
Example response
JSON
{
"id": 42
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/wu/profiles', {
method: 'POST',
credentials: 'include',
});
const data = await res.json();#Update a Windows Update profile
PUT
/api/wu/profiles/:id- Address
https://<your-org>.brambleit.cloud/warden/api/wu/profiles/:id- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | number |
Response 200
| Field | Type | Description |
|---|---|---|
id | integer |
Example response
JSON
{
"id": 42
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/wu/profiles/12.5', {
method: 'PUT',
credentials: 'include',
});
const data = await res.json();#Delete a Windows Update profile
DELETE
/api/wu/profiles/:id- Address
https://<your-org>.brambleit.cloud/warden/api/wu/profiles/:id- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: Warden.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | number |
Response 200
| Field | Type | Description |
|---|---|---|
ok | boolean |
Example response
JSON
{
"ok": true
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/warden/api/wu/profiles/12.5', {
method: 'DELETE',
credentials: 'include',
});
const data = await res.json();Was this page helpful?
Thanks for your feedback.