Inventory

The Hermes agent discovers hardware, software and configuration on each Windows and Linux endpoint and reports it to the server. Inventory is organized into modules. The agent keeps its own copy of the last collection and, after the first report, sends a module again only when its content has changed.

What's collected#

Each module covers one area of the endpoint. Not every module exists on both platforms. The linked pages describe what each area shows on the agent details page.

ModuleWhat it coversWindowsLinux
osOperating system: name, edition, version, build, architecture, domainYesYes
hardwareHardware: manufacturer, model, serial, chassis, BIOS, virtual-machine detectionYesYes
bootsecurityBoot & security: Secure Boot, TPM, pending restartYesYes
processorsInstalled CPUs (see Hardware)YesYes
memoryMemory and per-slot detailYesYes
storageVolumes and storage devices (see Hardware)YesYes
physicaldisksPhysical disks & disk healthYesYes
networkNetwork configuration and interfacesYesYes
sharesShared folders exposed by the endpointYesYes
softwareInstalled softwareYesYes
servicesServices and their stateYesYes
environmentEnvironment variablesYesYes
localgroupsLocal groups and membershipYesYes
updatesInstalled hotfixes / KB updates (see Windows Updates)Yes—
missingupdatesUpdates the endpoint is missing, checked against the offline update catalog (see Windows Updates). Included only when the agent has a catalog.Yes—
featuresWindows optional features that are enabledYes—
virtualizationVirtualization host inventoryYes—
containersContainer inventory—Yes
rustdeskRustDesk remote-support client stateYesYes
agentinfoThe agent itself: hostname, agent version and similar detailsYesYes
metricsReal-time CPU, memory and disk metricsYesYes

On Windows, inventory is read mainly from WMI and the registry. CPU usage in the real-time metrics comes from performance counters. Modules are collected in parallel and each one is handled as soon as it finishes. A module that fails to collect is skipped for that pass and doesn't block the others.

How inventory reaches the server#

Collecting inventory and sending it are separate steps. The agent collects into a local copy on the endpoint. It then sends the server only the modules that the server doesn't already have in their current form.

  1. On connect. When the agent connects to a server, it sends its stored inventory right away and doesn't collect again first. On a fresh install with nothing stored yet, it runs a full collection first and then sends the result.
  2. Periodic full collection. Every Full Inventory Interval (see Refresh intervals) the agent collects every module again and updates its local copy. This step on its own sends nothing to the server.
  3. Changes only. At the heartbeat cadence, the agent compares each stored module with what it last sent to each connected server. It sends a module only if the module has changed. A changed module is sent in full. An endpoint where nothing changed sends no inventory traffic between collections.
  4. Metrics are not part of this comparison. They travel with every heartbeat.

Commands have priority over inventory. If a command is running when a periodic collection is due, the agent skips that collection and tries again at the next interval. If a command starts during a collection, the agent stops collecting for that pass.

An agent that reports to more than one server (see Multi-Homed Agents) collects once and tracks what it has sent to each server separately. Each time a server connection is re-established, the agent sends that server its full stored inventory again.

Because of this design, the data you see is at most one Full Inventory Interval (plus one heartbeat) old. If you need current data immediately, use Collect inventory now.

Agent properties derived from inventory#

As modules arrive, the server updates a few properties on the agent record. You can use these properties in filters and dynamic collections:

Filter fieldSet fromMeaning
IsServerosThe endpoint runs a server edition of its operating system.
IsDomainJoinedosThe reported domain is set and isn't WORKGROUP.
DomainNameosThe domain (or workgroup) the endpoint reports.
IsVirtualMachinehardwareThe endpoint is a virtual machine.
ChassisTypehardwareThe reported physical form factor.
IsLaptophardwareChassis type is Laptop, Notebook or Portable.
IsTablethardwareChassis type is Tablet.
IsSFFhardwareChassis type is Small Form Factor, Mini Tower or Compact.

Querying inventory#

GET api/agents/{agentId}/inventory returns everything the server holds for an agent. Sub-routes return a single area:

Sub-routeReturns
.../inventory/osOperating system inventory
.../inventory/hardwareHardware inventory
.../inventory/metricsReal-time CPU / memory / disk metrics
.../inventory/processorsProcessor inventory
.../inventory/memoryMemory slot inventory
.../inventory/storageStorage devices
.../inventory/networkNetwork configuration and interfaces
.../inventory/softwareInstalled software
.../inventory/updatesInstalled hotfixes / KBs
.../inventory/servicesWindows services
.../inventory/featuresWindows optional features

