list_nodes
const url = 'https://example.com/api/v1/nodes';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://example.com/api/v1/nodes \ --header 'Authorization: Bearer <token>'Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Case-insensitive substring of the node’s name or address.
Exact IP address of the node, compared as an address (so 2001:DB8::1 finds 2001:db8::1).
Pair it with kind=device,meraki to ask whether a device is already monitored at an address.
A value that is not an IP address is rejected.
Comma-separated display states (ok | warning | critical | unknown | unreachable |
maintenance); empty or absent means every state. An unknown token is rejected rather than
ignored.
Comma-separated monitoring kinds (wireless_ap | meraki | url | dns | device);
empty or absent means every kind.
Comma-separated effective poll pools — a node’s own pool when it sets one, otherwise the nearest folder ancestor that does, otherwise the default pool. Filtering on the stored column alone would miss every node that inherits, which is most of them. Pools are named by the operator, so there is no vocabulary to reject against: an unknown name simply matches nothing.
Responses
Section titled “Responses”One keyset page of the inventory, or a single capped page in search mode
One keyset page of the inventory.
object
Pass back as cursor for the next page; null ⇒ this was the last one. Always null in
filter mode, which returns a single capped page by design.
One inventory row (mirrors the WebUI NodeSummary).
object
The node’s address. 0.0.0.0 (or ::) means the node has none — a Meraki device the
Dashboard reports no LAN IP for, such as a mesh repeater (ADR-175). The column cannot be
empty, so that is how “no address” is stored; it is not an address anything can reach.
The group this node belongs to (for the inventory tree); null ⇒ ungrouped.
Stable identifier for a monitored node.
A UUID, not a name or address — both of which can change over a node’s life.
What this node is, and therefore how it is polled — the value that distinguishes a URL or DNS monitor from an ordinary ICMP/SNMP device in the inventory.
Resolved by NodeKind::resolve, the same function GET /nodes/{id} and the scheduler ask,
so a list row can never disagree with the detail page it opens.
A Meraki node’s product type as the Dashboard names it — wireless (an MR access point),
switch, appliance, … — and absent on every other node. What the list’s “AP” badge is
read from (ADR-168 decision 11): an MR stays kind: meraki, so the kind alone cannot say it is
an access point. The detail page reads the same value from meraki_device.product_type.
true on a Meraki access point that is a mesh repeater: it has no wired uplink, so the
Dashboard reports no LAN IP for it and its address is 0.0.0.0 (ADR-175). Absent
otherwise. What the list’s “Repeater” badge is read from.
The node’s own poll-pool; null ⇒ inherited from its folder, else the default pool.
The tree’s pool picker edits exactly this value, so it is what marks the active choice —
the effective pool (and the poller holding the node) comes from /nodes/:id/assignment.
Manual order within the group (the tree sorts members by this, then by name).
The current state of a monitored node or check.
Descriptive maker/model for the “name (addr) (vendor) (model)” display.
Filter mode only: matches exist that this answer does not contain, because the page hit its
cap or the candidate scan hit its ceiling. Always false while paging.
A separate field rather than something the client infers from nodes.len(), because once
the server rejects candidates after the query those two stop meaning the same thing: a
filter that scans 5,000 rows and keeps 3 returns three rows and is still incomplete.
Example
{ "nodes": [ { "kind": "wireless_ap", "state": "ok" } ]}An unknown state or kind token, or an address that is not an IP address
The ADR-019 envelope every failure renders as. pub(crate) and schema-bearing so the OpenAPI
document can name one error shape for every endpoint (ADR-035) instead of leaving 4xx/5xx bodies
undescribed — a client that has to guess the failure shape ends up parsing the success shape and
reading undefined.
object
object
Stable machine-readable code. Clients branch on this, never on the message.
Operator-facing sentence. Safe to display; never carries an internal error’s own text.
Examplegenerated
{ "error": { "code": "example", "message": "example" }}No valid bearer token
The ADR-019 envelope every failure renders as. pub(crate) and schema-bearing so the OpenAPI
document can name one error shape for every endpoint (ADR-035) instead of leaving 4xx/5xx bodies
undescribed — a client that has to guess the failure shape ends up parsing the success shape and
reading undefined.
object
object
Stable machine-readable code. Clients branch on this, never on the message.
Operator-facing sentence. Safe to display; never carries an internal error’s own text.
Examplegenerated
{ "error": { "code": "example", "message": "example" }}Role lacks the View permission
The ADR-019 envelope every failure renders as. pub(crate) and schema-bearing so the OpenAPI
document can name one error shape for every endpoint (ADR-035) instead of leaving 4xx/5xx bodies
undescribed — a client that has to guess the failure shape ends up parsing the success shape and
reading undefined.
object
object
Stable machine-readable code. Clients branch on this, never on the message.
Operator-facing sentence. Safe to display; never carries an internal error’s own text.
Examplegenerated
{ "error": { "code": "example", "message": "example" }}Too many inventory reads in flight — retry shortly (list_busy)
The ADR-019 envelope every failure renders as. pub(crate) and schema-bearing so the OpenAPI
document can name one error shape for every endpoint (ADR-035) instead of leaving 4xx/5xx bodies
undescribed — a client that has to guess the failure shape ends up parsing the success shape and
reading undefined.
object
object
Stable machine-readable code. Clients branch on this, never on the message.
Operator-facing sentence. Safe to display; never carries an internal error’s own text.
Examplegenerated
{ "error": { "code": "example", "message": "example" }}