Skip to content

Network Discovery

Network Discovery lets you scan subnets across your managed sites to find devices, identify their type and manufacturer, map open services, and build a topology of how hosts connect through routers and switches. Scans are executed by the Breeze agent running on a device within the target network. The agent performs ARP resolution, ICMP ping sweeps, TCP port scans, and SNMP queries, then reports results back to the API via WebSocket. Discovered assets are stored per-organization and automatically linked to enrolled devices when a MAC or IP address match is found.

Discovery profiles define what to scan and how. A profile is scoped to a single site and contains target subnets, scan methods, port ranges, SNMP communities, and a schedule. When a scan is triggered, a discovery job is created and dispatched through BullMQ to an online agent at the profile’s site. Results are processed asynchronously — assets are upserted, topology edges are enriched, and the job record is updated with summary statistics.


Key Concepts

Scan Types

MethodDescriptionPrivilege Required
arpSends ARP requests on the local subnet to resolve IP-to-MAC mappings using raw packet capture (pcap)Root / Administrator
pingICMP echo request sweep to identify live hosts and measure round-trip timeRoot / Administrator
port_scanTCP connect scan against configured port ranges to identify open servicesNone
snmpQueries SNMP system OIDs (sysDescr, sysObjectID, sysName) to identify device type and manufacturerNone

Discovery Profiles

A profile defines the complete configuration for a scan: which subnets to target, which methods to use, port ranges, SNMP credentials, and when scans should run. Profiles are scoped to an organization and site. Multiple profiles can exist per site to cover different network segments or scan strategies.

Discovered Assets

Each unique IP address found during a scan is stored as a discovered asset within the organization. Assets are classified by type (workstation, server, printer, router, switch, etc.) and track their status through a lifecycle:

StatusMeaning
newRecently discovered, not yet reviewed
identifiedReviewed and classified but not linked to an enrolled device
managedLinked to an enrolled Breeze agent device
ignoredExplicitly excluded from monitoring and reports
offlinePreviously seen but not found in the most recent scan

Asset Types

TypeClassification Criteria
printerSNMP sysDescr contains “printer”, or ports 9100/631 are open
routerSNMP indicates router, or gateway IP (.1/.254) with HTTP but no SSH/RDP
switchSNMP sysDescr or sysObjectID contains “switch”
firewallSNMP sysDescr or sysObjectID contains “firewall”
nasSNMP indicates NAS/Synology/QNAP, or ports 5000+5001 open
access_pointSNMP indicates wireless or access point
serverSSH open with database or service ports (3306, 5432, 1433, 6379, etc.)
workstationRDP (3389), SMB (445), SSH (22), or VNC (5900) open
unknownInsufficient data to classify

Network Topology

Discovery automatically builds topology edges between gateway devices (routers, switches, firewalls, access points) and the endpoint hosts they connect. Topology data is stored in the network_topology table and returned as a graph of nodes and edges by the topology endpoint.


Scan Types

ARP Scan

ARP scanning sends broadcast ARP requests on each matching network interface to resolve IP-to-MAC address mappings for all targets in the subnet. This is the most reliable method for discovering devices on the local L2 network segment.

The agent iterates over local network interfaces, matches them against the requested subnets, and sends ARP requests for each target IP. Replies are collected within the configured timeout window.

ICMP Ping Sweep

The ping sweep sends ICMP Echo Request packets to every target IP in parallel using a configurable worker pool (default: 128 concurrent workers). Each responding host is recorded with its round-trip time.

When both ping and port scan are enabled, the port scanner targets only the hosts that responded to ping, reducing scan time on large subnets.

TCP Port Scan

Port scanning uses TCP connect probes to check whether specific ports are open on each target. The scanner identifies well-known services by port number:

PortServicePortService
22SSH445SMB
23Telnet1433MSSQL
25SMTP3306MySQL
53DNS3389RDP
80HTTP5432PostgreSQL
135RPC5672AMQP
139NetBIOS5985/5986WinRM
161SNMP6379Redis
443HTTPS9100Printer

Port scanning does not require elevated privileges and works on all platforms.

Default ports (when no portRanges are specified): 22, 80, 443, 445, 3389, 161, 139, 135, 5985, 5986, 9100

SNMP Discovery

SNMP discovery queries each target on UDP port 161 using the configured community strings (default: public). It fetches three system OIDs:

OIDFieldUsage
1.3.6.1.2.1.1.1.0sysDescrOS and device identification, manufacturer detection
1.3.6.1.2.1.1.2.0sysObjectIDDevice model and type classification
1.3.6.1.2.1.1.5.0sysNameHostname / device name

Both SNMPv2c and SNMPv3 (NoAuthNoPriv) are supported. To use SNMPv3, prefix the username with v3: in the snmpCommunities array:

{
"snmpCommunities": ["public", "private", "v3:admin-user"]
}

SNMP data is used by the asset classifier to determine manufacturer (Cisco, HP, Dell, Juniper, MikroTik, Synology, QNAP, Ubiquiti, Fortinet) and device type.


