---
title: Organization summary
description: GET /v1/summary — a one-call snapshot of monitor status counts, host liveness, the fleet health score, active incidents, open maintenance windows and what needs attention, for wallboards, bots and AI agents.
canonical: https://watchfor.io/docs/api/summary
---

# Organization summary

GET /v1/summary — a one-call snapshot of monitor status counts, host liveness, the fleet health score, active incidents, open maintenance windows and what needs attention, for wallboards, bots and AI agents.

| Method | Path | Scope | operationId |
| --- | --- | --- | --- |
| GET | `/v1/summary` | read | `getOrgSummary` |

`GET /v1/summary` answers "how is everything right now?" in one round
trip. It is the recommended first data call for scripts, chat bots,
wallboards and AI agents that would otherwise stitch together several
list calls.

```bash
curl https://watchfor.io/api/v1/summary \
  -H "Authorization: Bearer wf_live_YOUR_KEY"
```

```json
{
  "object": "summary",
  "monitors": {
    "total": 42,
    "up": 39,
    "down": 1,
    "degraded": 1,
    "paused": 1,
    "unknown": 0,
    "active": 41,
    "health_score": 95
  },
  "hosts": { "total": 4, "online": 3, "stale": 1, "offline": 0, "never": 0 },
  "fleet": {
    "health_score": 93,
    "monitors_up": 39,
    "monitors_active": 41,
    "hosts_online": 3,
    "hosts_counted": 4
  },
  "incidents": {
    "firing": 1,
    "firing_critical": 1,
    "firing_warning": 0,
    "acknowledged": 0,
    "started_24h": 3
  },
  "open_maintenance_windows": 0,
  "attention": { "silent_monitors": 0 },
  "expiring": {
    "certificates": { "monitored": 42, "expired": 0, "within_7_days": 1, "within_30_days": 3 },
    "domains": { "monitored": 12, "expired": 0, "within_7_days": 0, "within_30_days": 1 },
    "soonest": [
      {
        "monitor_id": "6f1c…",
        "name": "shop.example.com SSL",
        "kind": "certificate",
        "target": "shop.example.com",
        "expires_at": "2026-10-20T08:00:00.000Z",
        "days_left": 4
      }
    ]
  }
}
```

## Fields

| Field | Meaning |
| --- | --- |
| `monitors.total` | All monitors in the organization |
| `monitors.up` / `degraded` / `down` / `paused` / `unknown` | Counts by **effective** status — the same rule as the dashboard and the `status` field on [`GET /v1/monitors`](/docs/api/monitors) |
| `monitors.active` | The health-score denominator: `up` + `down` + `degraded` (paused and unknown monitors are not judged) |
| `monitors.health_score` | Percentage (0–100) of active monitors (not paused, not unknown) that are up — `degraded` and `down` both count against it; `100` when there are none |
| `hosts.total` / `online` / `stale` / `offline` / `never` | Servers running the agent (revoked ones excluded), by liveness — the same rule as the Hosts page and `status` on [`GET /v1/hosts`](/docs/api/hosts): `online` reporting, `stale` three push intervals missed (at least 90 s) but under 10 min, `offline` longer than that, `never` has not reported yet |
| `fleet.health_score` | The dashboard's hero number — healthy ÷ counted across monitors **and** hosts: `(monitors_up + hosts_online) / (monitors_active + hosts_counted)`, rounded; `100` when nothing is counted. A stale or offline host counts against it; a host that never reported is setup in progress and does not |
| `fleet.monitors_up` / `monitors_active` / `hosts_online` / `hosts_counted` | The terms behind `fleet.health_score`; `hosts_counted` = hosts that have reported at least once (`online + stale + offline`) |
| `incidents.firing` | Open incidents nobody has acknowledged yet, split into `firing_critical` and `firing_warning`. Host incidents (a silent agent, a full disk) count here too, the same as on the dashboard |
| `incidents.acknowledged` | Open incidents someone is handling |
| `incidents.started_24h` | Incidents that started in the last 24 hours, whatever their state now |
| `open_maintenance_windows` | Maintenance windows active at this moment |
| `expiring.certificates` / `expiring.domains` | SSL and domain-expiry (RDAP) monitors with a known expiry: `monitored`, already `expired`, expiring `within_7_days`, and `within_30_days` (7 to 29 days; the buckets don't overlap). One bulk lookup, however many monitors you have; `expiring` is `null` if it can't be read right now |
| `expiring.soonest` | The ten soonest expiries across both kinds, expired first, with `days_left` (negative once expired) |
| `attention.silent_monitors` | Active monitors whose alerts would reach nobody — no alert rule with a contact group and no notification group on the monitor. The dashboard's setup callout; `0` means there is nothing to fix |

**Effective status:** a monitor with an open **Critical** incident —
firing or acknowledged — counts as `down` even if its stored status has
not refreshed yet; an open **Warning** incident, or a failing check with
no confirmed incident (the latest check failed, or any alert rule — status
code, response time, content, assertions — is failing while its
confirmation is in progress), counts as `degraded`; `paused` always wins
because it is explicit operator intent; a brand-new monitor that has not
reported is `unknown` unless an incident is already open. The same rule
drives the `status` filter on [`GET /v1/monitors`](/docs/api/monitors),
so `?status=down` and this summary always agree.

Remember the platform's [status model](/docs/core-concepts#monitor-status):
**Down** means a failure confirmed from several locations (a Critical
incident is open); a failing check or rule only shows as `degraded` and
does not open an incident until it is confirmed.

## Related

- [`GET /v1/incidents/stats`](/docs/api/incidents#incident-statistics) —
  period statistics (totals by severity, MTTR, MTBF, most unstable
  monitors) rather than a live snapshot.
- [`GET /v1/reports`](/docs/api/reports) — the full period-over-period
  report.
- Try it without a key: [`GET /api/v1/sandbox/summary`](https://watchfor.io/api/v1/sandbox/summary).
- MCP tool `get_summary`, A2A skill `check-status`, CLI `watchfor summary`.

---

Canonical page: https://watchfor.io/docs/api/summary · All docs: https://watchfor.io/docs · Site guide: https://watchfor.io/llms.txt
