Attributes
string
required
evt_ plus hex. Stable across retries and replays — use it to deduplicate.string
required
One of the types below.
object
required
The unit of work this is about:
{ kind, id }. kind is run for agent work, request for a bare product call, endpoint for a test delivery.object
The enclosing unit of work, when there is one. Null on everything delivered today, because a nested unit’s terminal event is not sent — the outer one already reports it.
string
required
Which surface produced the work:
agent, api, mcp, console or playground.integer
Orders events within one
source. Null where there is no ordering to express, such as a product request.object
required
Tenancy and routing:
workspace_id, and where they apply connection_id, agent_id, agent_key, thread_id, subject_ref, product. A key is omitted rather than sent as null — a run whose agent uses no connection has no connection_id.uuid
Compatibility alias for
source.id on run events. Present so existing SDK code keeps working; new code should read source.uuid
Compatibility alias for
context.thread_id. Also names the realtime channel.object
Type-specific payload. Omitted entirely when the endpoint is set to send ids only.
Types
tool_call.completed reports status as ok, failed, declined or denied — declined meaning a held write was rejected, denied meaning policy refused the call.
Arguments and results are redacted before an event is built, per the patch’s declaration.
Transports
Every type reaches realtime subscribers onprivate-thread-{thread_id}, except the ones with no thread — a bare product call like extract.completed has no conversation to publish into.
All but message.delta and message.block are deliverable to webhook endpoints. Streaming fragments and render blocks stay realtime-only: one is a poor fit for HTTP, the other is something a UI draws.
Product events fire only when you call the product directly. An extract that runs inside an agent is a step of that run, and the run’s own events already report it.