Discovery Profiles

Creating a Profile

Profiles define the full scan configuration and are scoped to an organization and site.

Terminal window
POST /discovery/profiles
Content-Type: application/json
Authorization: Bearer <token>
{
"orgId": "uuid",
"siteId": "uuid",
"name": "Office LAN Scan",
"description": "Weekly scan of main office subnet",
"subnets": ["192.168.1.0/24", "192.168.2.0/24"],
"excludeIps": ["192.168.1.1"],
"methods": ["arp", "ping", "port_scan", "snmp"],
"portRanges": ["22,80,443,445,3389"],
"snmpCommunities": ["public"],
"schedule": {
"type": "cron",
"cron": "0 2 * * 0"
},
"deepScan": false,
"identifyOS": true,
"resolveHostnames": true,
"timeout": 3,
"concurrency": 128
}

Profile Fields

FieldTypeRequiredDescription
orgIdUUIDYes*Organization ID. Auto-resolved for org-scoped tokens
siteIdUUIDYesSite the profile belongs to
namestringYesHuman-readable name (max 255 chars)
descriptionstringNoOptional description
subnetsstring[]YesCIDR subnets or individual IPs to scan
excludeIpsstring[]NoIPs to skip during scanning
methodsstring[]YesScan methods: arp, ping, port_scan, snmp
portRangesanyNoPort ranges for port scan (e.g., ["22,80,443", "1000-2000"])
snmpCommunitiesstring[]NoSNMP community strings. Prefix v3: for SNMPv3 usernames
scheduleobjectYesSchedule configuration (see below)
deepScanbooleanNoAllow subnets larger than /16 (65,536+ hosts). Default false
identifyOSbooleanNoAttempt OS fingerprinting from SNMP and port data. Default false
resolveHostnamesbooleanNoPerform reverse DNS lookups. Default false
timeoutintegerNoPer-probe timeout in seconds. Default 2
concurrencyintegerNoNumber of concurrent workers. Default 128

Schedule Types

TypeRequired FieldsDescription
manualNoneOnly runs when triggered via POST /discovery/scan
croncronStandard cron expression for recurring scans
intervalintervalMinutesRun every N minutes

Updating a Profile

Terminal window
PATCH /discovery/profiles/:id
Content-Type: application/json
{
"subnets": ["10.0.0.0/24"],
"enabled": false
}

Only the fields you include are updated. Omitted fields retain their current values.

Deleting a Profile

Terminal window
DELETE /discovery/profiles/:id

Deleting a profile also removes all associated discovery jobs in a single transaction.


Running Scans

Triggering a Scan

To run a scan immediately, POST to the scan endpoint with the profile ID and an optional agent ID:

Terminal window
POST /discovery/scan
Content-Type: application/json
Authorization: Bearer <token>
{
"profileId": "uuid",
"agentId": "optional-agent-id"
}

If agentId is omitted, the system automatically selects an online agent from the profile’s site. The scan is dispatched through BullMQ to the discovery worker, which sends a network_discovery command to the agent via WebSocket.

Scan Execution Flow

  1. API creates a discovery job with status scheduled and enqueues a dispatch-scan task in BullMQ.

  2. Discovery worker picks up the task, loads the profile, finds an online agent at the site, and sends a network_discovery command via WebSocket.

  3. Agent receives the command and runs the configured scan methods (ARP, ping, port scan, SNMP) against the target subnets.

  4. Agent returns results via WebSocket as a command_result message containing the list of discovered hosts.

  5. API enqueues a process-results task in BullMQ. The worker upserts discovered assets, auto-links matches to enrolled devices by MAC/IP, enriches the network topology, and marks the job as completed.

Monitoring Job Status

List all jobs:

GET /discovery/jobs?orgId=uuid

Get job detail with discovered assets:

GET /discovery/jobs/:id

The detail endpoint returns the job record plus all discovered assets associated with the job.

Cancelling a Job

Jobs with status scheduled or running can be cancelled:

Terminal window
POST /discovery/jobs/:id/cancel

The job status is set to cancelled and the system attempts to remove it from the BullMQ queue. If the scan is already in progress on the agent, cancellation takes effect when results arrive — cancelled jobs skip result processing.

Job Statuses

StatusMeaning
scheduledJob created, waiting to be dispatched to an agent
runningCommand sent to agent, scan in progress
completedResults processed, assets upserted
failedNo online agent available, profile not found, or dispatch error
cancelledCancelled by an administrator before completion

Discovered Assets

Viewing Assets

List all discovered assets with optional filters:

GET /discovery/assets?orgId=uuid&status=new&assetType=router

Filter parameters:

ParameterValues
orgIdUUID of the organization
statusnew, identified, managed, ignored, offline
assetTypeworkstation, server, printer, router, switch, firewall, access_point, phone, iot, camera, nas, unknown

Each asset in the response includes monitoring status flags:

