---
title: "Stream a table's change events"
method: GET
path: "/tables/{table_id}/events/"
tags: ["table-events"]
---

# Stream a table's change events

`GET /tables/{table_id}/events/`

## Request

- Base URL: `https://api.getoneprofile.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.getoneprofile.ai/tables/{table_id}/events/`
- Auth: HTTP bearer

Server-sent event stream of a table's changes: row cell deltas, run progress, and column / display-preference / row-set invalidation signals. Replaces the 2-second status poll, so an idle table costs nothing.

Deltas carry the row's `version`, the same watermark the rows list carries, so applying one twice or out of order is a no-op. There is deliberately NO replay log: clients refetch once on every connect, and a mid-stream gap is reported as a `resync` frame meaning the same thing.

The server closes the stream after a few minutes with a `reconnect` frame; reconnect with a fresh token. Comment heartbeats keep intermediaries from dropping an idle connection.

Requires Clerk authentication; API keys are rejected. There is deliberately no 404: an unknown or foreign table streams heartbeats only, because the channel is org-scoped and leaks nothing.

## Path parameters

- `table_id` string, uuid, required

## Response `200`

A stream of change events; each SSE frame's `data` is one event object.

## Other responses

- `401`: Unauthorized
- `403`: Forbidden
- `422`: Invalid request made to the API.
- `500`: Internal server error.
- `502`: Bad gateway error.
- `503`: Service unavailable.

---

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