API reference
Generated from the machine-readable specification at /api/v1/openapi.json (OpenAPI 3.0), which you can import into Postman, Insomnia or any client generator. Base URL: https://vbhpatch.idolbe-ai.com. Read REST API v1 first for credentials and examples.
Read your inventory, missing updates, vulnerabilities and execution history, and run automations from your own tools.
Authenticate with OAuth 2.0 client credentials: create API credentials under Users & API Credentials, exchange them for a bearer token at POST /api/oauth/token (valid 1 hour), then send Authorization: Bearer <token> on every call.
The credentials inherit the permissions of their role; the role must include API Access. Lists are paginated with limit/offset (max 500 rows). Write calls are recorded in the Audit Trail as api:<credential name>.
Wrong secrets are rate-limited per client id and per source IP (HTTP 429 with a Retry-After header).
Permissions
Every call needs credentials whose role includes api.access plus the permission listed on the operation. Roles are managed under Users & API Credentials → Roles.
| Permission | Grants |
|---|---|
endpoints.view | Read endpoints, groups and installed software |
endpoints.manage | Rename, annotate or remove endpoints |
updates.view | Read missing updates |
vulnerabilities.view | Read vulnerabilities |
automations.view | Read automations and execution history |
automations.run | Run automations |
updates.manage | Approve, decline or reset updates |
reports.view | Read reports and alert rules |
reports.manage | Create reports and alert rules |
Operations
POST/api/oauth/token
Exchange API credentials for a bearer token
OAuth 2.0 client-credentials grant. Send the credentials as a form body, as JSON, or with HTTP Basic authentication (client_id:client_secret). Tokens expire after one hour; request a new one when a call answers 401.
Request body (JSON): TokenRequest
| Status | Response | Body |
|---|---|---|
200 | OK | TokenResponse |
400 | Unsupported grant type or missing fields | Error |
401 | Unknown client id, wrong secret or disabled credentials | Error |
429 | Too many failed attempts (see the Retry-After header) | Error |
GET/api/v1/endpoints
List endpoints
Required permission: endpoints.view (plus api.access).
| Parameter | In | Type | Description |
|---|---|---|---|
limit | query | integer | Rows per page, 1–500 (default 100) |
offset | query | integer | Rows to skip (default 0) |
q | query | string | Filter by hostname or display name (case-insensitive substring) |
GET/api/v1/endpoints/{id}
Get one endpoint with software, disks and missing updates
Required permission: endpoints.view (plus api.access).
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Endpoint id |
| Status | Response | Body |
|---|---|---|
200 | OK | EndpointDetail |
401 | Missing, invalid or expired token | Error |
403 | The role of the credentials lacks the required permission | Error |
404 | No such record in this organization | Error |
PATCH/api/v1/endpoints/{id}
Rename or annotate an endpoint
Required permission: endpoints.manage (plus api.access).
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Endpoint id |
Request body (JSON): EndpointPatch
DELETE/api/v1/endpoints/{id}
Remove an endpoint from the organization
Removes the record and tells the agent to uninstall itself at its next check-in (agents 0.11.4 and later). Reinstalling the agent enrolls the computer again.
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Endpoint id |
GET/api/v1/updates
List missing updates (one row per endpoint × update)
Required permission: updates.view (plus api.access).
| Parameter | In | Type | Description |
|---|---|---|---|
limit | query | integer | Rows per page, 1–500 (default 100) |
offset | query | integer | Rows to skip (default 0) |
endpointId | query | string | Only this endpoint |
severity | query | string | Critical, Important, Moderate, Low or Unspecified (applied after paging) |
source | query | string | OS or THIRD_PARTY |
GET/api/v1/software
List installed software (one row per endpoint × application)
Required permission: endpoints.view (plus api.access).
| Parameter | In | Type | Description |
|---|---|---|---|
limit | query | integer | Rows per page, 1–500 (default 100) |
offset | query | integer | Rows to skip (default 0) |
q | query | string | Filter by application name |
endpointId | query | string | Only this endpoint |
GET/api/v1/vulnerabilities
List vulnerabilities present on the fleet
Required permission: vulnerabilities.view (plus api.access).
| Parameter | In | Type | Description |
|---|---|---|---|
limit | query | integer | Rows per page, 1–500 (default 100) |
offset | query | integer | Rows to skip (default 0) |
minCvss | query | number | Minimum CVSS score |
kev | query | string | 1 = only CISA Known Exploited Vulnerabilities |
GET/api/v1/groups
List endpoint groups
Required permission: endpoints.view (plus api.access).
POST/api/v1/groups
Create an endpoint group
Static (machineIds) or dynamic (rules) group; uptime alerts optional.
Request body (JSON): GroupBody
PATCH/api/v1/groups/{id}
Update an endpoint group
Any subset of the create body. Built-in groups cannot be renamed or given criteria.
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Group id |
Request body (JSON): GroupBody
DELETE/api/v1/groups/{id}
Delete an endpoint group
Required permission: endpoints.manage (plus api.access).
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Group id |
GET/api/v1/automations
List automations
Required permission: automations.view (plus api.access).
POST/api/v1/automations
Create an automation
Same body as the console wizard. scheduleKind NOW runs the action immediately and returns the run id.
Request body (JSON): AutomationBody
GET/api/v1/automations/{id}
Get one automation with its payload
Required permission: automations.view (plus api.access).
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Automation id |
| Status | Response | Body |
|---|---|---|
200 | OK | Automation |
401 | Missing, invalid or expired token | Error |
403 | The role of the credentials lacks the required permission | Error |
404 | No such record in this organization | Error |
PATCH/api/v1/automations/{id}
Enable, pause, rename or fully edit an automation
Send { enabled, name, description } for a light change, or a full AutomationBody (with actionType) to replace every field.
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Automation id |
Request body (JSON): AutomationPatch or AutomationBody
DELETE/api/v1/automations/{id}
Delete an automation
Required permission: automations.manage (plus api.access).
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Automation id |
POST/api/v1/actions
Run an action now on endpoints
Queues RUN_SCRIPT, DEPLOY_UPDATES, REBOOT, DEPLOY_SOFTWARE or UNINSTALL_SOFTWARE on the listed endpoints (ids outside the organization are ignored). Appears in History as one run. A DEPLOY_UPDATES that installs nothing on any endpoint (no matching update, or no package source for it) is refused with 422; an endpoint with nothing to install in a run that installs elsewhere gets a CANCELLED command whose result starts with "Nothing to install".
Request body (JSON): ActionBody
POST/api/v1/updates/approvals
Approve, decline or reset updates
keys are the stable Update.key values from GET /api/v1/updates. A decision covers exactly one version: APPROVED and DECLINED refuse a third-party key without @<version> (422). A per-architecture or raw-spelling key (winget:Microsoft.VCRedist.2015+.x64@…, winget:Zoom.Zoom.EXE@7.1.8 (46825)) is stored under the key GET returns for it. NEW clears the decision stored under each key.
Request body (JSON): ApprovalBody
GET/api/v1/alerts
List alert rules
Required permission: reports.view (plus api.access).
POST/api/v1/alerts
Create an alert rule
Email recipients and/or an HTTPS webhook (JSON POST per event, X-Idolbe-Signature when a secret is set; Slack and Teams incoming webhooks accept the payload).
Request body (JSON): AlertRuleBody
POST/api/v1/automations/{id}/run
Run an automation now
Queues the automation's action on its current targets and returns the run id (follow it with /api/v1/runs?runId=).
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Automation id |
GET/api/v1/runs
Execution history
Without runId: the most recent runs (automations and ad-hoc actions). With runId: the per-endpoint results of that run.
| Parameter | In | Type | Description |
|---|---|---|---|
runId | query | string | Return the per-endpoint commands of this run instead of the run list |
automationId | query | string | Only runs of this automation |
endpointId | query | string | Only runs that touched this endpoint |
limit | query | integer | Max runs, 1–500 (default 100) |
GET/api/v1/reports/{key}
Read a built-in report (JSON or CSV)
Use key _list for the catalog of reports.
| Parameter | In | Type | Description |
|---|---|---|---|
key * | path | _list | endpoints | installed-software | web-browsers | instant-messengers | cloud-storage-apps | software-by-endpoint | hardware-inventory | disk-drives | disks-summary | network-adapters | monitors | physical-memory | firmware | processors | motherboards | sound-devices | scsi-controllers | windows-drivers | printers | update-summary | weekly-update-summary | missing-updates | missing-critical-updates | missing-third-party | installed-updates | reboots | update-status | windows-update-settings | win11-compatibility | windows-update-history | update-statistic | antivirus-status | bitlocker-status | local-user-accounts | local-groups | group-membership | profiles-by-computer | local-administrators | shared-folders | logged-on-users | offline-endpoints | low-disk-space | computer-ad-domains | environment-variables | to-internet-domains | bitlocker-key | logical-disks | disk-volumes | os-information | os-install-dates | computer-time-zones | running-processes | routing-tables | to-tcp-ip-addresses | services | startup-items | applied-gpo | boot-configuration | agent-configuration | vulnerabilities | vulnerable-software | compensating-controls | moveit-vulnerability | webp-vulnerability | cisa-kev | vulnerabilities-by-endpoint | compliance | windows-hot-fixes | cyber-essentials-email | cyber-essentials-office | cyber-essentials-web-browsers | ms-outlook-versions | hw-manufacturers | logon-statistics | profiles-by-user | sd-card-usage | usb-disk-usage | open-hidden-shares | local-time | windows-event-logs | process-memory-stats | disk-partitions | disks-without-bitlocker | ntfs-disk-quotas | all-critical-vulnerabilities | vulnerability-summary | cve-2025-5480-status | Report key (see _list) |
format | query | csv | csv for a text/csv download instead of JSON |
GET/api/v1/openapi.json
This document
| Status | Response | Body |
|---|---|---|
200 | OK | object |
Schemas
Fields marked * are always present. Timestamps are ISO 8601 in UTC; nullable fields are null when unknown.
Error
| Field | Type | Description |
|---|---|---|
error * | string | Machine-readable code, e.g. invalid_token, insufficient_scope, not_found, invalid_json |
error_description | string, nullable |
TokenRequest
| Field | Type | Description |
|---|---|---|
grant_type * | client_credentials | |
client_id * | string | |
client_secret * | string |
TokenResponse
| Field | Type | Description |
|---|---|---|
access_token * | string | |
token_type * | Bearer | |
expires_in * | integer | Seconds until expiry |
Endpoint
| Field | Type | Description |
|---|---|---|
id | string | |
name | string | Display name, or hostname when none is set |
hostname | string | |
platform | string | windows, linux or macos |
status | connected | disconnected | |
os | string, nullable | |
osVersion | string, nullable | |
osBuild | string, nullable | |
type | server | workstation | |
domain | string, nullable | |
adOu | string, nullable | |
user | string, nullable | Last logged-on user |
manufacturer | string, nullable | |
model | string, nullable | |
serialNumber | string, nullable | |
cpu | string, nullable | |
cores | integer, nullable | |
ramGB | number, nullable | |
ipAddresses | array of string | |
macAddresses | array of string | |
antivirus | string, nullable | |
pendingReboot | boolean | |
agentVersion | string, nullable | |
attributes | object | Custom attributes attr1…attr30 |
lastBootAt | string (date-time), nullable | |
lastSeenAt | string (date-time), nullable | |
enrolledAt | string (date-time), nullable | |
comment | string, nullable |
EndpointDetail
Everything in Endpoint, plus:
| Field | Type | Description |
|---|---|---|
disks | array of object | |
software | array of object | |
missingUpdates | array of object |
EndpointPatch
| Field | Type | Description |
|---|---|---|
name | string | Display name (empty string clears it) |
comment | string | |
attributes | object | Only keys attr1…attr30 are accepted |
Update
| Field | Type | Description |
|---|---|---|
id | string | |
key | string | Stable key shared by the same update on every endpoint (approval scope) |
endpointId | string | |
endpoint | string | |
title | string | |
kb | string, nullable | |
severity | Critical | Important | Moderate | Low | Unspecified | |
source | string | OS - Mandatory, OS - Optional or Applications |
categories | array of string | |
wingetId | string, nullable | |
installedVersion | string, nullable | |
latestVersion | string, nullable | |
rebootRequired | boolean | |
releaseDate | string (date-time), nullable | |
detectedAt | string (date-time), nullable | |
approval | NEW | APPROVED | DECLINED |
SoftwareRow
| Field | Type | Description |
|---|---|---|
endpointId | string | |
endpoint | string | |
name | string | |
version | string, nullable | |
publisher | string, nullable | |
installDate | string, nullable | |
installedFor | string, nullable | |
installType | string, nullable |
Vulnerability
| Field | Type | Description |
|---|---|---|
cveId | string | |
cvssScore | number, nullable | |
severity | string, nullable | |
cisaKev | boolean | |
ransomware | boolean | |
publishedAt | string (date-time), nullable | |
remediationStatus | string, nullable | Overdue, Due soon or Due later, at the time of the request |
remediationDeadline | string (date-time), nullable | |
nvdUrl | string, nullable | |
description | string, nullable | |
software | array of string | Affected products found on the fleet |
endpoints | array of object |
Group
| Field | Type | Description |
|---|---|---|
id | string | |
name | string | |
system | boolean | Built-in group (All Endpoints, New Endpoints, …) |
kind | string | STATIC or DYNAMIC |
members | integer |
Automation
| Field | Type | Description |
|---|---|---|
id | string | |
name | string | |
action | string | RUN_SCRIPT, DEPLOY_UPDATES, REBOOT, DEPLOY_SOFTWARE or UNINSTALL_SOFTWARE |
actionLabel | string | |
kind | string | SIMPLE or RING |
scheduleKind | string, nullable | |
freq | string, nullable | DAILY, WEEKLY, MONTHLY or PATCH_TUESDAY |
atTime | string, nullable | |
weekday | integer, nullable | |
monthDay | integer, nullable | |
offsetDays | integer | Days after Patch Tuesday when freq is PATCH_TUESDAY |
windowMinutes | integer, nullable | Maintenance window: minutes after the slot during which the run may still start; null = no limit |
runAt | string (date-time), nullable | |
enabled | boolean | |
targetMode | string | GROUP or ENDPOINTS |
groupId | string, nullable | |
endpointIds | array of string | |
lastRunAt | string (date-time), nullable | |
nextRunAt | string (date-time), nullable | |
createdBy | string, nullable |
Run
| Field | Type | Description |
|---|---|---|
id | string | |
name | string | |
actionType | string | |
status | string | RUNNING, COMPLETED, FAILED or STOPPED |
startedAt | string (date-time), nullable | |
finishedAt | string (date-time), nullable | |
total | integer | |
succeeded | integer | |
failed | integer | |
createdBy | string, nullable | |
automationId | string, nullable | |
automationName | string, nullable | |
detail | string, nullable |
RunCommand
| Field | Type | Description |
|---|---|---|
id | string | |
machineId | string | |
endpoint | string | |
status | string | PENDING, RUNNING, SUCCESS, FAILED or CANCELLED |
startedAt | string (date-time), nullable | |
finishedAt | string (date-time), nullable | |
result | string, nullable | Execution log |
createdAt | string (date-time), nullable |
GroupRule
| Field | Type | Description |
|---|---|---|
field * | string | hostname, os, osVersion, platform, domain, type, arch, antivirus, reboot, agentVersion, attr1…attr30, … |
op * | contains | notContains | equals | notEquals | startsWith | endsWith | isTrue | isFalse | |
value | string |
GroupBody
| Field | Type | Description |
|---|---|---|
name * | string | |
description | string | |
matchAll | boolean | true = every include rule must match |
rules | array of GroupRule | Dynamic include criteria |
excludeRules | array of GroupRule | |
machineIds | array of string | Manual members (static group) |
offlineAlertMinutes | integer, nullable | Uptime alert after N minutes offline |
onlineAlert | boolean | Alert when a member comes back online |
AutomationBody
| Field | Type | Description |
|---|---|---|
name * | string | |
description | string | |
kind | SCHEDULED | RING | SCHEDULED or RING |
actionType * | RUN_SCRIPT | DEPLOY_UPDATES | REBOOT | DEPLOY_SOFTWARE | UNINSTALL_SOFTWARE | |
payload | object | Action payload as built by the console wizard. DEPLOY_UPDATES filters use the Update Approval labels (an application version is a Regular or Security Update) when the payload carries "filterVersion": 2. Without it the earlier labels apply: applications are picked only by the type "Application Updates", so types ["Regular Updates"] means Windows updates only, and severities read every application version as Unspecified, so severities ["Critical"] means Windows updates only |
targetMode | all | group | endpoints | |
groupId | string | |
endpointIds | array of string | |
scheduleKind | NOW | ONCE | RECURRING | |
runAt | string | ISO date-time for ONCE |
freq | DAILY | WEEKLY | MONTHLY | PATCH_TUESDAY | |
atTime | string | HH:MM |
weekday | integer | 0 = Sunday |
monthDay | integer | 1–28 |
offsetDays | integer | Days after Patch Tuesday |
windowMinutes | integer, nullable | Maintenance window |
enabled | boolean | |
startDate | string | RING: first ring date |
rings | array of object | RING stages |
AutomationPatch
| Field | Type | Description |
|---|---|---|
enabled | boolean | |
name | string | |
description | string |
ActionBody
| Field | Type | Description |
|---|---|---|
endpointIds * | array of string | |
type * | RUN_SCRIPT | DEPLOY_UPDATES | REBOOT | DEPLOY_SOFTWARE | UNINSTALL_SOFTWARE | |
label | string | |
payload | object | RUN_SCRIPT: { script, language } or { scriptId, parameters: { Name: value } } (a Script Library script, its current code and reboot exit codes); DEPLOY_UPDATES: { mode: all | selected (keys) | filters ({ severities, types, sources }), approvalMode, filterVersion }; REBOOT: { message, timeoutSeconds }; DEPLOY_SOFTWARE: { wingetId } or { url, args }; UNINSTALL_SOFTWARE: { name }. DEPLOY_UPDATES filters use the Update Approval labels (an application version is a Regular or Security Update) when the payload carries "filterVersion": 2. Without it the earlier labels apply: applications are picked only by the type "Application Updates", so types ["Regular Updates"] means Windows updates only, and severities read every application version as Unspecified, so severities ["Critical"] means Windows updates only |
ApprovalBody
| Field | Type | Description |
|---|---|---|
keys * | array of object | |
status * | APPROVED | DECLINED | NEW |
AlertRule
| Field | Type | Description |
|---|---|---|
id | string | |
name | string | |
trigger | string | |
threshold | integer | |
enabled | boolean | |
emailTo | string, nullable | |
webhookUrl | string, nullable | |
hasWebhookSecret | boolean | |
reportKey | string, nullable | |
events | integer | Events raised so far |
createdAt | string (date-time), nullable |
AlertRuleBody
| Field | Type | Description |
|---|---|---|
name * | string | |
trigger * | string | GROUP_UPTIME, NEW_ENDPOINT, CRITICAL_VULN, MISSING_CRITICAL_UPDATE, ENDPOINT_OFFLINE, REBOOT_REQUIRED or REPORT_ROWS |
threshold | integer | |
emailTo | string | Comma-separated recipients |
webhookUrl | string | HTTPS URL |
webhookSecret | string | |
reportKey | string | REPORT_ROWS: report key |
ReportMeta
| Field | Type | Description |
|---|---|---|
key | string | |
title | string | |
category | string | |
description | string |
Report
| Field | Type | Description |
|---|---|---|
title | string | |
columns | array of string | |
rows | array of array of object | One array per row, in column order |
total | integer | |
collectedAt | string (date-time), nullable |