FieldDescription
snmpMonitoringEnabledWhether an active SNMP monitor is attached to this asset
networkMonitoringEnabledWhether an active network monitor (ping, TCP, HTTP, DNS) is attached
monitoringEnabledtrue if either SNMP or network monitoring is active
linkedDeviceNameDisplay name or hostname of the linked enrolled device, if any

Linking an Asset to a Device

Manually link a discovered asset to an enrolled device. This sets the asset status to managed:

Terminal window
POST /discovery/assets/:id/link
Content-Type: application/json
{
"deviceId": "uuid"
}

Ignoring an Asset

Mark an asset as ignored to exclude it from dashboards and reports:

Terminal window
POST /discovery/assets/:id/ignore
Content-Type: application/json
{
"reason": "Test device, not production"
}

The reason field is optional (max 1,000 characters). The asset records who ignored it and when.

Deleting an Asset

Terminal window
DELETE /discovery/assets/:id

Deleting an asset also removes all associated SNMP devices (and their metrics and alert thresholds) and network monitors in a single transaction.


Network Topology

The topology endpoint returns a graph representation of discovered assets and their connections:

GET /discovery/topology?orgId=uuid

Response structure:

{
"nodes": [
{
"id": "uuid",
"type": "router",
"label": "gateway.local",
"status": "managed",
"ipAddress": "192.168.1.1",
"macAddress": "aa:bb:cc:dd:ee:ff"
}
],
"edges": [
{
"id": "uuid",
"sourceId": "uuid",
"targetId": "uuid",
"sourceType": "discovered_asset",
"targetType": "discovered_asset",
"connectionType": "routed",
"bandwidth": null,
"latency": 1.2
}
]
}

Topology edges are automatically created during result processing. The system links gateway devices (routers, switches, firewalls, access points) to all endpoint hosts discovered in the same scan. Connection type is ethernet for switches and routed for all other gateway types. Existing edges are updated with a new lastVerifiedAt timestamp on each scan.


Network Monitors

Discovered assets can be attached to network monitors for ongoing health checking. Monitors are managed through the dedicated /monitoring routes and support four check types:

Monitor TypeDescription
icmp_pingPeriodic ICMP ping to check availability and measure latency
tcp_portTCP connect check against a specific port
http_checkHTTP/HTTPS request with status code and response time validation
dns_checkDNS resolution check for a target hostname

Each monitor tracks its current status (online, offline, degraded, unknown), last response time, consecutive failure count, and stores a history of check results. Alert rules can be configured per monitor to trigger notifications on failure thresholds.

The asset list endpoint (GET /discovery/assets) includes snmpMonitoringEnabled and networkMonitoringEnabled flags so you can see at a glance which assets have active monitoring.


API Reference

Discovery Profiles

MethodPathDescription
GET/discovery/profilesList profiles (?orgId=)
POST/discovery/profilesCreate a new profile
GET/discovery/profiles/:idGet profile by ID
PATCH/discovery/profiles/:idUpdate profile fields
DELETE/discovery/profiles/:idDelete profile and associated jobs

Scan Jobs

MethodPathDescription
POST/discovery/scanTrigger a scan (profileId, optional agentId)
GET/discovery/jobsList all jobs (?orgId=)
GET/discovery/jobs/:idGet job detail with discovered assets
POST/discovery/jobs/:id/cancelCancel a scheduled or running job

Discovered Assets

MethodPathDescription
GET/discovery/assetsList assets (?orgId=&status=&assetType=)
POST/discovery/assets/:id/linkLink asset to enrolled device
POST/discovery/assets/:id/ignoreMark asset as ignored
DELETE/discovery/assets/:idDelete asset and associated monitors

Network Topology

MethodPathDescription
GET/discovery/topologyGet topology graph (?orgId=)

Troubleshooting

ARP and ping scans return no results. ARP scanning requires root/Administrator privileges and the libpcap library. ICMP ping also requires raw socket access. If the agent runs as a non-privileged user, both methods are skipped. Check agent logs for messages like “ARP scan unavailable (built without CGO/pcap)” or “ICMP ping unavailable (requires root/elevated privileges)”. Port scanning works without elevated privileges and can be used as an alternative.

Scan job stays in scheduled status. The discovery worker requires Redis and BullMQ to dispatch scan commands. Verify Redis is running and accessible. If Redis is unavailable, the job is immediately marked as failed with the message “Background job service unavailable.” Also confirm at least one agent at the profile’s site is online — the worker selects an online agent from the same site to execute the scan.

Large subnets are skipped. Subnets larger than /16 (65,536+ hosts) are skipped by default to prevent excessive scan times and network traffic. Set deepScan: true on the profile to allow scanning of large subnets. Monitor the agent’s resource usage when scanning large address ranges.

Discovered assets are not auto-linking to enrolled devices. Auto-linking matches assets to enrolled devices by MAC address or IP address within the same organization using the device_network table. If the enrolled device has a different IP than what discovery sees (e.g., the device is behind NAT or uses a VPN), auto-linking will not find a match. Use POST /discovery/assets/:id/link to manually link the asset to the correct device.