---
title: "Turn Reattach Stream"
method: GET
path: "/api/chats/{chat_id}/turn-stream"
tags: ["chats"]
---

# Turn Reattach Stream

`GET /api/chats/{chat_id}/turn-stream`

## Request

- Base URL: `https://app.thinqos.com` (the document declares no server; this is the origin it was published from)
- URL: `https://app.thinqos.com/api/chats/{chat_id}/turn-stream`
- Auth: none declared

Re-attach to a turn that is already running (TOS-2090).

``POST /messages/stream`` hands the reply to exactly one caller: the SSE
stream IS that request's response body. Anyone who does not hold it - a pane
React remounted when focus mode moved it, a reloaded page, a second tab, a
second device - had no way to watch a turn in progress and saw the reply
only once it finished and the assistant message landed.

This endpoint closes that gap by reading ``chat_stream_progress``, which the
running turn updates on a coalesced flush. It emits:

* ``snapshot`` - the accumulated text so far, so a late joiner catches up in
  one frame rather than starting from blank;
* ``progress`` - whenever any agent's ``seq`` advances or the visible agent
  row set changes. The payload carries the FULL current set rather than a
  delta, so a dropped or duplicated frame cannot desynchronise the bubbles;
* ``idle`` - the turn is over (or there was never one). The client closes and
  reconciles from ``/messages``, where the outcome now lives.

Polling Postgres rather than subscribing in-process is deliberate: awen-api
runs several Cloud Run pods and the re-attaching client rarely lands on the
pod running the turn.

## Path parameters

- `chat_id` string, uuid, required

## Headers

- `x-impersonate-identity-id` string, nullable

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

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