---
title: "Thread Events"
method: GET
path: "/events/thread"
---

# Thread Events

`GET /events/thread`

## Request

- The document declares no server URL.
- Auth: none declared
- TypeScript: <https://skmtc.dev/sipyourdrink-ltd/apis/bernstein-task-server/docs/events/thread/get.ts> (a function with typed inputs; its response is checked against the schema)

Stream one run's journal as hash-anchored ``thread.step`` frames.

Serves :func:`~bernstein.core.replay.thread_projection.project_journal`
for ``.sdd/runs/<run>/journal.jsonl`` over SSE. Each frame's ``id`` is
the row's journal index, so a client that reconnects with
``Last-Event-ID`` resumes after the last row it saw, across server
restarts, for as long as the run journal is on disk. ``/events`` is
unchanged; this is a sibling stream pinned to one run per connection.

Ids sent on a connection are strictly increasing: a row whose index is
not above the last one sent (a duplicate or out-of-order index) is not
sent. Rows the journal reader cannot decode, including a partly
written last line, are skipped until they become decodable. Heartbeats
carry no ``id`` and never move a client's cursor. The stream ends if
the journal file disappears (for example after retention pruning).

## Query parameters

- `run` string, required

## Response `200`

Server-Sent Events stream. The response body does not terminate.

## Other responses

- `422`: Validation Error

## Changes

- **2026-11-04** `d6fde2ccac4c`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/sipyourdrink-ltd/apis/bernstein-task-server/changes/events/thread/get.md)

---

[API](https://skmtc.dev/sipyourdrink-ltd/apis/bernstein-task-server.md) - [All operations](https://skmtc.dev/sipyourdrink-ltd/apis/bernstein-task-server/llms.txt) - [OpenAPI document](https://skmtc.dev/sipyourdrink-ltd/apis/bernstein-task-server/revisions/d6fde2ccac4c?raw)
