Read a session's transcript
One page of the session’s transcript, oldest first: the questions a person asked, the answers, and the tool calls and results between them. This is how a client that did not watch a session happen shows its conversation — a tab opening a session created hours ago, a switcher moving into another one. Replaying the event stream is not a substitute for it: entry-appended carries identity and nothing else, so a client reconstructing a conversation from events alone renders every answer with none of the questions. Each page carries lastEventId, the event-stream position it was read at. A client pages to the end and then subscribes to GET /v1/events for this session with Last-Event-ID set to the LAST page’s value: every entry committed at or before that read is already in hand, every event after it arrives on the stream, and nothing is delivered twice. Entries and that position are read from one database snapshot, so no entry can slip between the two. A turn still in flight is deliberately not in it. The fragments of a message that has not committed as an entry are not transcript yet — a client attaching mid-turn receives the rest of that turn on the stream, and reads the entry the turn commits when it ends by asking for the entries after the last sequence it holds. nextCursor is always present: a transcript is append-only, so the cursor is a resume position rather than a promise that more exists already. hasMore is what says whether more exists right now. An assistant round’s reasoning blocks are not served here, and neither are their signatures. They are the model’s own scratchpad — rendering them in the assistant’s voice claims the model said what it only considered — and each signature is opaque provider material that never leaves the host. What the entry DOES carry is a summary of the run (Entry.reasoning): what the model called it, how many blocks it took and how long it ran. Those are facts about the thinking rather than any of it, and they are what lets a client reading a session back draw the one collapsed line the live client draws, in the place the thinking happened. An entry that held nothing else is still listed, carrying no text, so a transcript’s sequence numbering stays honest.
Path Parameters
The session's id.
Query Parameters
Opaque pagination cursor from a previous page's nextCursor or prevCursor.
1024Maximum items per page.
1 <= x <= 100Response
One page of transcript entries, oldest first.
One page of a session's transcript, oldest first, plus the seam a client attaches the live event stream at.
x >= 1Whether more entries already exist after this page. False does not mean the transcript is finished — an append-only log always can grow — it means nothing more had been written when the page was read.
Where the next read resumes. Always present, including on the last page: a client that has caught up keeps it and re-reads from it later to collect whatever committed in between.
The event-stream position this page was read at — the id of the newest event this session had at the moment the entries were read, in the same database snapshot. Subscribe to GET /v1/events for this session with Last-Event-ID set to the last page's value and the stream continues exactly where the transcript stops. "0" when the session has no events at all.

