List analysis events
/api/sdk/v1/analyses/{analysisId}/eventsOne page of the public event stream, oldest first. Pass the previous
page's nextAfter as after to continue, and read state to know
whether the run is over.
The stream is a progress report, not the run's log. The agent's turns,
its individual tool calls and their arguments and output, and the
sentences a rejected plan was faulted for are not part of the public
API at any depth — a detail query parameter is rejected with 400.
seq is monotonic but not contiguous: it is shared with events
that are not published, so a public page skips numbers. Treat it as an
ordering and a resume token, never as a count.
Authorization
bearerAuth A personal access token created in the inklet portal. Server-side use only.
In: header
Path Parameters
1 <= lengthQuery Parameters
Exclusive lower bound on seq.
0 <= value <= 21474836470Events per page. Out-of-range values are rejected, not clamped.
1 <= value <= 20050Response Body
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/api/sdk/v1/analyses/string/events"{ "items": [ { "seq": 1, "at": "2019-08-24T14:15:22Z", "attempt": 0, "source": "agent", "type": "analysis.created", "level": "info", "visibility": "public", "summary": "string", "data": {} } ], "nextAfter": 0, "hasMore": true, "state": "queued"}Retrieve an analysis GET
Previous Page
Stream analysis events GET
The same public events as `GET /analyses/{analysisId}/events`, delivered as `text/event-stream`. Each frame carries the event's `seq` as its SSE `id` and its `type` as the SSE `event`, so a dropped connection resumes with `Last-Event-ID` — or with `after`, which wins when both are present. A `: ping` comment keeps the connection alive. The stream closes with an `end` frame once the analysis is terminal: `{"state": "completed" | "failed", "lastSeq": <int>}`. Rendering and delivery happen after that, so `render.*` and `delivery.*` events are only visible in the paged read.