API reference Resources
Machines
Enrolled machines: their state, activity and coverage.
21 operations
List machines
The workspace's fleet, filtered and paged. Archived and deleted machines are left out unless lifecycle asks for archived ones. f, q, cursor and limit work the same way as on the AI artifacts list.
Query parameters
The filter expression, e.g. all;status~in~healthy;group~nin~lab.
A malformed segment is dropped; a field this list does not have is a 400 naming it. Fields: status, os, os_version, agent_version, group, tactic, strategy, last_seen, enrolled.
Free text over hostname, OS, versions, group and machine ID. ANDs with the expression whichever way its conditions are joined.
Where the previous page stopped. Opaque; an unreadable one starts over.
Rows wanted: 50 when absent, at most 200. A larger value is answered with 200 rows rather than refused.
active | suspended | stuck | uninstalled | archived. stuck includes machines still installing. Absent lists every machine that is neither archived nor deleted; a deleted one is never listed.
Response200
Enrolled machines in this workspace
What this machine is enrolled to be capable of. Immutable.
Worked out from capture_strategies.
nonemetadatamitm_caextensionredirectWhich of them are running. Mutable, per strategy.
Most severe first; non-empty only when health is degraded. On a list row this is the beat-time snapshot; on the detail view it is recomputed when the request is read.
How many machines the filter matched in all, not just on this page.
Pass back as cursor for the next page. null means this was the last.
Errors
- 400
The filter names a field this surface does not have
- 401
No valid session
- 403
Caller lacks machines:read in this workspace
- 404
No such workspace, or the caller is not a member
Machine names
Every live machine's ID and hostname, in one response: a lookup for turning machine IDs into names. It takes no filter and is not paged, so the answer is always complete. Needs the same permission as the machines list.
Response200
Every live machine's id and hostname
How many machines are in the fleet: the length of machines, since this list is never paged.
Errors
- 401
No valid session
- 403
Caller lacks machines:read in this workspace
- 404
No such workspace, or the caller is not a member
One machine and its counts, for the machine details page
A machine in another workspace is a 404, never a 403. A 403 would confirm that the id exists, which is a cross-workspace existence oracle: machine ids are not secrets, and an attacker who can tell "not yours" from "no such thing" can enumerate another workspace's fleet through this endpoint. The artifacts and scans reads refuse the same way, and so does the PATCH on this path.
An unparseable id is a 404 too, and not a 400: it is a stale or hand-edited link, and the recovery is the same one — go back to the list.
Path parameters
Response200
The machine and its counts
Every artifact this machine has reported, in any state — gone and out_of_scope included.
How many of those artifacts carry an unresolved issue. Counts artifacts, not issues: two issues on one file count once.
The ten configuration sections and whether each is applied, in a fixed order. Empty before the machine first checks in.
applied | pending | not_applied | unknown.
Not applied only: the agent's reason.
RFC 3339. Applied: when. Pending: since. Not applied: when it failed. Unknown: null.
What this machine is enrolled to be capable of. Immutable.
Worked out from capture_strategies.
nonemetadatamitm_caextensionredirectWhich of them are running. Mutable, per strategy.
Most severe first; non-empty only when health is degraded. On a list row this is the beat-time snapshot; on the detail view it is recomputed when the request is read.
Scan runs surviving retention, not runs ever recorded: quiet runs past the last few per kind are pruned, so this is the number of rows a reader can actually open.
Facts about steering that are not problems: the surfaces' first, then a second TLS inspector.
yielded | stale_incumbent | double_tls_inspection.
The agent's sentence, when it gave one.
The surface, for yielded and stale_incumbent.
One per surface the machine reported, in root, pac, routes order. Empty when not reported.
RFC 3339, this server's clock: when the surface entered this state. An applied_unwitnessed surface keeps the instant it was applied.
applied | witnessed | flowing | applied_unwitnessed | yielded | stale_incumbent | root_removed.
root | pac | routes. root is the CA surface.
The agent's sentence, when it gave one.
What else the agent found intercepting. Empty when not reported or none.
proxy | tunnel | tls | local.
The effective hooks section: this machine's own or else its profile's, all five tools present.
What a hook does when the agent cannot answer. One setting for every tool with hooks on.
allowblockThe effective restrictions: this machine's own or else its profile's.
One row per browser the agent reported, state worked out when the request is answered. null when never reported, which is not the same as "no browsers".
chrome | edge | brave | chromium | firefox.
reportingnot_managednot_installed"" when the agent could not read it.
RFC 3339, or null if the extension has never spoken.
The extension build the agent last heard from. Null if never.
Why the policy is not in place. Null unless state is not_managed.
The network a machine last said it is on.
tls_inspected | root_missing | captive.
direct | upstream_proxy | vpn | sase_proxy | sase_tunnel.
RFC 3339, this server's clock: when it first saw this network. The agent's own since is not served.
vpn only: full | split.
vpn only: the client that owns the tunnel, as the agent named it.
upstream_proxy only: fixed | pac | wpad.
The newest crash this machine's agent reported.
RFC 3339.
Whether this run changed the inventory. A run that did is always kept; of the runs that did not, only each machine's most recent few are.
One enrollment profile's settings, as a machine's page names them.
The scan configuration a machine should be running.
Another machine, by ID, hostname and lifecycle. A deleted one can no longer be read.
Another machine, by ID, hostname and lifecycle. A deleted one can no longer be read.
One machine's own report on its capture tactic.
The surfaces that went on: root, pac, routes.
How many plans in a row have failed. 0 on a healthy machine, and the number that separates it just broke from it has never worked.
Surfaces this machine's strategy set never asked for. Not failures, and rendering them as such would make a correctly-scoped machine look broken.
applied, failed or nothing_to_do, as the agent reported it.
When the machine reported this. Read beside the rest: a status from three days ago describes a machine that has not planned since, not a machine that is fine.
The one that did not, or null. This is the field the panel exists for.
The AI tools the machine last reported, in the order its agent reported them, with each layer and its gap counts. null when the agent has not reported any, which is not the same as "no tools".
Hook calls that could not reach the agent in the last seven days, by why.
In the vocabulary's order: hooks, policy, network, tls, trust.
A registry slug.
RFC 3339: when this server stored tool_coverage.
The hooks section. tools is keyed claude_code | codex | gemini_cli | cursor | windsurf | copilot_cli | antigravity; in a response every one of the five is present, and on a request an absent tool is on.
What a hook does when the agent cannot answer. One setting for every tool with hooks on.
allowblockThe restrictions section, keyed local_mcp_servers | extensions | extension_directory. An absent key is not set.
The worst unresolved severity across them, or null when nothing is open. Ranked, never sorted alphabetically — that puts critical after high and low before medium, wrong in both directions at once.
Errors
- 401
No valid session
- 403
Caller lacks machines:read in this workspace
- 404
No such machine in this workspace
Reconfigure a machine
Path parameters
Request bodyUpdateMachineRequest
The per-machine attachment overrides, with the same three states as the scan fields: absent leaves it, null clears back to inheriting, a value sets one. Validated in-handler so the refusal names the field.
Refused if sent: the set of strategies is fixed when the machine enrolls. To switch one of them on or off, use PATCH /machines/{id}/strategies/{strategy}.
Refused if sent, even as null: a machine's capture tactic is fixed when it enrolls, and sending it is a 400 that says so.
The per-machine content-collection override, three-state like the panel fields above. Not collection_enabled: that switch decides whether this machine observes AI traffic at all, this one only whether file contents may be collected from it.
Whether the machine is currently collecting at all.
Three-state like everything else below: omitting it leaves collection as it was. It was briefly a required bool, which made every existing caller send a value for a field it had no opinion about — and a caller that has to restate the current setting to change something else will eventually restate it wrongly.
Strategy ids to switch off on this machine. null returns to the profile, [] runs everything enrolled; a strategy the machine never enrolled is 400.
The per-machine log-level override, with the same three states as the scan fields: absent leaves it alone, null clears it back to inheriting from the profile, a value sets one. An unknown level is a 400 naming the accepted levels.
Which group this machine belongs to. The enrollment profile sets the first value; it can be changed. null returns the machine to ungrouped; omitting the field leaves it alone.
The per-machine panel overrides, three-state like the attachment fields above.
The per-machine scan override; the same applies to every scan_* field. Each has three states: omitting it leaves the stored value alone, null clears the override so the field inherits from the profile again, and a value sets one.
The hooks section. tools is keyed claude_code | codex | gemini_cli | cursor | windsurf | copilot_cli | antigravity; in a response every one of the five is present, and on a request an absent tool is on.
What a hook does when the agent cannot answer. One setting for every tool with hooks on.
allowblockThe restrictions section, keyed local_mcp_servers | extensions | extension_directory. An absent key is not set.
Response200
Updated machine
What this machine is enrolled to be capable of. Immutable.
Worked out from capture_strategies.
nonemetadatamitm_caextensionredirectWhich of them are running. Mutable, per strategy.
Most severe first; non-empty only when health is degraded. On a list row this is the beat-time snapshot; on the detail view it is recomputed when the request is read.
steering_failed | root_removed | config_not_applied | crashed | worker_stopped | interception_off | pac_unwitnessed | tool_hooks_failed | ask_unavailable | clock_skew, most severe first.
config_not_applied only: every section not applied.
interception_off only: turned off under an elevation grant.
RFC 3339. crashed: when. pac_unwitnessed: since when the PAC has been applied with nothing fetching it. tool_hooks_failed: the first of the failing beats.
steering_failed only: the agent's sentence.
ask_unavailable only: how many signed-in people have no companion. Its at is since when.
Whether this machine is paused as of this response, worked out from paused_until by the server.
active | installing | stuck | suspended | uninstalled | archived | deleted. A list never carries deleted.
Live pauses, all three scopes.
enforcement | scans | capture.
RFC 3339.
AI tools the machine reported present, in the order its agent reported them. Empty when it has reported none.
The hooks layer reads applied or witnessed. False draws the mark dimmed: seen, not hooked.
A registry slug (heartbeat-tools.json → registry).
OS logins with a live presence on this machine, newest first. Personal data, readable by anyone who can read machines.
The per-machine attachment overrides; null means the machine inherits the setting from its profile.
The Machines list's 3 of 4: covered is how many are reporting.
The per-machine content-collection override; null means the machine inherits its profile's switch. Decides whether file contents may be collected from this machine.
The companion version the machine last reported. null means not reported yet, not "no companion".
The machine's own disabled-strategy block, null when it follows the profile; enabled_strategies above is the materialised result.
The health of an active machine. Only an active machine has one; installing and stuck are lifecycle values, not health. unreachable is worked out when the request is answered.
unreachablepauseddegradedhealthyRFC 3339, or null if the machine has never checked in.
The per-machine log-level override, or null when this machine inherits its enrollment profile's level.
The address the server last saw this machine's requests arrive from. null before its first beat.
Personal data and a coarse location signal: it names the network a machine connects from. Same grant as above.
The per-machine panel overrides; null means the machine inherits the setting from its profile.
When this machine's user paused enforcement until, as it last reported. null means enforcing, which almost every machine almost always is.
A value in the past is stale, not paused: the agent resumes on its own clock and clears the field when it next checks in. Read is_paused rather than comparing this to the current time yourself.
The enrollment profile a machine enrolled through, by name.
The machine's own primary egress address, as it last reported one. null means it never has: either its agent is too old to report one, or it could not determine an address.
Personal data. Readable by anyone who can read machines.
What the agent last said it is actually running at, or null when it has never said — an agent from before the field, which must render as not reported rather than as obeying the assertion.
This machine's scan override, not the configuration it is running. null on any scan_* field means the machine inherits that field from the enrollment profile it enrolled through.
RFC 3339 when Suspend was pressed, else null.
The hooks section. tools is keyed claude_code | codex | gemini_cli | cursor | windsurf | copilot_cli | antigravity; in a response every one of the five is present, and on a request an absent tool is on.
What a hook does when the agent cannot answer. One setting for every tool with hooks on.
allowblockThe restrictions section, keyed local_mcp_servers | extensions | extension_directory. An absent key is not set.
RFC 3339 when the agent reported its local uninstall, else null.
Errors
- 400
Request carried a capture_tactic field, or a scan setting outside its bounds
- 403
Caller lacks fleet:manage in this workspace
- 404
No such machine in this workspace
- 409
The machine is deleted or uninstalled
Per-day interaction and decision counts for one machine
Gated on machines:read, exactly as the interactions list itself is — this is a rollup of rows that grant already reads, and a stricter gate here would hide a count of things the caller may list one by one.
A machine in another workspace is a 404, never a 403 — get_machine's existence-oracle reasoning.
Path parameters
Query parameters
Trailing window, in UTC days. Default 30, clamped to 1..=90.
Response200
Per-day counts, oldest first, zero-filled
Oldest first, zero-filled: the quiet days are data, not gaps.
Decisions that were alerts that day: raised by a policy's Alert action or by a justified override. Not an outcome: a Block with Alert is counted in blocked and here; a match with no Alert action is alerted and not here.
YYYY-MM-DD.
Interactions observed on this machine that day.
Errors
- 401
No valid session
- 403
Caller lacks machines:read in this workspace
- 404
No such machine in this workspace
A machine's address history
Every retained address change for one machine, both kinds, newest first. At most 50 changes of each kind are kept, and all of them are returned: there is no paging. Needs permission to read machines.
Personal data. A machine in another workspace, or an ID that cannot be read, is a 404. A machine whose address has never changed answers 200 with two empty lists.
Path parameters
Response200
Both kinds' retained changes, newest first
How many changes of each kind are kept for a machine. A list this long has had older changes dropped.
What the server saw the connection arrive from.
The address it changed to, bare — never with a /32 suffix.
RFC 3339. The API states instants and never pre-formats them.
True when address is private, loopback, link-local, CGNAT or otherwise non-global — a network inside somebody's walls, about which no country claim would be honest.
The ISO 3166-1 alpha-2 country of address, looked up on the server itself: no address is sent anywhere to be located. Null for every private address and for a public one the lookup does not cover; private tells the two apart.
What it replaced, or null when this is the first of its kind.
What the agent said its own primary egress interface was.
The address it changed to, bare — never with a /32 suffix.
RFC 3339. The API states instants and never pre-formats them.
True when address is private, loopback, link-local, CGNAT or otherwise non-global — a network inside somebody's walls, about which no country claim would be honest.
The ISO 3166-1 alpha-2 country of address, looked up on the server itself: no address is sent anywhere to be located. Null for every private address and for a public one the lookup does not cover; private tells the two apart.
What it replaced, or null when this is the first of its kind.
Errors
- 401
No valid session
- 403
Caller lacks machines:read in this workspace
- 404
No such machine in this workspace
A machine's content collection queue
The file contents requested from this machine: counts by state and up to 200 requests, newest first. A machine in another workspace is a 404.
Path parameters
Response200
This machine's tracked content queue
Requests that used up every attempt without the file contents arriving. Final: the server has stopped asking, so these are not counted as still in progress.
The agent said it holds the request (acknowledged).
Requests that could still end with the file contents stored.
Outstanding and not yet acknowledged: requested, plus failed short of the attempt cap — both are still waiting on a beat to move them.
The body arrived (stored). Terminal.
RFC 3339.
Errors
- 401
No valid session
- 403
Caller lacks machines:read in this workspace
- 404
No such machine in this workspace
List a machine's recent commands
The latest 20 commands sent to this machine, newest first, and what its agent said happened.
Path parameters
Response200
Recent commands, newest first
Newest first.
How many heartbeats have carried it.
RFC 3339. When an unanswered command stops being delivered.
RFC 3339.
What was asked, verbatim — {"level": "debug"} on a set_log_level, {} on the rest. Operator-authored, never agent-authored.
Errors
- 403
Caller lacks fleet:manage in this workspace
- 404
No such machine in this workspace
Queue a command for a machine
The machine picks the command up when it next checks in. A command that is not picked up before its kind's expiry, or that the machine receives several times without answering, is dropped.
Path parameters
Request bodySendCommandRequest
Response202
Command queued
Errors
- 400
Unknown command kind
- 403
Caller lacks fleet:manage in this workspace
- 404
No such machine in this workspace
- 409
A retired kind (
retired_kind), or a deleted or uninstalled machine
A machine's AI connections
The tools on this machine that talked to AI services, and the services they talked to, over a recent window. A machine in another workspace, or a deleted one, is a 404.
Path parameters
Query parameters
Trailing window, in hours. Default 24, clamped to 1..=168.
Response200
Tools and services, largest first
Largest first, at most 20.
Interactions with at least one blocked decision.
The AI service host, e.g. api.anthropic.com.
Largest first, at most 20.
The client's own declared name, e.g. Claude Code; its client_kind word (cli, ide, …) when it declared none; other when neither.
The commonest declared client kind among its interactions.
As total_tools, for services.
How many distinct tools were in the window, including any past the 20 the list stops at.
The window actually used, after the clamp.
Errors
- 401
No valid session
- 403
Caller lacks machines:read in this workspace
- 404
No such machine in this workspace, or it was deleted
Delete a machine
Final. The machine leaves every list, and if its agent comes back online it is told it was deleted and removes itself. An Active machine cannot be deleted (409 not_deletable).
Path parameters
Response204
Deleted
Errors
- 403
Caller lacks fleet:manage in this workspace
- 404
No such machine in this workspace
- 409
not_deletable(an Active machine) ordeleted
List a machine's diagnostic bundles
Newest first, without log tails. Needs permission to manage the fleet, because a bundle answers a command only a fleet manager can send.
Path parameters
Query parameters
The filter expression, e.g. all;truncated~in~true;error~nin~none.
Fields: agent_version, bundle_hash, truncated, error, collected, received. The machine is not one of them: it is the path, not a condition, which is what makes this tab's locked chip a statement of the surface rather than a filter a reader could clear.
Free text over the agent version, the bundle hash and the error kind. Never the log tail — this route does not serve one.
Where the previous page stopped. Opaque; an unreadable one starts over.
Rows wanted: 50 when absent, between 1 and 200.
Response200
Stored bundles, newest first
RFC 3339, from the endpoint's clock.
RFC 3339, from ours.
How many bundles the filter matched in all, not just on this page.
Pass back as cursor for the next page. null means this was the last.
Errors
- 400
The filter names a field this surface does not have
- 401
No valid session
- 403
Caller lacks fleet:manage in this workspace
- 404
No such machine in this workspace
One diagnostic bundle
The bundle in full, log tail included. Needs permission to manage the fleet. Each read is recorded in the audit log; listing bundles is not.
Path parameters
Response200
The bundle
Free-form counters, exactly as the agent sent them.
The end of the agent's log. Only a single bundle carries it; the list does not.
Errors
- 401
No valid session
- 403
Caller lacks fleet:manage in this workspace
- 404
No such bundle for this machine in this workspace
Delete a diagnostic bundle
Removes the bundle for good, not just from view, and records the deletion in the audit log. Needs the fleet:manage permission. A 404 when the bundle is not this machine's or the machine is not in this workspace. Deleting a bundle does not ask the machine for a new one.
Path parameters
Response204
The bundle no longer exists on the server
Errors
- 401
No valid session
- 403
Caller lacks fleet:manage in this workspace
- 404
No such bundle for this machine in this workspace
List a machine's elevation grants
Newest first, with each grant's state: live, revoked or expired. Needs permission to manage the fleet.
Path parameters
Response200
This machine's grants, newest first
The grant stands until revoked; expires_at is then a century out.
live, revoked or expired.
None for a grant nobody ever pasted in — a fact worth showing, not a gap to hide.
Errors
- 403
Caller lacks fleet:manage in this workspace
- 404
No such machine in this workspace
Resume a suspended machine
The machine's agent sets itself up again on its next check-in.
Path parameters
Response204
Resumed
Errors
- 403
Caller lacks fleet:manage in this workspace
- 404
No such machine in this workspace
- 409
not_suspended,uninstalledordeleted
Turn one of a machine's strategies on or off
The set of strategies a machine enrolled with never changes; this only decides which of them are running. A strategy the machine did not enroll with is a 400, not an addition.
Path parameters
Request bodySetStrategyEnabledRequest
Whether this strategy should be running.
Response200
Updated machine
What this machine is enrolled to be capable of. Immutable.
Worked out from capture_strategies.
nonemetadatamitm_caextensionredirectWhich of them are running. Mutable, per strategy.
Most severe first; non-empty only when health is degraded. On a list row this is the beat-time snapshot; on the detail view it is recomputed when the request is read.
steering_failed | root_removed | config_not_applied | crashed | worker_stopped | interception_off | pac_unwitnessed | tool_hooks_failed | ask_unavailable | clock_skew, most severe first.
config_not_applied only: every section not applied.
interception_off only: turned off under an elevation grant.
RFC 3339. crashed: when. pac_unwitnessed: since when the PAC has been applied with nothing fetching it. tool_hooks_failed: the first of the failing beats.
steering_failed only: the agent's sentence.
ask_unavailable only: how many signed-in people have no companion. Its at is since when.
Whether this machine is paused as of this response, worked out from paused_until by the server.
active | installing | stuck | suspended | uninstalled | archived | deleted. A list never carries deleted.
Live pauses, all three scopes.
enforcement | scans | capture.
RFC 3339.
AI tools the machine reported present, in the order its agent reported them. Empty when it has reported none.
The hooks layer reads applied or witnessed. False draws the mark dimmed: seen, not hooked.
A registry slug (heartbeat-tools.json → registry).
OS logins with a live presence on this machine, newest first. Personal data, readable by anyone who can read machines.
The per-machine attachment overrides; null means the machine inherits the setting from its profile.
The Machines list's 3 of 4: covered is how many are reporting.
The per-machine content-collection override; null means the machine inherits its profile's switch. Decides whether file contents may be collected from this machine.
The companion version the machine last reported. null means not reported yet, not "no companion".
The machine's own disabled-strategy block, null when it follows the profile; enabled_strategies above is the materialised result.
The health of an active machine. Only an active machine has one; installing and stuck are lifecycle values, not health. unreachable is worked out when the request is answered.
unreachablepauseddegradedhealthyRFC 3339, or null if the machine has never checked in.
The per-machine log-level override, or null when this machine inherits its enrollment profile's level.
The address the server last saw this machine's requests arrive from. null before its first beat.
Personal data and a coarse location signal: it names the network a machine connects from. Same grant as above.
The per-machine panel overrides; null means the machine inherits the setting from its profile.
When this machine's user paused enforcement until, as it last reported. null means enforcing, which almost every machine almost always is.
A value in the past is stale, not paused: the agent resumes on its own clock and clears the field when it next checks in. Read is_paused rather than comparing this to the current time yourself.
The enrollment profile a machine enrolled through, by name.
The machine's own primary egress address, as it last reported one. null means it never has: either its agent is too old to report one, or it could not determine an address.
Personal data. Readable by anyone who can read machines.
What the agent last said it is actually running at, or null when it has never said — an agent from before the field, which must render as not reported rather than as obeying the assertion.
This machine's scan override, not the configuration it is running. null on any scan_* field means the machine inherits that field from the enrollment profile it enrolled through.
RFC 3339 when Suspend was pressed, else null.
The hooks section. tools is keyed claude_code | codex | gemini_cli | cursor | windsurf | copilot_cli | antigravity; in a response every one of the five is present, and on a request an absent tool is on.
What a hook does when the agent cannot answer. One setting for every tool with hooks on.
allowblockThe restrictions section, keyed local_mcp_servers | extensions | extension_directory. An absent key is not set.
RFC 3339 when the agent reported its local uninstall, else null.
Errors
- 400
Unknown strategy, or one this machine did not enrol with
- 403
Caller lacks fleet:manage in this workspace
- 404
No such machine in this workspace
- 409
The machine is deleted or uninstalled
Suspend a machine
On its next check-in the machine's agent puts back what it changed and stands down, still checking in every five minutes. Reversible with Resume.
Path parameters
Response204
Suspended
Errors
- 403
Caller lacks fleet:manage in this workspace
- 404
No such machine in this workspace
- 409
already_suspended,uninstalled,archivedordeleted
A machine's history
Newest first: the audit records that name the machine, each command's queued, delivered and answered stages, and what the machine itself reported. Needs permission to manage the fleet.
Path parameters
Query parameters
next_before from the previous page.
1–200; default 50.
Response200
The machine's history, newest first
Newest first.
RFC 3339.
config_changed | lifecycle | diagnostics | companion_action | grant | command_queued | command_delivered | command_acked | command_expired | command_quarantined | config_applied | config_failed | restarted | pause_started | pause_ended | health_changed | gap | environment | surface | suspended | resumed | deleted | uninstalled | self_removed | archived | unarchived | replaced | tool_coverage | ask_unavailable | ask_available.
One line, composed by the server, in sentence case.
The display name of the person who did it, or null when no person did.
The entry's facts, or null when it has none.
Pass back as before; null on the last page.
Errors
- 400
beforeis not a cursor this route issued- 403
Caller lacks fleet:manage in this workspace
- 404
No such machine in this workspace
A machine's updates, newest first
Path parameters
Response200
Updates, newest first
1 for the first try; each retry adds one.
The machine's OS, as it reports it: windows | macos | linux.
The update reached its version and left something undone: a reconcile step failed, interrupted or deferred, a retired file failed, or a component skipped. false while outcome is null.
When state last changed.
The rollout's scope: profile | machine.
waiting | downloading | verifying | installing | awaiting | updated | failed | cancelled | skipped.
What this machine is moving to: the default build of its OS when the rollout started.
Why it failed or was skipped or cancelled, in a sentence.
When the next automatic retry is due; null when none is.
What an update did on the machine, in the agent's own account. An endpoint's word: shown, and trusted for nothing.
Why a skipped machine was skipped: no_build (the release has no agent build for its OS), needs_reinstall (it runs a version too old to update in place) or ahead (it already runs something newer). null on every other state.
null when the sweep started it (automatic update).
Errors
- 401
No valid session
- 403
Caller lacks machines:read in this workspace
- 404
No such machine in this workspace
Update one machine to the default build
Path parameters
Request bodyStartUpdateRequest
Automatic retries per machine, 0–5. Omitted means 3.
Response201
The rollout
Rows per state, zeros left out.
Automatic retries per machine, 0–5.
1 for the first try; each retry adds one.
The machine's OS, as it reports it: windows | macos | linux.
profile | machine.
The highest version any of its machines is moving to — a headline. Machines of different OSes can move to different versions: targets says which, and each row carries its own target_version.
Per OS, in the order windows, macos, linux.
Those machines per state, zeros left out.
The rollout's machines of this OS moving to version.
windows | macos | linux.
Set once no machine has anything left to do.
The user who started it; null when the sweep started it because the profile updates automatically (or the user has since been deleted — the audit row still names them).
Errors
- 400
max_retries outside 0–5
- 401
No valid session
- 403
Caller lacks fleet:manage in this workspace
- 404
No such live machine in this workspace
- 409
The machine is not behind the default, or no release is published