The node's adjacency change history, newest first.
const url = 'https://example.com/api/v1/nodes/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/neighbors/history';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/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/neighbors/history \ --header 'Authorization: Bearer <token>'A row is written only when the adjacency actually changed, so a quiet rack produces none. The
content key deliberately excludes the agent’s own churn (LLDP’s TimeMark and remote index), so
a row here means a port genuinely started or stopped facing something, or the peer on it changed.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Node id
Query Parameters
Section titled “Query Parameters”Responses
Section titled “Responses”One page of adjacency changes, newest first
One page of adjacency changes, newest first.
object
One append-on-change history row.
object
When the change was recorded (RFC 3339).
The adjacency as of this change.
object
The adjacencies, canonically ordered.
One observed adjacency.
The first three string fields are the identity; everything below them is payload. Payload changes still append a history row (a peer that was reimaged is a real change on that port), but they never split one link into two records.
object
What the peer says it is, normalized across both protocols.
The local ifIndex, when the protocol genuinely supplies one. CDP indexes its cache by
ifIndex so this is exact; LLDP’s lldpLocPortNum is an arbitrary local index that only
often equals ifIndex, so LLDP records leave this None rather than guess.
The local port, as the device names it: LLDP renders lldpLocPortId by its subtype, CDP
uses cdpInterfaceName. Falls back to port <n> / ifindex <n> when the naming table has
no row, so the record still has an identity rather than being dropped.
Which protocol reported this.
The peer’s chassis id, rendered by subtype: LLDP lldpRemChassisId, CDP cdpCacheDeviceId.
The peer’s management address, from cdpCacheAddress for CDP and from lldpRemManAddrTable
for LLDP. None when the peer advertised none.
cdpCachePlatform — the peer’s hardware/software platform string (CDP only).
The peer’s port id, rendered by subtype: LLDP lldpRemPortId, CDP cdpCacheDevicePort.
lldpRemPortDesc — the peer’s own description of its port.
lldpRemSysDesc.
lldpRemSysName. CDP has no separate system name (its device id serves both).
Whether [MAX_NEIGHBORS_PER_NODE] was hit and rows were dropped. Reported rather than
silently swallowed — a truncated view that looks complete is worse than no view.
The content key this replaced; null marks the first observation ever recorded for the node.
Example
{ "changes": [ { "neighbors": { "neighbors": [ { "capabilities": [ "router" ], "proto": "lldp" } ] } } ]}Before_at and before_id must be given together, and before_at must be RFC 3339
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 View
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" }}Inventory storage is unavailable (skeleton mode)
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" }}