Snapshots
A snapshot is the structured output of one scan: the items found, cross-item trends, an executive summary and narrative, and — when a prior comparable snapshot exists — an overlay of what changed. The product-side explanation is at scans and snapshots.
| Endpoint | Purpose |
|---|---|
GET /v1/snapshots | List with filters and paging |
GET /v1/snapshots/{id} | Full envelope |
GET /v1/snapshots/{id}/items | Items only |
GET /v1/snapshots/{id}/trends | Trends only |
GET /v1/snapshots/{id}/executive-summary | Summary block only |
GET /v1/snapshots/{id}/executive-narrative | Narrative prose, with ?language= |
GET /v1/snapshots/{id}/drift | Changes overlay |
GET /v1/snapshots/{id}/briefing | Sub-editor briefing block |
All snapshot endpoints are bearer-authenticated reads (60/min bucket). An id that does not exist or belongs to another account returns 404 not_found.
The envelope
The data object of a snapshot has this top-level shape:
items[] regulatory items — the core payload
trends[] cross-item trends
executive_summary { bottom_line, priorities[] }
executive_narrative prose written for an executive reader (optional)
_briefing sub-editor editorial block (optional; see below)
driftOverlay changes vs a prior snapshot (optional; see below)
translations { "<lang>": { executive_narrative, … } } (optional)
_meta { engine, model, searches, estimatedCost, inputFingerprint, … }Each item carries at minimum a jurisdiction and an area; typical items also have title, source, impact (High | Medium | Low), likelihood (Confirmed | Likely | Possible), date, and summary. Additional fields may appear over time — treat the envelope as open.
The _briefing block
_briefing is the sub-editor’s output — the editorial furniture the product’s Briefing tab renders around the narrative. Seven documented fields:
| Field | Contents |
|---|---|
briefing_headline | Editorial headline for the briefing, six words or fewer, in the register of a broadsheet analysis piece. |
briefing_standfirst | One orienting sentence standing under the headline: what the briefing covers and why it matters now. |
priorities[] | One entry per executive_summary.priorities entry, in the same order. Each is { short_label, tags } — a 2–3-word contents-list label and a "JURISDICTION · INSTRUMENT" tag (e.g. "EU · MiCA"). |
bottom_line_tight | The briefing’s “so what” in one or two sentences — a fresh closing line, not a truncation of executive_summary.bottom_line. |
pull_quote | A two-sentence executive pull quote (~40 words) sharpening one specific point from the narrative body, with one key number or date. |
sentiment_label | One-word posture label: Tightening, Stable, Easing, Mixed, or Volatile. |
sentiment_rationale | One sentence (30 words at most) explaining the sentiment label. |
Fields are validated independently after generation: a field that fails validation is absent, not null — treat every field as optional, and the whole block as optional on older snapshots and engine paths that skip the sub-editor.
List snapshots
GET /v1/snapshots
| Query parameter | Type | Default | Notes |
|---|---|---|---|
limit | integer | 50 | 1–100. |
offset | integer | 0 | Offset paging; pagination.total gives the full count. |
from / to | ISO 8601 date-time | — | Filter on creation time. |
jurisdiction | string | — | Exact match against any item’s jurisdiction. |
area | string | — | Exact match against any item’s area. |
Snapshot starring is retired: there is no starred filter, and sending one is rejected with 422 and code unknown_parameter rather than silently returning the unfiltered list.
curl "https://api.regsn.app/v1/snapshots?jurisdiction=UK&from=2026-06-01T00:00:00Z&limit=10" \
-H "Authorization: Bearer $REGSN_API_KEY"200:
{
"data": [
{
"id": "a1b2…",
"title": "UK · EU — AML / KYC (12m)",
"created_at": "2026-07-20T09:14:11.000Z",
"cost_cents": 55,
"actual_cost_cents": 61.4,
"item_count": 18,
"trend_count": 4,
"jurisdiction_count": 2
}
],
"pagination": { "limit": 10, "offset": 0, "total": 37 }
}List rows are summaries — counts, not content. Fetch the id for the envelope.
Retrieve a snapshot
GET /v1/snapshots/{id}
curl https://api.regsn.app/v1/snapshots/a1b2… \
-H "Authorization: Bearer $REGSN_API_KEY"200:
{
"id": "a1b2…",
"title": "UK · EU — AML / KYC (12m)",
"config": { "jurisdictions": ["UK", "EU"], "areas": ["AML / KYC"], "horizon": 12 },
"data": {
"items": ["…"],
"trends": ["…"],
"executive_summary": { "bottom_line": "…", "priorities": ["…"] },
"executive_narrative": "Over the next twelve months…",
"_meta": { "engine": "v4", "model": "…" }
},
"cost_cents": 61.4,
"created_at": "2026-07-20T09:14:11.000Z"
}| Field | Notes |
|---|---|
config | The scan configuration that produced this snapshot. |
data | The envelope, verbatim. |
cost_cents | Actual cost where known, otherwise the pre-scan estimate. US cents; may carry fractions of a cent (61.4). |
Sub-resources
Three sub-resources project a single key out of the envelope, so you can fetch just what you need instead of the whole document:
| Endpoint | Returns |
|---|---|
GET /v1/snapshots/{id}/items | { "data": [ …items ] } |
GET /v1/snapshots/{id}/trends | { "data": [ …trends ] } |
GET /v1/snapshots/{id}/executive-summary | { "data": { "bottom_line": "…", "priorities": ["…"] } } — { "data": null } if the snapshot has none |
curl https://api.regsn.app/v1/snapshots/a1b2…/items \
-H "Authorization: Bearer $REGSN_API_KEY"Executive narrative
GET /v1/snapshots/{id}/executive-narrative
| Query parameter | Default | Notes |
|---|---|---|
language | en | en returns the original narrative. Any other code (fr, de, es, it, zh, ja, pt) returns the matching translation if the scan was configured with translationLanguages. |
curl "https://api.regsn.app/v1/snapshots/a1b2…/executive-narrative?language=fr" \
-H "Authorization: Bearer $REGSN_API_KEY"200:
{ "executive_narrative": "Au cours des douze prochains mois…", "language": "fr" }Status · code | When |
|---|---|
404 not_found | The snapshot has no narrative (language=en), or the id does not exist. |
404 translation_not_available | No translation exists for the requested non-English language. |
Changes overlay (/drift)
GET /v1/snapshots/{id}/drift returns the snapshot’s driftOverlay — the scan-time comparison recorded when the snapshot was created: what moved between this snapshot and the prior comparable one. The product’s Change Monitor card is a richer, recomputed-on-read view of the same question. The field keeps its original name on the wire for stability.
curl https://api.regsn.app/v1/snapshots/a1b2…/drift \
-H "Authorization: Bearer $REGSN_API_KEY"200 — the overlay object, verbatim. When the snapshot has no comparison (for example, the first scan of a given configuration):
{ "available": false }The overlay is only present when an earlier snapshot with a comparable configuration existed at scan time. Treat { "available": false } as the normal first-run case, not an error.
The briefing sub-resource
GET /v1/snapshots/{id}/briefing returns the _briefing block
without fetching the whole envelope.
curl https://api.regsn.app/v1/snapshots/a1b2…/briefing \
-H "Authorization: Bearer $REGSN_API_KEY"200 — { "available": true } plus the briefing fields:
{
"available": true,
"briefing_headline": "The grace period is over",
"pull_quote": "…",
"sentiment_label": "Tightening",
"sentiment_rationale": "…"
}Snapshots that predate the sub-editor, or whose pass produced no valid fields,
return the same shape as /drift’s first-run case:
{ "available": false }{ "available": false } is a routine state on older snapshots, not an error —
404 is reserved for the snapshot itself being missing. Individual fields are
validated independently and may be absent even when available is true.
See also
- Scans — how snapshots get made.
- Exports — turn a snapshot into a PDF, deck, infographic, or audio briefing.
- Changes between scans — the product-side view of the overlay.