Skip to content

Recent discovered (unclassified) devices across in-memory scans — the dashboard "discovery queue".

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

View, unlike the rest of this module, because it reports what has been seen rather than causing anything to happen. Empty in skeleton mode: with no discovery runner there are genuinely no candidates, which is an answer rather than an outage.

limit
integer

Recent unclassified devices; empty in skeleton mode

Media typeapplication/json
Array<object>

One device a scan found, with a suggested profile for the operator to confirm on import.

object
address
required
string
matched_credential_id

The stored credential that answered SNMP, by reference (never the value) — the UI preselects it on import so the working secret is bound automatically.

string | null format: uuid
model
string | null
reachable
required
boolean
suggested_profile_id

Suggested device profile, resolved server-side via the classification rules (by sysObjectID prefix, else sysDescr regex, else “Generic SNMP” when SNMP answered). An id, not a name, so the UI binds it robustly even if the profile was renamed.

string | null format: uuid
sysdescr
string | null
sysname
string | null
sysobjectid

sysObjectID (dotted) if it answered SNMP — the authoritative device-type signal the classifier prefers. Shown to the operator and useful for authoring rules.

string | null
vendor

Maker / model best-effort parsed from sysDescr (editable on import) — pre-fills the node’s descriptive metadata so the imported node displays “name (addr) (vendor) (model)”.

string | null
Examplegenerated
[
{
"address": "example",
"matched_credential_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"model": "example",
"reachable": true,
"suggested_profile_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"sysdescr": "example",
"sysname": "example",
"sysobjectid": "example",
"vendor": "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 read permission

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"
}
}