text/event-stream. Four stay open and watch something; the fifth streams one chat reply and closes.
The streamed chat reply is documented with the rest of the chat API in text conversations. The GET streams take no query parameters and return
404 before opening if the resource is not in your workspace.
Wire format
- The JSON repeats the frame name in its
eventfield. Narrow on that. - A line starting
:is a keep-alive, sent after 15 seconds of silence. - The body is never one JSON document. Read it with an SSE client.
Delivery rules
- Snapshot first, and on every reconnect. The first frame of each GET stream is the whole current state, taken after the subscription opens so nothing falls in the gap. To resync, reconnect and replace your local state with the snapshot.
- Best effort. Frames are relayed live, never queued or replayed. A frame sent while you were disconnected is gone; every fact it carried is readable from the REST endpoints.
item.createdframes carry an SSEid:(the item id) for de-duplication, butLast-Event-IDis ignored. assistant.deltais append-only. Concatenate the chunks.assistant.completed.textis all deltas joined: replace what you accumulated with it.
Conversation frames
GET /v1/conversations/{conversation_id}/events watches one conversation on any channel.
Item fields (
type, direction, role, visibility, delivery_status, attachments) are described on conversations.
CoPilot frames
All three CoPilot rails send the same frames.Reading a stream
talqing.copilot.agents.stream(...), copilot.tools.stream(...) and copilot.tasks.stream(...).
Neither SDK reads a
stream: true chat reply as frames; read it with a raw SSE client, or omit stream to get the JSON turn.
What is not streamed
None of these endpoints is an MCP tool. UseGET /v1/conversations/{conversation_id}/items instead of the conversation stream. A live voice or video call is a LiveKit room observed through the browser SDK (web calls); a finished call’s push notification is a webhook.