The derived connectivity graph: every link between monitored nodes, with the evidence that produced it.
const url = 'https://example.com/api/v1/topology/links';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/links \ --header 'Authorization: Bearer <token>'Links are derived from CDP/LLDP adjacency and from nodes sharing an IP subnet; they are recomputed periodically rather than stored by hand. A group-scoped caller sees only links whose both endpoints are visible to them.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Return links with an id greater than this (the previous page’s next_cursor).
Maximum links to return.
Responses
Section titled “Responses”One keyset page of the connectivity graph; next_cursor is null on the last page
One keyset page of the derived connectivity graph, with what the last derivation run saw.
object
When the graph was last derived (RFC 3339), or null before the first run.
One undirected link in the derived connectivity graph.
object
Port name on the a side, when a source reported one.
ifIndex on the a side, when a source reported one.
One endpoint. null is reserved for an endpoint that is not a monitored node.
Port name on the b side, when a source reported one.
ifIndex on the b side, when a source reported one.
The other endpoint. null is reserved for an endpoint that is not a monitored node.
When this link was first derived (RFC 3339).
The endpoint an operator declared upstream, when one was declared. null means the direction
is worked out from how far each end is from a poller.
Stable id, and the keyset cursor.
When it was last confirmed (RFC 3339).
The strongest of sources — what to label the link with.
Every kind of evidence that produced this link.
The subnet behind a shared-subnet link, e.g. 192.168.1.0/24.
Pass back as cursor for the next page; null ⇒ this was the last one.
Counters for everything the last derivation declined to turn into a link.
object
Adjacency rows whose management address matched more than one node, so no link could be attributed without guessing which.
Links produced from a BGP peering session.
BGP peers that matched a monitored node but sit on no network the reporting node terminates, so the session is not evidence of a link between them. The normal reading is iBGP between loopbacks; a number that stays at zero on a network running iBGP means the reporting node’s interface addresses have not been observed.
Links produced from a CDP adjacency.
Addresses claimed by two or more nodes — a shared virtual IP, or a duplicate-address misconfiguration.
Links whose strongest evidence is shared-subnet membership.
Links produced from an LLDP adjacency.
Links produced from an OSPF neighbour relationship.
Segments with more than two members where no member could be identified as routing for the others, so no link was drawn.
Links produced from a connected host route — the point-to-point links that share no subnet.
Addresses sharing network bits but disagreeing on prefix length.
Nodes whose observation hit a per-node cap, so what is recorded for them is incomplete.
CDP rows whose management address matched no monitored node.
LLDP rows whose management address matched no monitored node.
Routing adjacencies whose peer address matched no monitored node.
How many links the whole graph holds, not just this page.
Example
{ "links": [ { "source": "manual", "sources": [ "manual" ] } ]}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" }}