---
title: "Get dashboard summary"
method: GET
path: "/api/v1/dashboard/summary"
tags: ["dashboard", "internal"]
---

# Get dashboard summary

`GET /api/v1/dashboard/summary`

Returns aggregated dashboard data including network metrics, daemon health,
recent discoveries, and plan usage.

## Response `200`

Dashboard summary

- ApiResponseDashboardSummary
  - `data` object — Dashboard summary response
    - `daemons` DaemonResponse[], required — Daemons the caller can see, with their current status.
      - `api_key_id` string, uuid, nullable — Foreign key to API key used for ServerPoll authentication. NULL for DaemonPoll daemons or those not yet linked to a key.
      - `host_id` string, uuid, required — The host this entity belongs to.
      - `is_unreachable` boolean — Whether the daemon is unreachable (for ServerPoll circuit breaker). Set to true after repeated polling failures, reset via retry-connection endpoint.
      - `last_seen` string, date-time, nullable — Timestamp of last successful contact with daemon. NULL for provisioned ServerPoll daemons that haven't been contacted yet.
      - `mode` 'server_poll' | 'daemon_poll', required — Daemon operating mode that determines the communication pattern. - **DaemonPoll** (formerly "Pull"): Daemon makes outbound connections to the server. The daemon registers itself and polls for work. Best for daemons behind NAT/firewall. - **ServerPoll** (formerly "Push"): Server makes connections to the daemon. Server polls daemon for status and discovery results. Best for DMZ deployments where daemon cannot make outbound connections.
      - `name` string, required — Human-facing name for this daemon.
      - `network_id` string, uuid, required — The network this entity belongs to.
      - `standby` boolean — Whether the daemon is on standby due to inactivity (no discovery in 30 days).
      - `standby_cleared_at` string, date-time, nullable — Timestamp of the most recent standby → active transition. Set by `process_startup` when a restarted daemon is un-standby'd, and by the discovery auto-wake path. The nightly inactivity check skips daemons within the grace window (see `STANDBY_GRACE_PERIOD_DAYS`) to prevent the "restart → cleared → re-standby'd before discovery runs" race.
      - `tags` string[], required — Tags assigned to this entity.
      - `url` string, uri, required — Address the *server* dials for a ServerPoll daemon. Editable (a daemon can move); unused and not editable for DaemonPoll, which dials out instead. Base URL the server reaches this daemon on.
      - `user_id` string, uuid, required — User responsible for maintaining this daemon
      - `version` string, nullable — Daemon software version (semver format)
      - `created_at` string, date-time, required — When this record was first created.
      - `id` string, uuid, required — Server-assigned unique identifier.
      - `interfaced_subnet_ids` string[], required — Subnets this daemon has interfaces on, loaded from the `daemon_interfaced_subnets` junction (replaces the old `capabilities.interfaced_subnet_ids` JSONB field).
      - `updated_at` string, date-time, required — When this record was last modified.
      - `version_status` DaemonVersionStatus, required — Daemon version status including health and any warnings
        - `has_correct_docker_volume_mount` boolean — Whether a containerized daemon is mounted so it can read the Docker socket.
        - `status` 'Current' | 'Outdated' | 'Deprecated' | 'Unsupported' | 'Unknown', required — Health status for daemon versions. Lifecycle order: `Current` → `Outdated` → `Deprecated` → `Unsupported`, with `Unknown` for daemons whose version the server has no record of.
        - `sunset_date` string, nullable — The date this daemon's version stops being supported, if a sunset is scheduled for it. Surfaced top-level (not only inside `warnings`) so the UI can render a countdown from the same value the email uses.
        - `supports_targeted_rescan` boolean — Whether this daemon can run a single-host rescan. Server-computed so the frontend never has to hardcode a version floor.
        - `supports_unified_discovery` boolean — Whether the daemon can run a combined discovery pass.
        - `version` string, nullable — Version the daemon reports.
        - `warnings` DeprecationWarning[] — Upgrade warnings that apply to this version.
          - `message` string, required — What the operator needs to do, and by when.
          - `severity` 'Info' | 'Warning' | 'Critical' | 'Unknown', required — Severity level for deprecation warnings
          - `sunset_date` string, nullable — Date after which this daemon version stops being supported.
    - `networks` NetworkSummary[], required — Per-network counts for every network the caller can see.
      - `daemon_count` integer, required — Daemons assigned to this network.
      - `host_count` integer, required — Hosts currently discovered on this network.
      - `id` string, uuid, required — Server-assigned unique identifier.
      - `name` string, required — Name of the network.
      - `service_count` integer, required — Services currently discovered on this network.
      - `subnet_count` integer, required — Subnets currently known on this network.
    - `plan_usage` PlanUsage, required — Plan usage limits and current counts
      - `host_count` integer, required — Hosts currently counted against the plan.
      - `host_limit` integer, nullable — Hosts included in the current plan. `null` when unlimited.
      - `network_count` integer, required — Networks currently counted against the plan.
      - `network_limit` integer, nullable — Networks included in the current plan. `null` when unlimited.
      - `seat_count` integer, required — Seats currently in use.
      - `seat_limit` integer, nullable — Seats included in the current plan. `null` when unlimited.
    - `recent_discoveries` Discovery[], required — The most recent discovery runs, newest first.
      - `daemon_id` string, uuid, required — The daemon this entity refers to.
      - `discovery_type` union, required
        - object
          - `host_id` string, uuid, required — The host the daemon is running on.
          - `type` 'SelfReport', required
        - object
          - `host_naming_fallback` 'Ip' | 'BestService', required
          - `snmp_credentials` object — SNMP credentials for querying devices during discovery Server builds this mapping before initiating discovery
          - `subnet_ids` string[], nullable, required — Subnets to sweep. `null` sweeps every subnet on the network.
          - `type` 'Network', required
        - object
          - `host_id` string, uuid, required — The host the daemon is running on.
          - `host_naming_fallback` 'Ip' | 'BestService', required
          - `type` 'Docker', required
        - object — A one-shot verification of a single host: re-check the addresses and ports already recorded for it, rather than sweeping a subnet. Created by the server only (never via the API) and deleted once its session reaches a terminal phase, so it is not a discovery configuration anyone owns or sees in their scan list.
          - `host_id` string, uuid, required — ID of the host that the daemon is running on — same meaning as every other variant. The host being rescanned is `target_host_id`.
          - `ips` string[], required — Addresses to scan on that host.
          - `ports` PortType[] — Ports already known on that host, re-checked to confirm they are still open. Scanned in addition to the standard discovery set, so a rescan also surfaces newly-opened services.
            - `number` integer, required — TCP or UDP port number
            - `protocol` 'Udp' | 'Tcp', required — Transport protocol the port is open on.
            - `type` 'Ssh' | 'Telnet' | 'DnsUdp' | 'DnsTcp' | 'Samba' | 'Nfs' | 'Ftp' | 'Ipp' | 'LdpTcp' | 'LdpUdp' | 'Ldap' | 'Ldaps' | 'Kerberos' | 'Snmp' | 'SnmpAlt' | 'Rdp' | 'Ntp' | 'Sip' | 'SipTls' | 'Rtsp' | 'Dhcp' | 'Http' | 'MySql' | 'PostgreSQL' | 'MongoDB' | 'Redis' | 'MsSql' | 'Docker' | 'DockerTls' | 'Kubernetes' | 'RabbitMqMgmt' | 'Cassandra' | 'Elasticsearch' | 'InfluxDb' | 'CouchDb' | 'Kafka' | 'Http3000' | 'Http5000' | 'Http8080' | 'Http8081' | 'Http8082' | 'Http8888' | 'Http9000' | 'Https' | 'Https8443' | 'Https9443' | 'Https10443' | 'Mqtt' | 'MqttTls' | 'AMQP' | 'AMQPTls' | 'Wireguard' | 'OpenVPN' | 'BACnet' | 'JetDirect' | 'Custom' — Well-known port identifier. Auto-derived from number+protocol, so it is optional on create.
          - `settings` RescanSettings — Scan settings that apply to a single-host rescan. Deliberately narrower than [`ScanSettings`]: a rescan verifies a known host against a known port set, so the full-scan mechanism (`is_full_scan`, `full_scan_interval`) must not be expressible — promoting a rescan to a 65,535-port sweep defeats the feature. The remaining omissions are settings that cannot bind on a one-or-two address target.
            - `arp_retries` integer, nullable — ARP retry rounds. Matters more here than in a sweep: for a rescan, "did it answer" is the entire answer, so a missed round reads as a dead host.
            - `port_scan_batch_size` integer, nullable — Ports scanned concurrently per host.
            - `probe_raw_socket_ports` boolean — Whether to probe raw-socket ports 9100-9107. Correctness-affecting: with this off the scanner drops those ports from its results, so a printer's known JetDirect port would look like it had disappeared.
            - `scan_rate_pps` integer, nullable — Port scan probes per second. Operators lower this for fragile devices or noisy IDS, and a rescan must respect that as much as a discovery does.
            - `use_npcap_arp` boolean — On Windows, use Npcap broadcast ARP instead of SendARP.
          - `target_host_id` string, uuid, required — The host being rescanned.
          - `type` 'Rescan', required
        - object
          - `host_id` string, uuid, required — ID of the host that the daemon is running on
          - `host_naming_fallback` 'Ip' | 'BestService', required
          - `scan_settings` ScanSettings — Scan performance settings. Lives on the discovery entity. Numeric fields are `Option<T>` — `None` means "use daemon default". The daemon unwraps with defaults at point of use.
            - `arp_rate_pps` integer, nullable — ARP packets per second (default: 50)
            - `arp_retries` integer, nullable — ARP retry rounds for non-responsive targets (default: 2 = 3 total attempts)
            - `arp_scan_cutoff` integer, nullable — ARP scan cutoff prefix. Interfaced subnets larger than this prefix are truncated to this many IPs. Default: 15 (= /15, ~131K IPs). Lower values scan more IPs — increase arp_rate_pps accordingly.
            - `full_scan_interval` integer, nullable — Run a full 65k port scan every N scans. Other scans use a light port set. Default: 3. Value of 0 means never full scan. Value of 1 means every scan is full.
            - `is_full_scan` boolean — Whether this specific scan run should do a full 65k port scan. Set by the server before dispatching to the daemon — not user-configurable.
            - `max_discovery_duration` integer, nullable — Hard ceiling on how long a single discovery run may take, in seconds (default: 21600 = 6h). When hit, the run force-completes and any hosts still queued are left un-scanned until the next run. Raise this for very large networks that legitimately need more than the default window.
            - `port_scan_batch_size` integer, nullable — Ports scanned concurrently per host (default: 200, clamped 16-1000)
            - `probe_raw_socket_ports` boolean — Whether to probe raw-socket ports 9100-9107 (default: false). Disabled by default to prevent ghost printing on JetDirect printers.
            - `scan_rate_pps` integer, nullable — Port scan probes per second (default: 500)
            - `use_npcap_arp` boolean — On Windows, use Npcap broadcast ARP instead of SendARP (default: false)
          - `subnet_ids` string[], nullable, required — Subnets to scan. None = scan all interfaced subnets.
          - `type` 'Unified', required
      - `name` string, required — Human-facing name for this discovery.
      - `network_id` string, uuid, required — The network this entity belongs to.
      - `run_type` union, required
        - object
          - `cron_schedule` string, required — Cron expression deciding when the scan runs.
          - `enabled` boolean, required — Whether the schedule is active.
          - `last_run` string, date-time, nullable — When the scan last ran.
          - `timezone` string, nullable — IANA timezone for cron evaluation, e.g. "America/New_York". None = UTC.
          - `type` 'Scheduled', required
        - object — Historical discovery runs are created by the server and cannot be submitted via API
          - `results` DiscoveryUpdatePayload, required — Progress update from daemon to server during discovery
            - `daemon_id` string, uuid, required — The daemon this entity refers to.
            - `discovery_id` string, uuid, nullable — The discovery configuration this session belongs to. Always enriched server-side; daemons do not send this field.
            - `discovery_type` union, required
              - …
            - `error` string, nullable — Failure message, when the run did not complete.
            - `estimated_remaining_secs` integer, nullable — Rough estimate of the time left, in seconds.
            - `finished_at` string, date-time, nullable — When the run finished. `null` while it is still going.
            - `hosts_discovered` integer, nullable — Hosts found so far.
            - `network_id` string, uuid, required — The network this entity belongs to.
            - `phase` 'AwaitingSnapshot' | 'Queued' | 'Pending' | 'Starting' | 'Started' | 'Scanning' | 'Complete' | 'Failed' | 'Cancelled', required
            - `progress` integer, required — Completion of the current phase, from 0 to 1.
            - `scanned` ScannedEntityIds — Canonical IDs of entities scanned in a discovery session. Populated daemon-side at terminal phase from `EntityBuffer`'s `Created` entries. Travels with the terminal `DiscoveryUpdatePayload` to the server, rides the in-memory `EntityOperation::Created` event published for the historical Discovery row (the event scope carries `Entity::Discovery` with the full struct, including `run_type::Historical { results }`), then is stripped before persisting into the historical Discovery row's JSONB (see the `SqlValue::RunType` bind_value handler in `backend/src/server/shared/storage/generic.rs`). Per-entity-service subscribers extract `results.scanned` from the in-memory event and call `DiscoveryFkUpdater::update_discovery_fks` to backfill `last_discovery_id` / `first_discovery_id` on the matched rows. Naming: `scanned_*` because the daemon scans entities — some submissions match existing rows (refresh), others insert new rows. Both populate the EntityBuffer with canonical (server-assigned) IDs.
              - …
            - `session_id` string, uuid, required — The discovery run this update belongs to.
            - `started_at` string, date-time, nullable — When the run started.
            - `warnings` string[] — Non-fatal warnings for a completed run (e.g. the scan hit its time limit and left hosts un-scanned). Unlike `error`, these do not mark the run failed.
          - `type` 'Historical', required
        - object
          - `last_run` string, date-time, nullable — When the scan last ran.
          - `type` 'AdHoc', required
      - `tags` string[], required — Tags assigned to this entity.
      - `created_at` string, date-time, required — When this record was first created.
      - `force_full_scan` boolean — When true, the next scan will be a full port scan regardless of interval
      - `id` string, uuid, required — Server-assigned unique identifier.
      - `integration_targets` IntegrationTarget[], required — Per-daemon integration targeting: which integrations run on this daemon, and on which IPs. Delivered via the init command at registration and editable via the discovery modal. This is the single home for cred↔IP targeting; it replaces the global `credential.target_ips` (race-prone, consumed once). One-shot: a target is offered to the daemon until a scan completes successfully, then dropped by [`Discovery::apply_successful_scan`]. Credentials that earned a durable home during the scan keep being retried from there — `host_credentials` for one that probed successfully, `network_credentials` for a broadcast one (see [`Discovery::take_network_scope_credential_ids`]).
        - union — Per-daemon integration targeting, stored on the `Discovery` entity and delivered via the init command at registration. Each entry references exactly one stored credential and says where it applies on this daemon. This is the single home for cred↔IP targeting — it replaces the global, race-prone `credential.target_ips`. The variants ARE the scopes; their strum [`Target`] discriminants are the capability enum that `CredentialType::targets()` returns and validates against (single source of truth). Every target carries a real `credential_id` — there is no credential-less branch and no nil sentinel; a local socket is just a credential whose type targets only the daemon host.
          - object — The daemon's own host — realized as a 127.0.0.1 IP-override (e.g. a local Docker/Podman socket, or any credential the user pins to the daemon host without naming its IP).
            - `credential_id` string, uuid, required — Credential to use on the daemon host.
            - `scope` 'DaemonHost', required
          - object — All hosts on the network — a broadcast default credential.
            - `credential_id` string, uuid, required — Credential to use across the network.
            - `scope` 'Network', required
          - object — Specific host IPs — one IP-override per address.
            - `credential_id` string, uuid, required — Credential to use on the listed addresses.
            - `ips` string[], required — The host addresses this credential applies to.
            - `scope` 'Hosts', required
      - `scan_count` integer — Number of completed scans (incremented by server on session completion)
      - `updated_at` string, date-time, required — When this record was last modified.
  - `error` string, nullable — Human-readable failure message. Omitted on success.
  - `meta` ApiMeta, required — API metadata included in all responses
    - `api_version` integer, required — API version (integer, increments on breaking changes)
    - `server_version` string, required — Server version (semver)
  - `success` boolean, required — `true` when the request succeeded. `false` responses carry `error` instead of `data`.

---

[API](https://skmtc.net/scanopy/apis/scanopy-api.md) · [All operations](https://skmtc.net/scanopy/apis/scanopy-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/scanopy/scanopy-api/revisions/2df1fc47dfa7/schema)
