---
title: "Drain the workspace's coordination event log"
method: GET
path: "/coord/v1/events"
tags: ["Canon"]
---

# Drain the workspace's coordination event log

`GET /coord/v1/events`

## Request

- Base URL: `https://api.infolang.ai`
- URL: `https://api.infolang.ai/coord/v1/events`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer

Every coordination mutation announces itself here as a compact envelope — pointers, never claim values. **The cursor IS the subscription**: there is no server-side subscriber state; persist the page's `next_cursor` (or any event's own `cursor`) and pass it back to resume exactly after it. `next_cursor` is `null` only when the page was EMPTY — a short page is not the end.

`kind` filters by PREFIX: `claim.` selects the family, `claim.lapsed` exactly one kind. A malformed filter is a 400; a well-formed kind nothing emits yet matches nothing — the vocabulary is open.

Requires the `coord:read` scope on the presented credential. Enforced by Kairos on this surface — the gateway forwards the credential without inspecting it. A credential with no scope record resolves to `LEGACY_DEFAULT`, which does NOT include `coord:read`: mint a key with it explicitly (`POST /v2/workspaces/{id}/keys`) or grant it through OAuth consent.

**Canon** — the coordination layer. Where memory answers *what do my agents know*, Canon answers *what do my agents agree is true*: an append-only assertion store with enforced authority ordering (`operator` > `observation` > `inference` — **authority outranks recency**), bitemporal reads (valid time vs transaction time), explicit contested state, and advisory claims with fencing tokens.

Proxied verbatim to Kairos; the gateway authenticates and parses NOTHING here, so the `Authorization` header goes upstream untouched and Kairos is the sole authority — the same terms as `/v1`. Either `il_*` credential is accepted; a Supabase session JWT is not.

**Canon is optional per deployment, and detectable.** Where it is not enabled, EVERY `/coord/v1` path answers `404` — including the four verbs below — and the gateway forwards that 404 unchanged rather than substituting an error of its own. **The memory API is completely unaffected either way**: enabling or disabling Canon changes nothing about `/v1`, `/v2` or `/mcp`. Probe `GET /coord/v1/healthz` (or read `capabilities.canon` from `GET /v2/me`) before relying on Canon.

## Query parameters

- `cursor` string
- `limit` string: 1-500; default 50
- `kind` string: Kind prefix filter

## Response `200`

One page, forward from the cursor

- object
  - `events` object[], required
    - `event_id` string, required
    - `kind` string, required: Dotted lowercase, family first (`claim.acquired`, `subject.superseded`). An OPEN vocabulary — readers must carry it as a string, never an enum
    - `workspace_id` string, required
    - `principal` string, required: Who the event is about, per kind
    - `subject_or_resource` string, required: Verbatim — ready to feed to `/coord/v1/beliefs`
    - `occurred_at` string, date-time, required
    - `recorded_at` string, date-time, required: When the outbox learned it; the gap to `occurred_at` is the lazy-discovery mark (`claim.lapsed`)
    - `cursor` string, required: This event's own position — pass back as `?cursor=` to resume after it
  - `next_cursor` string, nullable, required

## Other responses

- `400`: Malformed `cursor`, `limit`, or `kind` filter
- `401`: Missing or invalid credential (Kairos's verdict)
- `404`: Canon is not enabled for this deployment. Every `/coord/v1` path answers 404; the memory API is unaffected

---

[API](https://skmtc.dev/infolang/apis/infolang-api.md) · [All operations](https://skmtc.dev/infolang/apis/infolang-api/llms.txt) · [OpenAPI document](https://skmtc.dev/infolang/apis/infolang-api/revisions/d04bf6de72c8?raw)
