---
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
      - `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.
      - `capabilities` DaemonCapabilities, required — Daemon capabilities
        - `has_docker_socket` boolean
        - `interfaced_subnet_ids` string[], required
      - `host_id` string, uuid, required
      - `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
      - `network_id` string, uuid, required
      - `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
      - `url` string, required
      - `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
      - `id` string, uuid, required
      - `updated_at` string, date-time, required
      - `version_status` DaemonVersionStatus, required — Daemon version status including health and any warnings
        - `has_correct_docker_volume_mount` boolean
        - `status` 'Current' | 'Outdated' | 'Deprecated', required — Health status for daemon versions
        - `supports_unified_discovery` boolean
        - `version` string, nullable
        - `warnings` DeprecationWarning[]
          - `message` string, required
          - `severity` 'Info' | 'Warning' | 'Critical', required — Severity level for deprecation warnings
          - `sunset_date` string, nullable
    - `networks` NetworkSummary[], required
      - `daemon_count` integer, required
      - `host_count` integer, required
      - `id` string, uuid, required
      - `name` string, required
      - `service_count` integer, required
      - `subnet_count` integer, required
    - `plan_usage` PlanUsage, required — Plan usage limits and current counts
      - `host_count` integer, required
      - `host_limit` integer, nullable
      - `network_count` integer, required
      - `network_limit` integer, nullable
      - `seat_count` integer, required
      - `seat_limit` integer, nullable
    - `recent_discoveries` Discovery[], required
      - `daemon_id` string, uuid, required
      - `discovery_type` union, required
        - object
          - `host_id` string, uuid, required
          - `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
          - `type` 'Network', required
        - object
          - `host_id` string, uuid, required
          - `host_naming_fallback` 'Ip' | 'BestService', required
          - `type` 'Docker', 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.
            - `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
      - `network_id` string, uuid, required
      - `run_type` union, required
        - object
          - `cron_schedule` string, required
          - `enabled` boolean, required
          - `last_run` string, date-time, nullable
          - `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
            - `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
            - `estimated_remaining_secs` integer, nullable
            - `finished_at` string, date-time, nullable
            - `hosts_discovered` integer, nullable
            - `network_id` string, uuid, required
            - `phase` 'AwaitingSnapshot' | 'Queued' | 'Pending' | 'Starting' | 'Started' | 'Scanning' | 'Complete' | 'Failed' | 'Cancelled', required
            - `progress` integer, required
            - `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
            - `started_at` string, date-time, nullable
          - `type` 'Historical', required
        - object
          - `last_run` string, date-time, nullable
          - `type` 'AdHoc', required
      - `tags` string[], required
      - `created_at` string, date-time, required
      - `force_full_scan` boolean — When true, the next scan will be a full port scan regardless of interval
      - `id` string, uuid, required
      - `pending_credential_ids` string[] — Credential IDs to include in the next scan's credential_mappings. Set by the discovery edit modal, cleared after each scan completes.
      - `scan_count` integer — Number of completed scans (incremented by server on session completion)
      - `updated_at` string, date-time, required
  - `error` string, nullable
  - `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

## Changes

- **2026-06-11** `3152cf58226a` — 1 breaking
  - removed the required property `data/plan_usage/snapshot_retention_days` from the response with the `200` status
- **2026-06-11** `5f1208d6d875` — 1 info
  - added the required property `data/plan_usage/snapshot_retention_days` to the response with the `200` status
- **2026-06-10** `0cfafb919a99` — 1 breaking
  - removed the required property `data/plan_usage/snapshot_retention_days` from the response with the `200` status
- **2026-05-03** `d38c20597ec1` — 1 warning, 2 info
  - added the new `AwaitingSnapshot` enum value to the `data/recent_discoveries/items/allOf[#/components/schemas/DiscoveryBase]/run_type/oneOf[subschema #2: Historical]/results/phase` response property for the response status `200`
  - added the optional property `data/recent_discoveries/items/allOf[#/components/schemas/DiscoveryBase]/run_type/oneOf[subschema #2: Historical]/results/scanned` to the response with the `200` status
  - added the required property `data/plan_usage/snapshot_retention_days` to the response with the `200` status
- …earlier changes not shown

[Full history](https://skmtc.dev/scanopy/apis/scanopy-api/changes/api/v1/dashboard/summary/get.md)

---

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