Skip to main content

Events reference

Run events are the primary way to observe run progress. Both SSE (GET /v1/runs/{id}/events/stream) and cursor-based polling (GET /v1/runs/{id}/events) return events in the same wire shape. For how to consume streams, handle cursors, and interpret run status, see Run lifecycle.

Event envelope

Each event is a PublicRunEvent object:
FieldTypeDescription
seqintegerMonotonically increasing sequence number per run
typestringEvent type identifier (see sections below)
timestampstringISO 8601 timestamp
payloadobject{ redacted: boolean, value: object } — see below
The internal database row may include a UUID id and runId; these are not included in the public API response.

Payload redaction

When an event’s stored payload is a plain object, RunEventService may strip client-supplied fields before returning it:
  • Removed keys: input, metadata, attachment_refs, sensitivity_tags
  • When any of those keys were present, payload.redacted is true
  • All other keys are copied into payload.value
Assistant-generated content (for example content, content_delta on step events) is not removed by this pass.

Lifecycle events

run.created

Emitted when a run is accepted and enqueued (RunLifecycleService.createRun).
Payload fieldTypeNotes
request_idstringCorrelation ID
inputobjectClient input (omitted when redacted)
metadataobjectClient metadata (omitted when redacted)
attachment_refsarrayReferences (omitted when redacted)
sensitivity_tagsarraySensitivity tags (omitted when redacted)
streamingbooleanOptional, when supplied at create
routing_hintstringOptional
routingobjectOptional routing metadata
Example (redacted public view — sensitive keys stripped):
{
  "seq": 1,
  "type": "run.created",
  "timestamp": "2026-03-25T14:30:00.000Z",
  "payload": {
    "redacted": true,
    "value": {
      "request_id": "uuid",
      "routing": { "routing_decision_reason": "planner_first_step" }
    }
  }
}

Status transition shape (worker and some lifecycle events)

These events include a transition payload with request_id, from_status, to_status, and usually reason_code: run.worker.started — Worker claimed the run; status moves to running. run.worker.succeeded — Run completed successfully (terminal). run.worker.failed — Run failed (terminal). run.worker.stalled — Run marked stalled (e.g. lease loss). run.worker.retry_scheduled — Run returned to queued for retry.
Payload fieldTypeNotes
request_idstringCorrelation ID
from_statusstringPrevious run status
to_statusstringNew run status
reason_codestring | nullMachine reason when applicable; null for run.worker.started
Example (run.worker.started):
{
  "seq": 2,
  "type": "run.worker.started",
  "timestamp": "2026-03-25T14:30:01.000Z",
  "payload": {
    "redacted": false,
    "value": {
      "request_id": "uuid",
      "from_status": "queued",
      "to_status": "running",
      "reason_code": null
    }
  }
}

run.cancelled and run.resumed

run.cancelled — Run moved to cancelled (terminal). run.resumed — Run resumed from stalled or similar; to_status is running or queued. Payload includes request_id, from_status, and to_status only (no reason_code on these events in the current implementation). Example (run.cancelled):
{
  "seq": 42,
  "type": "run.cancelled",
  "timestamp": "2026-03-25T15:00:00.000Z",
  "payload": {
    "redacted": false,
    "value": {
      "request_id": "uuid",
      "from_status": "running",
      "to_status": "cancelled"
    }
  }
}

run.limit_exceeded

Emitted when a run hits a configured hard limit (RunLimitEnforcer).
Payload fieldTypeNotes
limitTypestringWhich limit was exceeded
currentValuenumberObserved value
thresholdnumberConfigured threshold
unitstringUnit for the limit
Example:
{
  "seq": 50,
  "type": "run.limit_exceeded",
  "timestamp": "2026-03-25T16:00:00.000Z",
  "payload": {
    "redacted": false,
    "value": {
      "limitType": "duration_ms",
      "currentValue": 3600000,
      "threshold": 3600000,
      "unit": "ms"
    }
  }
}

Step events

step.progress

Streaming progress during a step (AgentLoopDriver): content deltas or tool-call milestones.
Payload fieldTypeNotes
task_idstringOptional task identifier
kindstringcontent_delta, tool_call_start, or tool_call_done
content_deltastringPresent when kind is content_delta
tool_call_idstringOptional; tool-related kinds
tool_namestringOptional; tool-related kinds
request_idstringOptional correlation ID
Example (content_delta):
{
  "seq": 10,
  "type": "step.progress",
  "timestamp": "2026-03-25T14:30:05.000Z",
  "payload": {
    "redacted": false,
    "value": {
      "task_id": "task_abc",
      "kind": "content_delta",
      "content_delta": "Here is the answer: ",
      "request_id": "uuid"
    }
  }
}

step.done

Step finished with full assistant text and execution outcome (StepDonePayload).
Payload fieldTypeNotes
task_idstringOptional task identifier
contentstringFull assistant response text for this step
outcomestringsucceeded, retry_step, or fail_run (see below)
reason_codestringOptional; often set when outcome is fail_run
provider_error_messagestringOptional; provider error detail when outcome is fail_run
request_idstringOptional correlation ID
outcome values (StepExecutionOutcome):
  • succeeded — Step completed successfully; orchestration continues per plan.
  • retry_step — Orchestrator will retry the step (not a run-level failure by itself).
  • fail_run — Run should transition to failed (terminal failure path).
Example:
{
  "seq": 15,
  "type": "step.done",
  "timestamp": "2026-03-25T14:30:10.000Z",
  "payload": {
    "redacted": false,
    "value": {
      "task_id": "task_abc",
      "content": "Final assistant message for the step.",
      "outcome": "succeeded",
      "request_id": "uuid"
    }
  }
}

