Skip to main content
Sessions

Session data structures

Shared Session, resource, event, and thread structures.

Session object

Returned by create, get, list, update, and archive endpoints.
FieldTypeDescription
idstringSession ID with the sess_ prefix
typestringAlways "session"
agentobjectAgent snapshot used by this Session. See Session embedded agent for the field shape
environment_idstringEnvironment ID used by this Session
statusstringSession lifecycle status: rescheduling, running, idle, or terminated. The canceling value in a Cancel endpoint response is a fixed acknowledgement value, not a persisted Session object status
titlestring | nullSession title
metadataobjectSession metadata
environment_variablesobjectSession-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
resourcesarray of Session resourceFile, GitHub, generic Git, or Memory Store resources attached to the Session
vault_idsarray of stringVault IDs attached to the Session
deployment_idstring | nullDeployment ID when the Session was created by a Deployment, otherwise null
outcome_evaluationsarrayOutcome evaluation results. New Sessions return []
statsSession statsSession statistics
usageSession usageCumulative model, sandbox runtime, and total credits snapshot. Omitted when usage data is unavailable
archived_atstring | nullArchive time, or null when not archived
created_atstringCreation time
updated_atstringLast update time
Session responses no longer include legacy fields such as agent_id, turn_status, or memory_store_ids.

Agent reference

