Skip to content

Addresses seen on the network that Yagra does not monitor.

GET
/api/v1/discovered-endpoints
curl --request GET \
--url https://example.com/api/v1/discovered-endpoints \
--header 'Authorization: Bearer <token>'

Built from what the monitored nodes report and what reaches Yagra on its own: ARP / IPv6 neighbour caches, LLDP and CDP neighbours that advertise a management address (phones and end stations left out), OSPF neighbours and BGP peers, and syslog/trap senders that match no node. evidence says which of those saw each one. The ARP half needs the ARP walk enabled (Settings ▸ System settings ▸ Discovery walks); the others are collected by default.

An endpoint only a syslog or trap sender vouches for has no observing node, so it is listed only to a caller whose scope is unrestricted.

summary.truncated_nodes > 0 means at least one router’s ARP cache exceeded its row budget and the ARP half of this list is a sample, not a complete inventory of the segment.

limit
integer format: int64
via_node
string format: uuid

Only rows whose representative observer (via_node, the lowest-id observing node) is this node. A row this node also saw, but a lower-id node saw too, is not returned.

include_promoted
boolean

Include endpoints that have since become monitored nodes. Default false.

before_last_seen
string
before_id
string format: uuid

One page of unmonitored endpoints, most recently seen first

Media typeapplication/json

One page of discovered endpoints, most recently seen first.

object
endpoints
required
Array<object>

One address the fleet has resolved on the wire but does not monitor.

object
evidence
required

Where it was seen, ordered by source (ARP, LLDP, CDP, OSPF, BGP, syslog, trap) and capped at eight. Never empty.

Array<object>

One observation that made an address a candidate.

object
detail

What the source said about the endpoint: its platform or system description (LLDP/CDP), or the hostname it put in its syslog messages. Device-supplied text.

string | null
port

The reporting node’s own port name, as its LLDP/CDP table names it.

string | null
source
required

What saw it.

string
Allowed values: arp lldp cdp ospf bgp syslog trap
via_ifindex

The reporting node’s ifIndex, when the source names one.

integer | null format: int32
via_node

The monitored node that reported it; null for a syslog or trap sender, which reported itself.

string | null format: uuid
first_seen
required

When it was first seen anywhere in the fleet (RFC 3339).

string
id
required
string format: uuid
ip
required

The endpoint’s address.

string
last_seen
required

When it was last confirmed still present (RFC 3339).

string
mac

Its hardware address, lowercase colon-separated hex; null for an incomplete ARP entry.

string | null
name

The best name any source gave it: the LLDP system name, then the CDP device id, then the hostname in its syslog messages. null when none did. Device-supplied text.

string | null
promoted_node_id

The node this address became, once it is monitored; null while it is still unmonitored.

string | null format: uuid
via_ifindex

The SNMP ifIndex it was resolved on — the port it is behind.

integer | null format: int32
via_node

The row’s one representative observer: the lowest-id monitored node among its evidence (every observer is listed in evidence). null when no monitored node saw it — a syslog/trap sender only — or once that node has been deleted.

string | null format: uuid
next
One of:
null
summary
required

How much of the fleet’s ARP data this list was built from.

object
nodes_reporting
required

How many nodes have reported an ARP/ND cache at all.

integer format: int64
observed_total
required

Total endpoints observed across the fleet, before dedup and before the unmonitored filter.

integer format: int64
truncated_nodes
required

How many of those hit a cap, making their contribution a sample rather than a total.

integer format: int64
unmonitored_total
required

How many endpoints the caller can see that are still unmonitored, across every page.

integer format: int64
Example
{
"endpoints": [
{
"evidence": [
{
"source": "arp"
}
]
}
]
}

Before_last_seen and before_id must be given together, and before_last_seen must be RFC 3339

Media typeapplication/json

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
error
required
object
code
required

Stable machine-readable code. Clients branch on this, never on the message.

string
message
required

Operator-facing sentence. Safe to display; never carries an internal error’s own text.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example"
}
}

No valid bearer token

Media typeapplication/json

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
error
required
object
code
required

Stable machine-readable code. Clients branch on this, never on the message.

string
message
required

Operator-facing sentence. Safe to display; never carries an internal error’s own text.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example"
}
}

Role lacks View

Media typeapplication/json

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
error
required
object
code
required

Stable machine-readable code. Clients branch on this, never on the message.

string
message
required

Operator-facing sentence. Safe to display; never carries an internal error’s own text.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example"
}
}

Inventory storage is unavailable (skeleton mode)

Media typeapplication/json

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
error
required
object
code
required

Stable machine-readable code. Clients branch on this, never on the message.

string
message
required

Operator-facing sentence. Safe to display; never carries an internal error’s own text.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example"
}
}