# Real Signal — example payloads

version 1.0.0 · schemas for these shapes: [/docs/schemas](https://real-signal.ai/docs/schemas)

these are the exact structures the composers emit. values marked *live* change with every reading; fetch the endpoint for the current truth. where production substrate is empty today (zero claimed merchants), the example shows the honest empty state rather than invented data.

## pocket-now — GET /api/pocket-live?pocket=cluny

*live* — a real response with an atmosphere reading in place:

```json
{
  "pocket": "cluny",
  "generated_at": "2026-08-11T06:30:12.000Z",
  "projection_version": "3",
  "atmosphere_latest": {
    "primary_state": "calm",
    "calm": 0.62,
    "stress": 0.18,
    "social_energy": 0.31,
    "productive": 0.44,
    "anomaly_flag": false,
    "captured_at": "2026-08-11T06:15:03.000Z"
  },
  "packages_recent": [],
  "predictions_recent": [],
  "sustainability_recent": [],
  "signal_tier": null,
  "resonance": null,
  "stats": {
    "atmosphere_24h": 96,
    "packages_7d": 0,
    "predictions_revealed_7d": 42,
    "recent_signal_count_60m": 0
  }
}
```

## live-experiences — GET /api/live-experiences?pocket=cluny

the honest production state today (no merchant has accepted a brief yet):

```json
{
  "pocket_id": "cluny",
  "count": 0,
  "experiences": [],
  "atmosphere": { "primary_state": "calm", "calm": 0.62 },
  "confidence": 0.21,
  "confidence_source": "calibrated",
  "generated_at": "2026-08-11T06:30:12.000Z"
}
```

what one experience looks like the moment a merchant accepts (shape from the canonical compose sample):

```json
{
  "id": "8f5b0c2e-0000-4000-8000-000000000001",
  "experience_name": "quiet room access",
  "outlet": { "id": "8f5b0c2e-0000-4000-8000-000000000002", "name": "Example Cafe" },
  "why": {
    "why_now": "calm window observed; calm 0.62; roughly 24 minutes before the reading shifts",
    "why_merchant": "12 outlets observed in this pocket; quiet capacity likely through the current window",
    "why_users": "quiet-afternoon-coffee aligns with the current atmosphere reading",
    "why_pocket": "calm 0.62 preserved; signal saturation 0.10; presence here stays purposeful, not prompted"
  },
  "value": {
    "shape": "access",
    "line": "time-bound access to the quiet room; no price move",
    "offer_price_sgd": null,
    "original_price_sgd": null,
    "inventory_limit": 8
  },
  "window": {
    "start_at": "2026-08-11T06:30:00.000Z",
    "end_at": "2026-08-11T08:30:00.000Z",
    "window_sgt": "14:30–16:30 SGT"
  },
  "window_remaining_minutes": 118,
  "merchant_ready": true,
  "receipts": { "line": "quiet-afternoon-coffee intent: 12 expressions in this pocket this hour" },
  "expires_at": "2026-08-11T08:30:00.000Z"
}
```

## moment-stories — MCP get_live_moment_story

JSON-RPC call:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": { "name": "get_live_moment_story", "arguments": { "pocket_id": "cluny" } }
}
```

structured content of a live story (the shape the moment-story composer writes; null when no moment is worth narrating):

```json
{
  "pocket_id": "cluny",
  "story": {
    "id": "00000000-0000-0000-0000-000000000001",
    "why_now": "calm window observed; calm 0.62; roughly 24 minutes before the reading shifts",
    "why_merchant": "12 outlets observed in this pocket; quiet capacity likely through the current window",
    "why_users": "quiet-afternoon-coffee aligns with the current atmosphere reading",
    "why_pocket": "calm 0.62 preserved; signal saturation 0.10; presence here stays purposeful, not prompted",
    "band": "forming",
    "mqs": 0.41,
    "created_at": "2026-08-11T06:11:00.000Z",
    "expires_at": "2026-08-11T06:41:00.000Z"
  }
}
```

## notification-candidates — GET /api/notification-candidates

the honest production state today (the dispatch ledger fills the moment the machine gates pass a packet):

```json
{
  "window": "1d",
  "candidates": [],
  "counts": { "candidate": 0, "dry_run": 0, "by_pocket": [] },
  "note": "candidate rows cleared every gate but had no consented channel; dry_run rows were handed to a channel held in dry-run by env. this surface reads the ledger and can fire nothing."
}
```

what one candidate looks like when a merchant packet clears every gate with no consented channel:

```json
{
  "packet_type": "merchant_moment_line",
  "pocket_id": "cluny",
  "status": "candidate",
  "channel": null,
  "reason": {
    "why_now": "calm window observed; calm 0.62; roughly 24 minutes before the reading shifts.",
    "why_me": "12 outlets observed in this pocket; quiet capacity likely through the current window.",
    "whats_happening": "a quiet window at cluny.",
    "what_value": "suggested value: no price move; the window itself is the value.",
    "what_can_i_do": "one tap decides: fire, adjust, or ignore; nothing goes live without you.",
    "how_long": "window: 14:30–16:30 sgt; about 24 minutes before the moment shifts."
  },
  "gate": { "pass": true, "note": "gate passed; no consented channel exists yet" },
  "created_at": "2026-08-11T06:17:20.000Z"
}
```

---

every response carries the `_meta` attribution envelope (omitted above for brevity). live vitals: [/status](https://real-signal.ai/status).