---
title: "Stream thread"
method: GET
path: "/api/v1/threads/{threadId}/stream"
tags: ["streams"]
---

# Stream thread

`GET /api/v1/threads/{threadId}/stream`

## Request

- Base URL: `https://api.capy.ai`
- URL: `https://api.capy.ai/api/v1/threads/{threadId}/stream`
- Auth: HTTP bearer

## Path parameters

- `threadId` string, required

## Query parameters

- `after` string: Exclusive event-ID cursor to start the committed lane after; the Last-Event-ID header wins when both are present.
- `until` string: `run`: close the stream with `done` after the run in progress ends, or at once when the thread is not working.
- `frames` string: `subagent`: send each subagent's lifecycle as a `subagent` frame. Defaults to `task`, the original `task` frame.

## Headers

- `last-event-id` string: The last `id:` a client read; the committed lane resumes after it.

## Response `200`

Success

## Other responses

- `400`: capy/InvalidRequest
- `401`: capy/Unauthorized
- `403`: capy/Forbidden
- `404`: capy/ThreadNotFound
- `429`: capy/RateLimited
- `503`: capy/StreamUnavailable

## Changes

- **2026-10-21** `c3356d0715a6`: 2 breaking, 1 info
  - the response's body type changed from `object` to no type for status `403`
  - removed the required property `_tag` from the response with the `403` status
  - added `#/components/schemas/capy_ForbiddenEncoded, #/components/schemas/capy_ForbiddenEncoded` to the response body `anyOf` list for the response status `403`
- **2026-10-07** `ce9732b81ae1`: 2 info
  - added the new optional `query` request parameter `frames`
  - added `subschema #7` to the response body `anyOf` list for the response status `200`
- **2026-09-30** `7187d2287ecd`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/capy/apis/capy-api/changes/api/v1/threads/:threadId/stream/get.md)

---

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