The dependency graph: every node with its parent edge, current state, and any active root-cause attribution. Admin-only data source.
const url = 'https://example.com/api/v1/topology';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/topology \ --header 'Authorization: Bearer <token>'The default page is large — the graph views assemble the whole fleet, so fewer round-trips is better — but bounded, so no single response is a multi-MB blob.
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 dependency graph; next_cursor is null on the last page
One keyset page of the dependency graph.
object
Pass back as cursor for the next page; null ⇒ this was the last one.
One node in the dependency/topology graph.
object
Upstream parent in the dependency graph (null ⇒ a root).
Upstream node currently identified as the root cause of this node’s alert (dependency suppression), if any — lets a client collapse downstream alerts under the cause.
The current state of a monitored node or check.
Example
{ "nodes": [ { "state": "ok" } ]}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" }}Skeleton mode has no inventory to build the graph from
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" }}