GET /events to read its history, or stream it with Server-Sent Events to follow new activity live.
In the dashboard, this timeline is the agent’s conversation view. This page explains how to read it over the API when building your own UI or automation.
Read the timeline
GET /events returns events in chronological order. Set after_sequence=0 to start at the beginning:
next_after_sequence as after_sequence. Stop when has_more is false.
To start with the newest events, use before_sequence=0 instead and pass each next_before_sequence value into the next request. limit defaults to 100 and accepts up to 500.
Full schema and playground: List events.
What each event carries
Every event has anid, a sequence number, a turn, and an event_kind. There are four event kinds:
agent_input— something entered the conversation: a message, an interaction answer, a cancel, or a config change. Sending input covers each one.model_output— one completed model response, with astop_reasonand any tool calls the model requested.tool_result— the outcome of one tool call (succeeded,failed,denied, orcanceled). Itstool_call_idmatches the call in the model output that requested it.context_checkpoint— a summary Omnara uses to carry earlier context forward when a conversation grows long.
Stream it live
text/event-stream. The SSE event name tells you what each frame contains:
Saved events use their
sequence as the SSE id. Heartbeat comments (: lines) only keep the connection open and can be ignored. A simplified exchange looks like:
tool_call_update frames are included for every tool type and contain only tool_call_id and state. They may arrive out of order and are not replayed. After the stream connects, including after a reconnect, query GET /tool-calls for current state.
Deltas are a preview, not the record
Withstream_deltas=true, the stream includes partial text, reasoning, and tool-call arguments while the model responds. Use these deltas to show progress, but do not treat them as durable history: they are not saved or replayed after a reconnect.
When the completed model_output event arrives, replace the preview with it. Deltas and their final events share model_call_context_id; tool-call previews and results also share tool_call_id, so you can match them reliably. Exact delta frame shapes are in the Stream events reference.
Resuming after a disconnect
Reconnect withLast-Event-ID set to the last saved sequence you processed. You can also pass the same value as after_sequence:
model_output event is.
Full schema and playground: Stream events.
Group events into turns
Events are useful for live updates. For conversation history, it is often easier to group them into turns. A turn starts when an input enters the timeline and includes the resulting model responses and tool activity. Each agent numbers its turns withturn_sequence.
List turns newest-first:
opening_eventsshows what started the turn.latest_semantic_eventis the latest event useful to show in a conversation preview.latest_eventis the newest event overall, including internal processing events.
next_before_turn_sequence as before_turn_sequence. When it is null, you have reached the first turn.
To load all events in a turn, page backward from its end:
next_before_sequence into the next request until it is null.
A typical conversation UI lists turns, loads a turn’s events when opened, and appends new events from the live stream.
Full schemas and playground: List turns · List turn events.
Next
Approvals & questions
What to do when the stream shows the agent waiting on a human
Artifacts
View and download files referenced in the timeline