Bounded spans of related events — list, get, build.

Episodes

Episodes are bounded, sealed spans of causally related events with a started_at / ended_at boundary. Built async by the consolidator; you can also trigger a build.


GET /v1/episodes

Capability: scope.read.local + traversal as appropriate.

GET /v1/episodes
  ?scope=org:acme/dept:eng
  &view=local
  &actor=user:alice
  &overlapping=2026-04-01..2026-05-01
  &with_causal_chain=true
  &limit=50
  &cursor=...

Response

{
  "items": [
    {
      "episode_id":  "ep_01HX...",
      "scope":       "org:acme/dept:eng",
      "title":       "Acme Q3 renewal POC",
      "started_at":  "2026-04-02T09:00:00Z",
      "ended_at":    "2026-04-29T17:00:00Z",
      "actors":      ["user:alice", "user:priya@acme"],
      "event_ids":   ["evt_01HX...", "evt_01HY..."],
      "causal_chain": [
        { "from": "evt_01HX...", "to": "evt_01HY...", "relation": "follows" }
      ],
      "valid_from":    "2026-04-02T09:00:00Z",
      "valid_to":      "2026-04-29T17:00:00Z",
      "recorded_from": "2026-04-02T09:00:12Z",
      "recorded_to":   null
    }
  ],
  "next_cursor": null,
  "has_more": false
}

GET /v1/episodes/

Returns the full episode record (single item from the list response).


POST /v1/episodes/build

Capability: scope.write

Force episode synthesis for a scope (normally runs async via the consolidator).

{ "scope": "org:acme/dept:eng/user:alice" }

Response

{
  "built": 12,
  "items": [ /* Episode records */ ]
}