{"about": "Content Exchange MCR dashboard. JSON API; times are UTC ISO-8601. Auth: Bearer token (services) or HTTP Basic (people). The same reads and writes are MCP tools at POST /mcp (JSON-RPC 2.0, Streamable HTTP, JSON responses).", "read": {"GET api/summary?hours=24": "KPI counts for the window: alarms started by family, incidents by routing, noisiest objects", "GET api/incidents?days=7&status=open|cleared&q=&min_duration_s=&posted=1": "the MCR watcher's incidents, one row per occurrence, with routing (posted, held, short, auto)", "GET api/alarms?hours=24&family=outage,content&object=&code=&open=1&min_duration_s=&include_mirrors=1": "alarm episodes (one alarm on one object, raise to clear)", "GET api/events?hours=6&object=&event_type=&code=&q=": "raw ZEN Master events", "GET api/timeseries?days=7&bucket=hour|day&family=": "alarm starts per bucket by family", "GET api/timeline?hours=24&family=&q=&parent=&order=impaired|hits&limit=40": "swimlanes: the most impaired objects and their alarms", "GET api/heatmap?days=28&kind=weekday_hour|date_hour|minute_hour&object=&family=": "when hits start", "GET api/board?hours=24&q=&all=1": "the penalty box: one card per incident, red while open, green once recovered, with a 24-cell strip; a red card carries zm, its alarms in ZEN Master's words, and level (warning: only warnings open on it, shown amber; else error)", "GET api/broadcasters?hours=24": "the account's broadcasters: CPU, GPU (a node with one), RAM and disk used now, the window's highest, a sparkline each", "GET api/broadcasters/<id or name>?hours=24": "one broadcaster's CPU, GPU, RAM and disk over the window, for its charts", "GET api/connections?at=": "the Tata Dish page's live view: per Dish site, whether the Video Connect fibre and DIA paths are down now (or at `at`), since when and why, its three broadcasters with the inputs out on each, and the board's cards there", "GET api/board/charts?hours=24&all=1": "the board's charts: red at once and posts to Slack, incidents opened per bucket by outcome, where they went, alarm starts by family, the objects with the most alarms, hits per hour over 7 days", "GET api/masks": "the active masks, the choices of minutes, and the 20 that ended last", "GET api/live/<object_key or name>[?check=1]": "the live stream for the source the object shows: play_url (this server's relay of its Broadcaster's HTTP output) and its ZEN Master page; check=1 tries the Broadcaster now and says why it would refuse", "GET api/live/<object_key or name>/stream.ts": "the stream itself, relayed from http://<the source's active broadcaster>:7777/<stream ID>.ts (raw MPEG-TS); test is the stream set in data/live.json", "GET api/thumb/<object_key or name>?fresh=&age=": "the object's picture from ZEN Master (its source's, for a target), a JPEG kept 5 min (1 min with fresh=1, the Refresh button; age=<seconds>, at least 3, for a red tile or the side panel); 204 with X-Thumb-Why when there is none (kept 30 s at least)", "GET api/card/<incident key or object>?days=30": "one card's history: occurrences, red minutes per day, timeline, heatmap, durations, findings", "GET api/objects?days=7&q=": "objects with alarm counts", "GET api/objects/<object_key or name>?days=28": "one object: alarms, incidents, notes, patterns, pattern candidates, partner leg", "GET api/patterns/detect?days=28&family=&object=": "computed pattern candidates with evidence (not verdicts)", "GET api/patterns?status=active": "the pattern registry", "GET api/notes?target=&since=": "notes", "GET api/reports?limit=30 | api/reports/latest | api/reports/<id or YYYY-MM-DD>": "daily pattern reports", "GET api/agent/digest?days=28": "everything the daily pattern run needs in one compact read", "GET api/me": "who this request is signed in as, and how (token, sso, basic)"}, "write": {"POST api/notes {target_type, target, body, ts_from, ts_to, tags}": "add a note (editor)", "PATCH api/notes/<id> {body, tags, deleted}": "edit or delete a note (editor)", "POST api/patterns {slug, title, kind, objects, schedule, description, status, evidence, last_seen}": "create or update a pattern by slug (editor)", "PATCH api/patterns/<id> {...}": "update a pattern (editor)", "PATCH api/incidents/<id or key> {severity, title, agent_note}": "annotate an incident (editor)", "POST api/remove {keys, reason, undo}": "take the red cards with these keys off the penalty box until they recover (or put them back); anyone signed in, not a token", "POST api/masks {object, code, minutes, reason}": "mask an object, or one alarm code on it, for 60, 240, 1440 or 10080 minutes (at most 7 days); it ends by itself; anyone signed in, not a token. The watcher keeps a masked incident away from Slack", "POST api/masks/<id>/end": "end a mask now; anyone signed in", "POST api/ack {keys, undo}": "acknowledge the red cards with these keys (their open occurrences), or undo that; anyone signed in, not a token; an undo needs the acknowledger or an editor", "POST api/reports {day, title, body_md, findings, slack_ts}": "create or update the day's report (agent)", "POST api/agent/batch {ops: [{op: note|note_edit|pattern|report|incident, ...}]}": "several writes at once (agent)", "POST api/ingest {events, closures, incidents, watcher, defer, broadcasters, bx_samples}": "the MCR watcher's feed (ingest); defer=true stores only (backfill); broadcasters: the live health read, bx_samples: health history", "POST api/admin/rebuild": "re-derive every alarm from the stored events (ingest), after a backfill"}}