agent in create requests can be either a string Agent ID or this object:
FieldTypeRequiredDescription
idstringYesAgent ID with the agent_ prefix
typestringYes (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
versionintegerNoAgent 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: Publishing newer source Agent configuration does not replace this snapshot. Submitting agent fields through Update a session can change supported runtime fields locally for the Session without advancing its embedded agent.version; the linked guide also explains Skill version behavior.
  • 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-level metadata is exposed.
  • instructions — replaced by system.
See Multiagent roster element for the agent.multiagent.agents[] response structure and Session Thread object for the Agent structure returned in each thread.

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

FieldTypeRequiredDescription
idstringResponse onlyResource ID
typestringYes"file"
file_idstringYesFile ID with the file_ prefix. The file must be ready
mount_pathstringNoMount path in the container. Defaults to /mnt/session/uploads/<file_id> when omitted
created_atstringResponse onlyResource creation time
updated_atstringResponse onlyResource update time

GitHub repository resource

FieldTypeRequiredDescription
idstringResponse onlyResource ID
typestringYes"github_repository"
urlstringYesRepository URL
authorization_tokenstringNo (write only)GitHub token used to access a private repository or push. It is not returned in responses
mount_pathstringNoClone target path in the container. Defaults from the repository name when omitted
checkoutobjectNoGit checkout target, for example {"type":"branch","name":"main"}
created_atstringResponse onlyResource creation time
updated_atstringResponse onlyResource update time

Generic Git repository resource

Use this resource for GitLab, Gitee, Bitbucket, and other HTTP(S) Git providers.
FieldTypeRequiredDescription
idstringResponse onlyResource ID
typestringYes"git_repository"
urlstringYesHTTP(S) clone URL. Public repositories need no username; authenticated repositories include it, e.g. https://username@gitlab.com/group/repo.git
passwordstringNo (write only)Required together with a username for private repositories or push. Use the account password or the Access Token/PAT required by the provider. It is not returned in responses
mount_pathstringNoClone target inside the container; derived from repository name when omitted
checkoutobjectNoGit checkout target, e.g. {"type":"branch","name":"main"}
created_atstringResponse onlyResource creation time
updated_atstringResponse onlyResource update time

Memory Store resource

FieldTypeRequiredDescription
typestringYes"memory_store"
memory_store_idstringYesMemory Store ID with the memstore_ prefix
accessstring | nullNoOptional access mode. Allowed values: "read_write", "read_only". Empty string or omitted means default (no override)
instructionsstring | nullNoOptional instructions stored on the Session resource. Maximum 4096 characters
namestring | nullResponse onlyCurrent Memory Store name when available
descriptionstringResponse onlyCurrent Memory Store description when available
mount_pathstring | nullResponse onlyCurrent implementation returns null unless an existing resource snapshot contains a value
Memory Store resources do not include id, created_at, or updated_at fields.

Session stats

FieldTypeDescription
active_secondsnumberActive processing time in seconds. New Sessions start at 0
duration_secondsnumberSession duration in seconds. New Sessions start at 0

Session usage

usage is the cumulative snapshot for a Session:
FieldTypeDescription
model_creditsnumberCredits accumulated from recorded model calls in the Session
sandbox_runtime_creditsnumberCredits accumulated from billable cloud sandbox runtime used by the Session
total_creditsnumberTotal credits accumulated across all usage components
A Session without usage data omits the usage field. Each credits value is floored rather than rounded to at most 2 decimal places; 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 all three fields as one snapshot: overwrite local values by Session ID instead of adding them again on every query.

Multiagent roster element

In a Session response, ordinary Agent and self entries in agent.multiagent.agents[] return the corresponding Agent definitions with the fields below, excluding their own multiagent field. Advisor entries return only type and model, for example {"type":"advisor","model":"ultimate"}. See Advisor object.
FieldTypeDescription
typestring"agent" for a sibling Agent reference, or "self" for the coordinator itself
idstringAgent ID. Present for type = "agent"; mirrors the coordinator's own ID when type = "self"
versionintegerPinned Agent version. Present for type = "agent"
namestringHydrated Agent name
descriptionstring | nullHydrated Agent description
systemstringHydrated Agent system prompt (replaces instructions)
modelstring | objectSame shape as on the embedded Agent, including effective_context_window when set
Other Agent fieldsvariesTools, MCP servers, skills, and other Agent fields, with the same field stripping rules as the embedded Agent
If a referenced Agent definition cannot be retrieved (for example, its version no longer exists), the original reference is returned unchanged.

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.
FieldTypeDescription
idstringEvent ID with the evt_ prefix
typestringEvent type
processed_atstringPresent when the event has been processed. Many agent-generated events omit this field.
Depending on 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:
TypeRequired fieldsNotes
user.messagecontentcontent must be a non-empty array of content blocks
user.interruptnonesession_thread_id is optional and is echoed as null when omitted
user.tool_confirmationtool_use_id, resultresult must be allow or deny; deny_message is optional
user.tool_resulttool_use_idUse 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_resultcustom_tool_use_idcontent is optional; when present, it must be an array of content blocks. is_error is optional
user.define_outcomedescription, rubricrubric is an object such as {"type":"text","content":"..."} or {"type":"file","file_id":"file_..."}; max_iterations is optional
system.messagecontentcontent must be a non-empty array of text content blocks; the event must follow a user/tool result event

Message content blocks

events[].type identifies the event, content[].type identifies the content block, and an image's source.type identifies its source.
EventAccepted content[].typecontent requirements
user.messagetext, imageRequired, non-empty array; text and images may be mixed
system.messagetextRequired, non-empty array
user.tool_result, user.custom_tool_resulttext, image, document, search_resultOptional; when supplied, must be an array, which may be empty

User messages

All fields below are required. Use only the fields for the selected block type.
content[].typeFieldsDescription
texttype, texttext must be a non-empty, non-whitespace string
imagetype, sourcesource is one of the three formats below
All image source fields are strings:
source.typeRequired fieldsDescription
base64type, media_type, datamedia_type is image/png, image/jpeg, image/webp, or image/gif; data is raw Base64, with optional trailing = padding and no Data URL prefix
urltype, urlExternal HTTPS image URL readable by the model service; private, loopback, and other restricted destinations are rejected
filetype, file_idImage File ID from Upload file, readable by the current identity with status ready; supports PNG, JPEG, WebP, and GIF
Image limits:
  • Each user.message accepts at most 100 image blocks. Use a Session model that supports image input.
  • Each Base64 value is limited to 10 MiB (10,485,760 bytes) of encoded text, with width and height each at most 8000 pixels. Use a File source when the encoded length exceeds the limit.
  • Base64 and File images may be resized or compressed; URL images are fetched by the downstream model service.

User message examples

Each example is a single event object to place in the events array. Text:
{
  "type": "user.message",
  "content": [{"type": "text", "text": "Hello"}]
}
Base64 image:
{
  "type": "user.message",
  "content": [{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": "<raw Base64 image data>"}}]
}
URL image:
{
  "type": "user.message",
  "content": [{"type": "image", "source": {"type": "url", "url": "https://example.com/image.png"}}]
}
File image:
{
  "type": "user.message",
  "content": [{"type": "image", "source": {"type": "file", "file_id": "file_..."}}]
}
See Send events for the endpoint.

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.

session.updated event

A successful Session update emits session.updated. The event always contains id, type, and processed_at. Depending on the request, it can additionally contain these fields:
FieldTypeDescription
titlestring | nullIncluded when the request supplied title
metadataobjectIncluded when the resulting metadata object is non-empty and the request supplied metadata
agentobjectUpdated embedded runtime snapshot, included after runtime configuration is changed through Update a session
An update that changes only environment_variables emits only the fixed fields. Environment-variable names and values are never included in this event.

session.error event

session.error reports an error during Session execution. The event contains id, type, processed_at, and error. The error object has these fields:
FieldTypeDescription
typestringError category. Clients should handle unknown_error and future types
messagestringHuman-readable error description
retry_statusobjectRetry state. Its type is retrying, exhausted, or terminal
qoder_error_codestringOptional diagnostic code. Clients must not use it to decide whether to retry
retry_status.type has these meanings:
ValueDescription
retryingThe service is retrying automatically; the client should continue waiting
exhaustedThe retry count or recovery window has been exhausted, or a non-retryable error failed immediately. No further automatic recovery is scheduled for this turn. Wait for subsequent status events before deciding whether to send a new message
terminalThe error is not recoverable and will not be retried automatically. Use subsequent Session/Thread status events to determine the final state

Advisor events

Advisor lifecycle events have agent_name: "qoder.advisor". Use session_thread_id to identify each consultation.
EventWhere to read itKey fields
agent.thread_message_receivedMain thread event streamfrom_session_thread_id identifies the consultation thread, from_agent_name is qoder.advisor, and content contains the advice
agent.thread_message_sentAdvisor Thread event streamto_session_thread_id and to_agent_name identify the main thread; content contains the advice
session.errorAdvisor Thread event streamerror contains the cause and retry status; see session.error event
session.thread_status_idleSession event streamstop_reason.type is end_turn when the consultation ends (including interruption), or retries_exhausted on failure. See the thread's session.error for the cause
Example of the main thread receiving advice:
{
  "id": "evt_advisor_received",
  "type": "agent.thread_message_received",
  "processed_at": "2026-09-09T08:00:05Z",
  "from_session_thread_id": "sthr_advisor_call",
  "from_agent_name": "qoder.advisor",
  "content": [{"type": "text", "text": "Migrate through a canary rollout and verify the rollback steps."}]
}
A failed consultation does not stop the main Agent's task or produce an advice message. Read error details through the Thread events endpoint.

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.
FieldTypeDescription
typestringAlways "event_start"
eventobjectStreamed event reference
The event object has these fields:
FieldTypeDescription
idstringEvent ID with the evt_ prefix. The SSE id:, related deltas, and buffered event use this same ID.
typestring"agent.message" or "agent.thinking"
An 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.
{
  "type": "event_start",
  "event": {
    "id": "evt_00jjujk9fbnr4wkj2gh8",
    "type": "agent.message"
  }
}

Event delta frame

An event_delta frame appends text to an incrementally streamed agent.message.
FieldTypeDescription
typestringAlways "event_delta"
event_idstringID from the matching event_start.event.id and SSE id: field
deltaobjectContent delta
The delta object has these fields:
FieldTypeDescription
typestringAlways "content_delta"
indexintegerZero-based index of the content block being updated
contentobjectText fragment with type: "text" and a text string
{
  "type": "event_delta",
  "event_id": "evt_00jjujk9fbnr4wkj2gh8",
  "delta": {
    "type": "content_delta",
    "index": 0,
    "content": {
      "type": "text",
      "text": "Hello"
    }
  }
}

Model request span events

span.model_request_start marks the beginning of one model request.
FieldTypeDescription
idstringEvent ID with the evt_ prefix
processed_atstringRFC 3339 timestamp
typestringAlways "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.
FieldTypeDescription
idstringEvent ID with the evt_ prefix
is_errorbooleanWhether the model request ended with an error or cancellation
model_request_start_idstringID of the corresponding span.model_request_start event
model_usageobjectOptional usage for this model call. Omitted when credits are unavailable
processed_atstringRFC 3339 timestamp
typestringAlways "span.model_request_end"
model_usage contains only:
FieldTypeDescription
creditsnumberCredits 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.
FieldTypeDescription
idstringThread ID with the sthr_ prefix
typestringAlways "session_thread"
session_idstringOwning Session ID
parent_thread_idstring | nullParent thread ID. null for the coordinator thread
agentobjectAn ordinary thread uses the Session embedded agent shape with multiagent removed; an Advisor Thread uses {"type":"advisor","model":"..."}
statusstringThread lifecycle status: running, idle, rescheduling, or terminated
statsobject | nullThread statistics. Current implementation returns null
archived_atstring | nullArchive time, or null when not archived
created_atstringCreation time
updated_atstringLast update time
Thread responses no longer include legacy fields such as agent_id, agent_version, name, role, stop_reason, created_by_tool_use_id, or usage.