---
title: "Get Site Summary"
method: GET
path: "/site-summaries/{summary_id}"
tags: ["site summaries"]
---

# Get Site Summary

`GET /site-summaries/{summary_id}`

## 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/{summary_id}`
- Auth: HTTP bearer

One summary in full: facts, inclusions, current settings, and who a send
would reach. A customer-side login gets the customer projection and no
grounding block; `view` says which.

## Path parameters

- `summary_id` string, uuid, required

## Response `200`

Successful Response

- GetSiteSummaryResponse
  - `id` string, required: Summary UUID.
  - `site_id` string, required: Site UUID.
  - `site_name` string, required: Site name as it is today (live), for the drawer header.
  - `parent_id` string, required: Parent UUID SNAPSHOTTED on the summary row, not the site's parent today.
  - `account_id` string, nullable: Account UUID snapshotted on the summary row; null when the site was held directly under the parent at generation.
  - `local_date` string, required: YYYY-MM-DD, site-local, the date this summary is filed under.
  - `timezone` string, required: IANA zone snapshotted at generation; every wall clock in `facts` is rendered in it.
  - `window_start` string, date-time, required: First instant the summary covers (UTC, inclusive).
  - `window_end` string, date-time, required: Instant the window closed (UTC, exclusive).
  - `narrative` string, required: The prose the e-mail carries.
  - `narrative_source` string, required: 'llm' when the model's narrative passed grounding, 'template' when the deterministic floor was used.
  - `grounding` object, nullable: The grounding verdict (checked, mismatches, prompt_version, model, reason). NULL for a customer-side reader: mismatches quote a rejected narrative's tokens.
  - `facts` object, required: The stored fact sheet. Full for an internal reader; the customer projection (seven paths dropped) for a customer-side login (account manager / location manager) — read `view` to know which.
  - `inclusions` string[], required: Event ids ticked INTO the customer e-mail beyond the escalations, in insertion order.
  - `settings` GetSiteSummarySettingsResponse, required
    - `site_id` string, required: Site UUID these settings belong to.
    - `email_enabled` boolean, required: Whether the daily e-mail is sent for this site at all. Defaults to false — a site opts in.
    - `send_local_time` string, required: 24h HH:MM wall clock in the site's timezone. The noon pivot reads off it: a morning send closes last night, an evening send closes today.
    - `send_on_quiet_days` boolean, required: Send even when nothing happened. False skips the mail and records a skipped_quiet send row.
    - `min_outage_minutes` integer, required: Shortest camera outage worth reporting, in minutes. Quantised to 5-minute telemetry buckets downstream, so the rendered value reads 'about N min'.
    - `sections` object, required: Which of the four e-mail sections render: narrative, stats, escalations, outages. Always all four keys.
    - `is_default` boolean, required: True when NO settings row exists and these are the defaults. A row that happens to equal the defaults reads false.
  - `recipients_preview` SiteSummaryRecipient[], required: Who a send would reach right now, per site contact, with the reason for each exclusion.
    - `contact_id` string, required: Site contact UUID.
    - `name` string, required: Contact's full name as stored on the site contact.
    - `email` string, required: Contact's e-mail, whitespace-trimmed; may be empty when none is recorded.
    - `receives` boolean, required: Whether a send would actually mail this contact: a usable address AND no opt-out.
    - `reason` string, required: Why not, or 'ok': 'ok' | 'no_email' | 'opted_out'. An unusable address wins over an opt-out.
    - `has_login` boolean, required: A customer-side login exists with this e-mail whose grant covers the site — an account manager through the site's account, or a location manager through the site itself — i.e. the 'View event' links will work for them. Never gates delivery.
    - `opted_out` boolean, required: The contact's daily-summary opt-out flag, independent of whether the address is usable.
  - `generated_at` string, date-time, nullable: When generation finished (UTC).
  - `regenerated_at` string, date-time, nullable: When the narrative was last regenerated (UTC); null when it never was.
  - `view` string, required: 'customer' when `facts` is the projection and `grounding` is withheld, 'internal' otherwise.

## 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)
