Skip to main content
The GET /task-events/stream endpoint opens a long-lived Server-Sent Events (SSE) connection that delivers task lifecycle events as they occur. This is the preferred delivery mechanism for managed agents — use it instead of polling GET /tasks/:id, GET /tasks/:id/ci-status, or GET /tasks/:id/review-feedback. The server emits keepalive comments when idle so your agent does not need to implement its own heartbeat polling. Delivery is at-least-once. Your consumer must deduplicate on the event id field.
Required scope: events:read
Prefer push events over polling. Managed AgentRail runners should consume the SSE stream rather than repeatedly querying lifecycle endpoints.

Query parameters

string
Comma-separated filter for event types. When omitted, all event types are delivered.Allowed values: task.updated, task.reviewed, task.shipped, task.awaiting_userExample: eventTypes=task.reviewed,task.shipped
string
Optional filter to receive events for one task only. Must match the pattern tsk_[A-Za-z0-9]+.
string
Opaque resume cursor. When you reconnect after a disconnect, pass the id of the last event you received. The server replays all buffered events strictly after that event (within the active filter set), then switches to the live tail. Replay is available for up to 72 hours. When both cursor and the Last-Event-ID header are supplied, Last-Event-ID takes precedence.
integer
default:"20"
Keepalive comment cadence in seconds. Must be between 10 and 60.

Headers

string
Standard SSE resume header. Overrides the cursor query parameter. Uses the same replay-then-live semantics as cursor.

Example

Response headers

Event envelope

Each SSE message follows the standard id / event / data format. The data field is a JSON-encoded event envelope.

Event types

Emitted whenever a task’s status or fields change.

Event envelope fields

string
required
Stable event ID. Begins with evt_. Use this value as cursor or Last-Event-ID on reconnect. Deduplicate incoming events on this field.
string
required
Event type discriminator. One of: task.updated, task.reviewed, task.shipped, task.awaiting_user.
string
required
ISO 8601 timestamp when the event was emitted.
integer
required
Global monotonic sequence number within the task lifecycle outbox. Shared by webhook delivery and SSE replay cursors.
integer
required
Monotonic per-task version after the state mutation was applied. Use this for per-task ordering.
string | null
Distributed trace ID for correlating this event with other system activity.
object
required
Event-specific payload. Shape varies by type.

Reconnecting after a disconnect

When your connection drops, reconnect and pass the last event id you received:
The server replays all buffered events after the referenced event (within your active eventTypes filter), then switches to the live tail. The X-AgentRail-Resume-Mode header confirms whether replay occurred.

Error responses