Shared structures for Sessions, resources, events, and threads.
Session object
Returned by create, get, list, update, and archive endpoints.
| Field | Type | Description |
|---|---|---|
id | string | Session ID with the sess_ prefix |
type | string | Always "session" |
agent | object | Agent snapshot used by this Session. See Session embedded agent for the field shape |
environment_id | string | Environment ID used by this Session |
status | string | Session lifecycle status: rescheduling, running, idle, canceling, or terminated. canceling is a transient state returned by the Cancel endpoint acknowledgement; poll the Session or listen for status events to observe the final state |
title | string | null | Session title |
metadata | object | Session metadata |
environment_variables | object | Session-level environment variables exported into the agent runtime as a map of string keys to string values ({"NAME":"value"}). Empty Sessions return {}. See Create a Session |
resources | array of Session resource | File, GitHub repository, or Memory Store resources attached to the Session |
vault_ids | array of string | Vault IDs attached to the Session |
deployment_id | string | null | Deployment ID when the Session was created by a Deployment, otherwise null |
outcome_evaluations | array | Outcome evaluation results. New Sessions return [] |
stats | Session stats | Session statistics |
usage | Session usage | Cumulative credits snapshot for recorded model calls. Omitted when usage data is unavailable |
archived_at | string | null | Archive time, or null when not archived |
created_at | string | Creation time |
updated_at | string | Last update time |
agent_id, turn_status, or memory_store_ids.
Agent reference
agent in create requests can be either a string Agent ID or this object:
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Agent ID with the agent_ prefix |
type | string | Yes (object form only) | Must be the literal "agent". Missing or other values return 400 when the object form is used. The bare-string form (passing the Agent ID directly) skips this check |
version | integer | No | Agent version to snapshot. Omit or pass 0 to use the latest active version |
Session embedded agent
The agent returned inside a Session object is the Agent snapshot pinned to the Session, but several Agent fields are stripped before they are exposed:
created_at,updated_at— never included on the embedded Agent.archived,archived_at— never included; the Session preserves access to the snapshot regardless of the source Agent's archive state.metadata— Agent-level metadata is stripped; only Session-levelmetadatais exposed.instructions— replaced bysystem.
agent.multiagent.agents[] is hydrated server-side from stub {type, id, version} references into full Agent definitions (see Multiagent roster element). Inside a Session Thread object, the agent field additionally drops the multiagent block — coordinator threads only carry the per-agent snapshot.
agent.model.effective_context_window
Sessions return an additional response-only effective_context_window (int64, in tokens) inside agent.model. It is the runtime-resolved context window the Session will use for this Agent (after applying environment-level overrides). Absent or non-positive values are omitted; clients should treat the field as informational.
Session resource
resources[] is a union distinguished by type.
File resource
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Response only | Resource ID |
type | string | Yes | "file" |
file_id | string | Yes | File ID with the file_ prefix. The file must be ready |
mount_path | string | No | Mount path in the container. Defaults to /mnt/session/uploads/<file_id> when omitted |
created_at | string | Response only | Resource creation time |
updated_at | string | Response only | Resource update time |
GitHub repository resource
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Response only | Resource ID |
type | string | Yes | "github_repository" |
url | string | Yes | Repository URL |
authorization_token | string | Yes (write only) | GitHub token used to access the repository. It is not returned in responses |
mount_path | string | No | Clone target path in the container. Defaults from the repository name when omitted |
checkout | object | No | Git checkout target, for example {"type":"branch","name":"main"} |
created_at | string | Response only | Resource creation time |
updated_at | string | Response only | Resource update time |
Memory Store resource
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | "memory_store" |
memory_store_id | string | Yes | Memory Store ID with the memstore_ prefix |
access | string | null | No | Optional access mode. Allowed values: "read_write", "read_only". Empty string or omitted means default (no override) |
instructions | string | null | No | Optional instructions stored on the Session resource. Maximum 4096 characters |
name | string | null | Response only | Current Memory Store name when available |
description | string | Response only | Current Memory Store description when available |
mount_path | string | null | Response only | Current implementation returns null unless an existing resource snapshot contains a value |
id, created_at, or updated_at fields.
Session stats
| Field | Type | Description |
|---|---|---|
active_seconds | number | Active processing time in seconds. New Sessions start at 0 |
duration_seconds | number | Session duration in seconds. New Sessions start at 0 |
Session usage
usage is the cumulative snapshot for a Session:
| Field | Type | Description |
|---|---|---|
total_credits | number | Credits accumulated from all recorded model calls in the Session. Floored to at most 2 decimal places |
usage field. Values are floored rather than rounded; for example, 7.6681 is returned as 7.66. JSON numbers do not preserve trailing zeroes, so 1.20 may be serialized as 1.2. Treat total_credits as a snapshot: overwrite a local value by Session ID instead of adding it again on every query.
Multiagent roster element
When the embedded Agent declares multiagent.type = "coordinator", every entry inside agent.multiagent.agents[] returned by Session endpoints is hydrated from the original stub references into a full Agent definition (subject to the same field stripping as the Session embedded agent, and additionally without its own multiagent field).
| Field | Type | Description |
|---|---|---|
type | string | "agent" for a sibling Agent reference, or "self" for the coordinator itself |
id | string | Agent ID. Present for type = "agent"; mirrors the coordinator's own ID when type = "self" |
version | integer | Pinned Agent version. Present for type = "agent" |
name | string | Hydrated Agent name |
description | string | null | Hydrated Agent description |
system | string | Hydrated Agent system prompt (replaces instructions) |
model | string | object | Same shape as on the embedded Agent, including effective_context_window when set |
| Other Agent fields | varies | Tools, MCP servers, skills, and other Agent fields, with the same field stripping rules as the embedded Agent |
Event object
Events returned by send, list, and stream endpoints are event-specific JSON objects. Public event responses expose only the documented public fields for each event type.
| Field | Type | Description |
|---|---|---|
id | string | Event ID with the evt_ prefix |
type | string | Event type |
processed_at | string | Present when the event has been processed. Many agent-generated events omit this field. |
type, an event may also include fields such as content, input, name, tool_use_id, mcp_tool_use_id, custom_tool_use_id, result, deny_message, rubric, outcome_id, session_thread_id, stop_reason, error, usage, or model_usage.
Client event request types
POST /api/v1/cloud/sessions/{session_id}/events accepts exactly these client-sent event types:
| Type | Required fields | Notes |
|---|---|---|
user.message | content | content must be a non-empty array of content blocks |
user.interrupt | none | session_thread_id is optional and is echoed as null when omitted |
user.tool_confirmation | tool_use_id, result | result must be allow or deny; deny_message is optional |
user.tool_result | tool_use_id | Use this to return a built-in tool result from a self-hosted worker. content is optional; when present, it must be an array of content blocks. is_error is optional |
user.custom_tool_result | custom_tool_use_id | content is optional; when present, it must be an array of content blocks. is_error is optional |
user.define_outcome | description, rubric | rubric is an object such as {"type":"text","content":"..."} or {"type":"file","file_id":"file_..."}; max_iterations is optional |
Public event types
List and stream endpoints can expose these event types:
user.message, user.interrupt, user.tool_confirmation, user.custom_tool_result, user.define_outcome, user.tool_result, system.message, agent.custom_tool_use, agent.mcp_tool_result, agent.mcp_tool_use, agent.message, agent.thinking, agent.thread_context_compacted, agent.thread_message_received, agent.thread_message_sent, agent.tool_result, agent.tool_use, session.deleted, session.error, session.status_idle, session.status_rescheduled, session.status_running, session.status_terminated, session.thread_created, session.thread_status_idle, session.thread_status_rescheduled, session.thread_status_running, session.thread_status_terminated, session.updated, span.model_request_start, span.model_request_end, span.outcome_evaluation_start, span.outcome_evaluation_ongoing, and span.outcome_evaluation_end.
Event delta stream frames
A buffered event is a complete public Event object emitted after generation finishes and recorded in Session event history. It is the authoritative result.
event_start and event_delta are stream-only SSE payloads used for incremental output. They are not public Event objects and do not appear in event list/history responses. Their JSON payloads have no top-level id or processed_at; the SSE id: field carries the ID of the event being streamed and can be used with Last-Event-ID.
Event start frame
An event_start frame identifies the public event whose incremental output has begun.
| Field | Type | Description |
|---|---|---|
type | string | Always "event_start" |
event | object | Streamed event reference |
event object has these fields:
| Field | Type | Description |
|---|---|---|
id | string | Event ID with the evt_ prefix. The SSE id:, related deltas, and buffered event use this same ID. |
type | string | "agent.message" or "agent.thinking" |
agent.message start is followed by text event_delta frames. An agent.thinking start is start-only: no delta follows, and the buffered agent.thinking event with the same ID marks the end of that thinking phase when one is emitted.
Event delta frame
An event_delta frame appends text to an incrementally streamed agent.message.
| Field | Type | Description |
|---|---|---|
type | string | Always "event_delta" |
event_id | string | ID from the matching event_start.event.id and SSE id: field |
delta | object | Content delta |
delta object has these fields:
| Field | Type | Description |
|---|---|---|
type | string | Always "content_delta" |
index | integer | Zero-based index of the content block being updated |
content | object | Text fragment with type: "text" and a text string |
Model request span events
span.model_request_start marks the beginning of one model request.
| Field | Type | Description |
|---|---|---|
id | string | Event ID with the evt_ prefix |
processed_at | string | RFC 3339 timestamp |
type | string | Always "span.model_request_start" |
span.model_request_end marks completion of that model request and includes model_usage when credits are available for the call. model_usage.credits is floored to at most 2 decimal places.
| Field | Type | Description |
|---|---|---|
id | string | Event ID with the evt_ prefix |
is_error | boolean | Whether the model request ended with an error or cancellation |
model_request_start_id | string | ID of the corresponding span.model_request_start event |
model_usage | object | Optional usage for this model call. Omitted when credits are unavailable |
processed_at | string | RFC 3339 timestamp |
type | string | Always "span.model_request_end" |
model_usage contains only:
| Field | Type | Description |
|---|---|---|
credits | number | Credits consumed by this model call. The value may be 0 and is floored to at most 2 decimal places |
Session Thread object
In managed-agent scenarios, each thread within a Session is represented by this structure.
| Field | Type | Description |
|---|---|---|
id | string | Thread ID with the sthr_ prefix |
type | string | Always "session_thread" |
session_id | string | Owning Session ID |
parent_thread_id | string | null | Parent thread ID. null for the coordinator thread |
agent | object | Agent snapshot used by this thread. Same shape as the Session embedded agent, with the multiagent block additionally removed |
status | string | Thread lifecycle status: running, idle, rescheduling, or terminated |
stats | object | null | Thread statistics. Current implementation returns null |
archived_at | string | null | Archive time, or null when not archived |
created_at | string | Creation time |
updated_at | string | Last update time |
agent_id, agent_version, name, role, stop_reason, created_by_tool_use_id, or usage.