Areas without their own sub-route, such as shares, local groups or environment variables, are included in the full GET api/agents/{agentId}/inventory response. All of these routes need the inventory.view permission, which the built-in Helpdesk, Operator and Admin roles include (see Permission Model). They return 404 when the agent doesn't exist or hasn't reported that area yet, and 403 without the permission.

These routes return what the server already holds. To make an agent collect fresh data first, use Collect inventory now. Fetch the hardware inventory for an agent over the API:

# Fetch hardware inventory for one agent
$headers = @{ Authorization = "Bearer $token" }

Invoke-RestMethod `
  -Uri "https://athena.example.com:8443/api/agents/$agentId/inventory/hardware" `
  -Headers $headers `
  -SkipCertificateCheck

Collect inventory now#

Agents report inventory on their own schedule. When you need current data right away, for example after installing software, changing hardware or fixing a configuration, use Collect inventory. The agent runs a fresh, full collection of every module. It does not resend the snapshot it already has. This works on both Windows and Linux agents.

Where to start it

WhereControlTargets
Agent details headerThe Collect inventory icon button (tooltip: Collect inventory now - the agent runs a fresh full collection)This one agent. The button is also shown while the agent is offline, so a click tells you the agent is offline instead of the button disappearing.
Agents listTick the row checkboxes, then click Collect inventory (n) in the toolbarThe selected agents. The header checkbox selects every agent on the current page.
Collection details pageCollect InventoryEvery current member of the collection. The button is disabled when the collection has no members. It is also available on system-managed collections.

The Agents list clears your selection when you change page, filter or search, so Athena never acts on agents you can no longer see. The same selection also drives Restart.

Who can use it

Collecting inventory requires the agents.manage permission. The built-in Operator and Admin roles include it (see Permission Model). Users without it do not see the button, the Agents-list checkboxes or the collection button. The REST API returns 403 to them.

What you see

Athena sends the request to each agent that is connected right now. Nothing is queued for offline agents, so run the request again once they are back online. Every targeted agent gets one of these outcomes:

OutcomeMeaning
SentThe agent received the request. Its fresh inventory arrives shortly after.
OfflineThe agent is not connected to this server. Nothing was sent.
FailedThe agent was connected, but the request could not be delivered.
NotFoundNo agent exists with that ID (REST API only).

Collect inventory vs. the refresh button vs. Scan for Missing Updates. The plain refresh button next to Collect inventory only reloads what the server already holds. It does not contact the agent. Collect inventory does not make the agent download the WSUS update catalog. An agent that already has a cached catalog still checks for missing updates as part of the collection. To send the current catalog and force an update scan, use Scan for Missing Updates in the agent's Windows Updates section (see Windows Update Management). After a restart from Athena, a full collection is requested automatically when the agent reconnects.

REST API

EndpointBodyResponses
POST api/agents/{id}/inventory/refreshNone200 request delivered · 404 no such agent · 409 agent offline or send failed (nothing collected) · 403 missing agents.manage
POST api/agents/inventory/refreshagentIds (array of agent IDs) and/or collectionId. Athena uses the combination of both, with duplicates removed.200 with per-agent outcomes (offline agents are reported, not an error) · 400 no agents to collect from · 404 collection not found · 403 missing agents.manage

Both return the totals totalRequested, sentCount, offlineCount and failedCount (failed plus not found), and a results array of { agentId, hostname, status }. The inventory itself arrives asynchronously. Read it afterwards with the inventory routes.

# Collect fresh inventory from every member of a collection
$headers = @{ Authorization = "Bearer $token" }
$body = @{ collectionId = $collectionId } | ConvertTo-Json

$r = Invoke-RestMethod -Method Post `
  -Uri "https://athena.example.com:8443/api/agents/inventory/refresh" `
  -Headers $headers -ContentType "application/json" -Body $body `
  -SkipCertificateCheck

$r.data.results | Where-Object status -ne "Sent"   # who still needs a retry

Auditing

Each request writes one InventoryRefreshRequested event to the audit log. It records who asked and lists the hostnames that were sent the request, offline, failed or not found. The action is CollectInventory, or UpdateScan when the collection came from Scan for Missing Updates.

Refresh intervals#

Two fleet-wide settings control how fresh inventory is. You set both on Settings → Agents (see Agent Settings, which also lists their defaults). The server pushes changes to connected agents.

SettingEffect on inventory
Heartbeat Interval
heartbeatIntervalSeconds
How often the agent checks in. Changed modules and real-time metrics are sent at this cadence.
Full Inventory Interval
statusUpdateIntervalSeconds
How often the agent runs a full collection of every module. This is the heavier operation. Shorter intervals give fresher data but put more load on the endpoints.