Tool events

run.tool.invoked

Emitted when a tool invocation completes (RunToolInvokedPayload).
Payload fieldTypeNotes
tool_call_idstringUnique invocation ID
tool_namestringCatalog tool name
tool_outcomestringTypically succeeded, failed, timeout, or policy_denied
tool_input_summaryobjectToolSummaryEnvelope (bounded input summary)
tool_output_summaryobjectToolSummaryEnvelope (bounded output summary)
policy_reason_codestring | nullSet when denied by policy
duration_msnumberWall-clock duration

Tool summary envelope (tool_input_summary / tool_output_summary)

FieldTypeNotes
schema_versionstringAlways "v1"
previewstringOptional; up to first 240 characters
highlightsarrayOptional; up to 10 items: { key, value, redacted } each
statsobjectfields_total, fields_redacted, bytes_before_redaction, bytes_after_redaction
truncatedbooleanWhether summary was truncated
Example:
{
  "seq": 12,
  "type": "run.tool.invoked",
  "timestamp": "2026-03-25T14:30:08.000Z",
  "payload": {
    "redacted": false,
    "value": {
      "tool_call_id": "call_001",
      "tool_name": "memory_search",
      "tool_outcome": "succeeded",
      "tool_input_summary": {
        "schema_version": "v1",
        "preview": "{\"query\":\"docs\"}",
        "highlights": [
          { "key": "query", "value": "docs", "redacted": false }
        ],
        "stats": {
          "fields_total": 1,
          "fields_redacted": 0,
          "bytes_before_redaction": 20,
          "bytes_after_redaction": 20
        },
        "truncated": false
      },
      "tool_output_summary": {
        "schema_version": "v1",
        "stats": {
          "fields_total": 0,
          "fields_redacted": 0,
          "bytes_before_redaction": 0,
          "bytes_after_redaction": 0
        },
        "truncated": false
      },
      "policy_reason_code": null,
      "duration_ms": 45
    }
  }
}

Coordination events

run.coordination.decision

Planner/worker/judge coordination outcome (RunOrchestratorService).
Payload fieldTypeNotes
request_idstringCorrelation ID
decision_typestringe.g. continue, replan, stop, await_input
reason_codestringMachine-readable reason
rolestringe.g. planner, worker, judge
judge_decisionobjectOptional; e.g. { decision, reason } from judge evaluation
Example:
{
  "seq": 20,
  "type": "run.coordination.decision",
  "timestamp": "2026-03-25T14:35:00.000Z",
  "payload": {
    "redacted": false,
    "value": {
      "request_id": "uuid",
      "decision_type": "continue",
      "reason_code": "JUDGE_CONTINUE",
      "role": "judge"
    }
  }
}

run.awaiting_input

Run is paused for human or client input.
Payload fieldTypeNotes
request_idstringCorrelation ID
reason_codestringWhy input is needed
input_kindstringOptional: e.g. approval, rejection, payload
Example:
{
  "seq": 21,
  "type": "run.awaiting_input",
  "timestamp": "2026-03-25T14:35:01.000Z",
  "payload": {
    "redacted": false,
    "value": {
      "request_id": "uuid",
      "reason_code": "AWAITING_APPROVAL",
      "input_kind": "approval"
    }
  }
}

run.signal_applied

A signal was applied (RunSignalService).
Payload fieldTypeNotes
request_idstringCorrelation ID
actionstringapprove or reject
Example:
{
  "seq": 22,
  "type": "run.signal_applied",
  "timestamp": "2026-03-25T14:36:00.000Z",
  "payload": {
    "redacted": false,
    "value": {
      "request_id": "uuid",
      "action": "approve"
    }
  }
}

run.input_received

Client submitted input via signal (action: submit_input).
Payload fieldTypeNotes
request_idstringCorrelation ID
actionstringsubmit_input
Example:
{
  "seq": 23,
  "type": "run.input_received",
  "timestamp": "2026-03-25T14:36:05.000Z",
  "payload": {
    "redacted": false,
    "value": {
      "request_id": "uuid",
      "action": "submit_input"
    }
  }
}

Event type quick reference

TypeCategoryRun terminal?Description
run.createdLifecycleNoRun accepted and enqueued
run.worker.startedLifecycleNoWorker started execution
run.worker.succeededLifecycleYesRun completed successfully
run.worker.failedLifecycleYesRun failed
run.worker.stalledLifecycleNoRun marked stalled
run.worker.retry_scheduledLifecycleNoRun queued for retry
run.cancelledLifecycleYesRun cancelled
run.resumedLifecycleNoRun resumed from paused/stalled
run.limit_exceededLifecycleYesHard limit hit
step.progressStepNoStreaming progress / tool milestones
step.doneStepNoStep completed with full content
run.tool.invokedToolNoTool invocation finished
run.coordination.decisionCoordinationNoPlanner/worker/judge decision
run.awaiting_inputCoordinationNoWaiting for signal/input
run.signal_appliedCoordinationNoApprove/reject applied
run.input_receivedCoordinationNoInput payload submitted

API examples

List events (replace run_xxx with your run id):
curl -sS "https://api.example.com/v1/runs/run_xxx/events?limit=50" \
  -H "Authorization: Bearer key_abc123xyz:your_secret_here"
Open an SSE stream:
curl -sSN "https://api.example.com/v1/runs/run_xxx/events/stream" \
  -H "Authorization: Bearer key_abc123xyz:your_secret_here" \
  -H "Accept: text/event-stream"