---
title: "List Site Summaries"
method: GET
path: "/site-summaries"
tags: ["site summaries"]
---

# List Site Summaries

`GET /site-summaries`

## Request

- Base URL: `https://api.verdun.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.verdun.ai/site-summaries`
- Auth: HTTP bearer

One date's summaries across the caller's in-scope sites.

`date=today` returns the computed "today so far" view (counts and
escalations only, capped — see the service). Any other value is a
site-local calendar date and returns stored rows plus a stub for any date a
stretched window swallowed.

## Query parameters

- `date` string: Site-local YYYY-MM-DD, or 'today' for the live view.
- `parent_id` string, uuid, nullable
- `account_id` string, uuid, nullable
- `site_ids` string[], nullable

## Response `200`

Successful Response

- GetSiteSummariesResponse
  - `date` string, required: The date this response is about: YYYY-MM-DD, or the literal 'today' for the live view.
  - `live` boolean, required: True when every item is a computed 'today so far' row.
  - `live_partial` boolean, required: True when the live view was capped and some in-scope sites are missing from `items`. Always false for a stored date.
  - `live_cap` integer, required: How many sites the live 'today so far' view computes before it stops and sets `live_partial`. Reported on every response, stored dates included, so a client can say 'showing the first N' without hardcoding the number.
  - `view` string, required: 'customer' when the caller is a customer-side login (account manager / location manager) and the facts are projected, 'internal' otherwise.
  - `items` SiteSummaryListItem[], required: One row per in-scope site that has something to say for the date; sites with neither a summary nor a merged stub are omitted.
    - `site_id` string, required: Site UUID.
    - `site_name` string, required: Site name as it is TODAY (live, not the summary's snapshot) — this is where the row renders in the tab's grouping.
    - `parent_id` string, required: Parent (dealer) UUID, live.
    - `parent_name` string, required: Parent company name, live.
    - `account_id` string, nullable: Account UUID, live; null for a site held directly under the parent.
    - `account_name` string, nullable: Account name, live; null for a direct site.
    - `account_id_at_generation` string, nullable: Account UUID SNAPSHOTTED on the summary row at generation. Group historical rows by this; group today's site by `account_id`. Null on a live row, a stub, or a summary generated while the site was held directly under its parent.
    - `account_name_at_generation` string, nullable: Account name as it was at generation, from the stored fact sheet — the only place it survives an account rename or retirement.
    - `local_date` string, required: YYYY-MM-DD, site-local. The requested date for a stored row or a merged stub; today's site-local date for a live row.
    - `stored` boolean, required: True when this row is a persisted summary. False for both the live view and a merged stub.
    - `live` boolean: True for a 'today so far' row computed on read and never persisted.
    - `merged_into` string, nullable: Set only on a stub: the local_date of the summary whose stretched window swallowed the requested date. The tab renders 'included in <that date>'s summary'.
    - `id` string, nullable: Summary UUID; null on a live row and on a merged stub, neither of which is addressable.
    - `narrative_source` string, nullable: 'llm' or 'template' on a stored row; null otherwise. A live row has no narrative at all.
    - `generated_at` string, date-time, nullable: When the stored summary finished generating (UTC); null on a live row or a stub.
    - `counts` object, nullable: The sheet's ten counts. Present on stored and live rows, null on a stub. Typed loosely because the counts block is the versioned fact-sheet contract, not this endpoint's own shape.
    - `escalations` object[]: Escalation entries. Populated ONLY on a live row (which has no detail endpoint); always empty on a stored row, where GET /site-summaries/{id} serves them. Projected for a customer-side reader.
    - `escalation_count` integer: How many escalations the row has, on both stored and live rows.
    - `outage_count` integer: How many outages the row has. ALWAYS 0 on a live row — the outage scan is skipped there, so read this as 'not measured' rather than 'none' whenever `live` is true.
    - `partial` boolean: True when the stored sheet was written from a failed fact build; the card should say so rather than imply a quiet night.
    - `email_enabled` boolean: Whether the site is on the automatic daily e-mail RIGHT NOW (its current settings, or the default when it has none) - on every reading, stubs included. Not a record of whether this stored day was sent; the sends endpoint answers that.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/verdun/apis/verdun-api.md) - [All operations](https://skmtc.dev/verdun/apis/verdun-api/llms.txt) - [OpenAPI document](https://skmtc.dev/verdun/apis/verdun-api/revisions/35a2a6ebedda?raw)
