# Authentication
> Create an API key and authenticate requests.
Source: https://www.ellipsis.dev/docs/api/authentication
Create a key under **API > API keys** in the dashboard. Copy the secret when it is shown; it cannot be retrieved later.
## Bearer token
Store the key in `ELLIPSIS_API_TOKEN`:
```bash
export ELLIPSIS_API_TOKEN="ellipsis_key_..."
```
Send it on each request:
```bash
curl https://api.ellipsis.dev/v1/identity \
-H "Authorization: Bearer $ELLIPSIS_API_TOKEN"
```
The identity response identifies the account and credential. An API key acts for its account, with no individual user identity.
## Permissions
An invalid or revoked token returns `401`. A valid credential without access returns `403`.
Account financial settings require an owner or organization administrator's user credential. API keys and sandbox credentials cannot change them.
Revoke a key from the dashboard when it is no longer needed. Keep keys on your server; do not embed them in browser code or committed configuration.
---
# API overview
> Start sessions, run automations, and integrate reviews with the Ellipsis API.
Source: https://www.ellipsis.dev/docs/api
The base URL is `https://api.ellipsis.dev/v1`. Authenticate with a bearer token from the dashboard's **API** page.
## Start a session
```bash
curl https://api.ellipsis.dev/v1/sessions \
-H "Authorization: Bearer $ELLIPSIS_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"environment": "api-environment",
"lifecycle": {
"interactive": false
},
"budget": 3,
"claude_code": {
"prompt": "Run the tests and report failures."
}
}'
```
The response contains `session.id`. Creation returns before the task finishes.
## Choose a resource
| Resource | Operations |
| -------------------------------------- | ------------------------------------------------------- |
| [Sessions](/docs/api/sessions) | Start tasks, send messages, inspect changes and results |
| [Automations](/docs/api/automations) | Manage saved definitions and invoke them |
| [Environments](/docs/api/environments) | Manage reusable sandbox configuration |
| [Secrets](/docs/api/secrets) | Store credentials referenced by environments |
| [Reviews](/docs/api/reviews) | Run and inspect pull request reviews |
| [Account](/docs/api/account) | Read model support, budget, and usage |
| [Integrations](/docs/api/integrations) | Read connected integrations and available repositories |
The reference covers supported integration workflows. The [OpenAPI document](/openapi.v1.json) also contains endpoints used by the dashboard.
## SDKs
The [Python SDK](/docs/api/python-sdk) and [TypeScript SDK](/docs/api/typescript-sdk) provide session handles, streaming, pagination, and typed errors.
## Errors and retries
Errors use `{"error":{"code":"...","message":"..."}}`. Branch on `code`; message text can change.
| Status | Action |
| ------------ | ---------------------------------------------------- |
| `400`, `422` | Correct the request or unsupported configuration |
| `401`, `403` | Check the credential and its permissions |
| `404` | Check the resource ID and account |
| `409` | Resolve a conflict, such as a git-managed definition |
| `429` | Respect `Retry-After` |
| `5xx` | Retry with backoff |
Do not blindly retry session creation after an ambiguous timeout; it can create another session. Tag requests with `metadata` and check existing sessions when needed. Message sends support an `idempotency_key`.
## Pagination
Paginated endpoints accept `limit` and `cursor`. Pass the returned `next_cursor` until `has_more` is false. SDK iterators fetch subsequent pages automatically.
---
# Python SDK
> Start sessions, stream records, and invoke automations from Python.
Source: https://www.ellipsis.dev/docs/api/python-sdk
## Install
Python 3.10 or newer. The `stream` extra enables live session streaming.
```bash
pip install 'ellipsis-dev[stream]'
```
## Start a session
```python
import os
from ellipsis import Ellipsis
from ellipsis.models import ClaudeConfig
client = Ellipsis(api_key=os.environ["ELLIPSIS_API_TOKEN"])
handle = client.sessions.run(
claude_code=ClaudeConfig(prompt="Run the tests and report failures."),
environment="api-environment",
lifecycle={"interactive": False},
budget=3,
)
session = handle.wait(timeout=900)
print(session.lifecycle.status, session.lifecycle.last_execution_result)
```
`run` returns a handle while work continues. `wait` polls until the session settles. A timeout stops waiting and leaves the session running.
Use `sessions.handle(session_id)` to attach to an existing session.
## Continue a conversation
Leave `lifecycle.interactive` enabled to accept messages:
```python
handle = client.sessions.run(
claude_code=ClaudeConfig(prompt="Investigate the failing validation test."),
environment="api-environment",
budget=5,
)
handle.wait(timeout=900)
handle.send("Add a regression test.", idempotency_key="add-test")
handle.wait(timeout=900)
handle.stop()
```
The same message key is accepted once per session. A message during an active turn waits for the next turn.
## Invoke an automation
```python
response = client.agents.run(
"test-repair",
prompt="Investigate the request validation tests.",
)
session = client.sessions.handle(response.session.id).wait()
print(session.lifecycle.last_execution_result)
```
For an automation with an input schema, pass `input` instead:
```python
response = client.agents.run(
"classify-change",
input={"description": "Reject expired reset tokens"},
)
```
## Stream a session
See [Session events](/docs/api/session-events) for every modeled event and complete JSON examples.
```python
import asyncio
import os
from ellipsis import AsyncEllipsis
from ellipsis.models import ClaudeConfig
async def main():
async with AsyncEllipsis(
api_key=os.environ["ELLIPSIS_API_TOKEN"]
) as client:
handle = await client.sessions.run(
claude_code=ClaudeConfig(prompt="Explain how to test a request validator."),
lifecycle={"interactive": False},
)
outcome = await handle.stream(lambda frame: print(frame.type))
print(outcome.type)
asyncio.run(main())
```
Use `AsyncEllipsis` for asynchronous requests and streaming. Complete records persist; partial text deltas are live-only.
## Read results
```python
for execution in client.sessions.executions(handle.id).executions:
if execution.result is not None:
print(execution.result.text)
for session in client.sessions.list(days=7):
print(session.id, session.lifecycle.last_execution_result)
```
SDK page iterators fetch every page. For manual pagination, use `items`, `has_more`, and `next_cursor`.
## Errors
```python
from ellipsis import APIError
try:
client.sessions.get("session_missing")
except APIError as error:
print(error.status, error.code)
```
The client defaults to a 60-second request timeout and two retries for transport errors, `429`, `502`, `503`, and `504`. Configure `timeout` and `max_retries` when creating it.
---
# Session events
> Every modeled session event, with JSON examples for platform, harness, and streaming consumers.
Source: https://www.ellipsis.dev/docs/api/session-events
Read session records through [List records](/docs/api/sessions/get-sessions-session_id-records) or receive them in a live stream's `records_append` frames. Open an event to see its example JSON and detailed field specification. Events are grouped by producer and ordered roughly from startup through execution to completion and recovery.
The session's own `event` field identifies the external event that started it. The records on this page describe activity throughout that session. See [Sessions](/docs/sessions#inspect-the-result) for `source` and `event` fields.
Examples are illustrative, independent messages, not a consecutive transcript. Optional native fields vary by harness version. Platform and transport types are listed in full; native harnesses can also send additional types through [unknown records](#unknown-records).
- [Platform](#platform): session, sandbox, inbox, and turn events.
- [Claude Code](#claude-code): native messages and turn results.
- [Codex](#codex): native app-server notifications.
- [WebSocket frames](#websocket-frames): delivery, live output, and connection state.
- [Historical formats](#historical-formats): records retained from older sessions.
For the important transitions and how turns, idle periods, and closure relate, start with [Lifecycle](/docs/lifecycle).
## Read an event
| Field | How to use it |
| ---------------------- | -------------------------------------------------------------------------------------------------------------------- |
| `kind` | Select the typed record variant: `platform`, `claude_code`, `codex_app_server`, `claude_sdk`, `codex`, or `unknown`. |
| `source` | Identify the producer: `lifecycle`, `claude_code`, or `codex`. |
| `record_format` | Select the payload version; existing history retains its original format. |
| `record_type` | Identify the event within its format. |
| `payload` | Read the platform fields or the unchanged native message. |
| `feed_seq` | Order records within a session and resume the stream after this position. |
| `stream_seq` | Order records within an execution. |
| `session_execution_id` | Correlate records with an execution; null for events before an execution exists. |
| `turn_id` | Correlate records with a turn when one applies. |
| `session_message_id` | Correlate inbox events and native user echoes so a message can render once. |
Use `kind` and `record_type` to narrow platform records. For native records, narrow `kind` first, then `payload.type` (Claude and historical Codex) or `payload.method` (current Codex). Native payloads can have their own `kind` field, such as `"push"` in a Claude Git notification; it is event data, not the envelope's record variant. Claude rate limits are the exception: `record_type` is `rate_limit`, while `payload.type` is `rate_limit_event`.
The field specifications below come from the SDK schema. **Required** means the field must be present; `null` in its type means its value can be null. Expand nested fields to inspect their properties and variants. Required fields within a variant apply when that variant is used. Examples show one possible payload; optional native fields may be absent.
Both SDKs expose `SessionRecord` and `StreamFrame`:
```python
from ellipsis.models import SessionRecord
from ellipsis.frames import StreamFrame
```
```typescript
import type { SessionRecord, StreamFrame } from '@ellipsis-dev/sdk';
```
## Platform
These records use `kind: "platform"`, `source: "lifecycle"`, and `record_format: "ellipsis_lifecycle@1"`. Events describe individual changes; not every session produces every type.
### session_scheduled
The session was created and queued for execution.
**Example JSON**
```json
{
"kind": "platform",
"source": "lifecycle",
"record_format": "ellipsis_lifecycle@1",
"record_type": "session_scheduled",
"id": "record_example",
"session_id": "session_example",
"session_execution_id": null,
"turn_id": null,
"session_message_id": null,
"sandbox_id": null,
"feed_seq": 1,
"stream_seq": 0,
"payload": {
"source": "api",
"config_name": null,
"config_commit_sha": null
},
"tools": null,
"tokens_info": null,
"cost": null,
"duration": null,
"model": null,
"created_at": "2026-09-10T14:00:00Z"
}
```
**Field specification**
| Field | Type | Presence | Details |
| --- | --- | --- | --- |
| `kind` | `string` | Required | Must be "platform". |
| `source` | `string` | Required | Must be "lifecycle". |
| `record_format` | `string` | Required | Must be "ellipsis_lifecycle@1". |
| `record_type` | `string` | Required | Must be "session_scheduled". |
| `payload` | `object` | Required | Additional properties are allowed. |
| `payload.source` | `string` | Required | |
| `payload.config_commit_sha` | `string \| null` | Optional | |
| `payload.config_name` | `string \| null` | Optional | |
| `cost` | `integer \| null` | Required | |
| `created_at` | `string` | Required | Format: date-time. |
| `duration` | `integer \| null` | Required | |
| `feed_seq` | `integer` | Required | Position in the session feed and the stream's resume cursor. |
| `id` | `string` | Required | Unique identifier of the record. |
| `model` | `string \| null` | Required | |
| `sandbox_id` | `string \| null` | Required | Sandbox that produced this record, when applicable. |
| `session_execution_id` | `string \| null` | Required | Execution that produced the record; null for session-scoped events. |
| `session_id` | `string` | Required | Session containing this record. |
| `session_message_id` | `string \| null` | Required | Message this record receives, delivers, requeues, or echoes. |
| `stream_seq` | `integer` | Required | Position within the execution's stream. |
| `tokens_info` | `object \| null` | Required | Additional properties are not allowed. |
| `tokens_info.cache_creation_input_tokens` | `integer` | Optional | |
| `tokens_info.cache_read_input_tokens` | `integer` | Optional | |
| `tokens_info.cost_usd` | `number` | Optional | |
| `tokens_info.input_tokens` | `integer` | Optional | |
| `tokens_info.num_turns` | `integer` | Optional | |
| `tokens_info.output_tokens` | `integer` | Optional | |
| `tools` | `array \| null` | Required | |
| `tools.[]` | `string` | | |
| `turn_id` | `string \| null` | Required | Turn containing this record, when applicable. |
### message_received
A prompt, follow-up, or event-generated message entered the inbox; `closes_session` marks a final message.
The opening prompt can carry its initial `turn_id` before `message_delivered`
arrives. Use that identity to reconcile the session's opening prompt without
duplicating it. Follow-ups remain unassigned until delivery; receipt alone does
not mean the agent has consumed a message.
**Example JSON**
```json
{
"kind": "platform",
"source": "lifecycle",
"record_format": "ellipsis_lifecycle@1",
"record_type": "message_received",
"id": "record_example",
"session_id": "session_example",
"session_execution_id": null,
"turn_id": null,
"session_message_id": "message_example",
"sandbox_id": null,
"feed_seq": 12,
"stream_seq": 8,
"payload": {
"message_id": "message_example",
"body": "Run the tests and report failures.",
"author": "priya-shah",
"sender_attribution_type": "github_user",
"sender_attribution_id": "12345",
"closes_session": false
},
"tools": null,
"tokens_info": null,
"cost": null,
"duration": null,
"model": null,
"created_at": "2026-09-10T14:00:00Z"
}
```
**Field specification**
| Field | Type | Presence | Details |
| --- | --- | --- | --- |
| `kind` | `string` | Required | Must be "platform". |
| `source` | `string` | Required | Must be "lifecycle". |
| `record_format` | `string` | Required | Must be "ellipsis_lifecycle@1". |
| `record_type` | `string` | Required | Must be "message_received". |
| `payload` | `object` | Required | Additional properties are allowed. |
| `payload.author` | `string \| null` | Optional | |
| `payload.body` | `string` | Required | |
| `payload.closes_session` | `boolean` | Optional | |
| `payload.message_id` | `string` | Required | |
| `payload.sender_attribution_id` | `string \| null` | Optional | |
| `payload.sender_attribution_type` | `string \| null` | Optional | |
| `cost` | `integer \| null` | Required | |
| `created_at` | `string` | Required | Format: date-time. |
| `duration` | `integer \| null` | Required | |
| `feed_seq` | `integer` | Required | Position in the session feed and the stream's resume cursor. |
| `id` | `string` | Required | Unique identifier of the record. |
| `model` | `string \| null` | Required | |
| `sandbox_id` | `string \| null` | Required | Sandbox that produced this record, when applicable. |
| `session_execution_id` | `string \| null` | Required | Execution that produced the record; null for session-scoped events. |
| `session_id` | `string` | Required | Session containing this record. |
| `session_message_id` | `string \| null` | Required | Message this record receives, delivers, requeues, or echoes. |
| `stream_seq` | `integer` | Required | Position within the execution's stream. |
| `tokens_info` | `object \| null` | Required | Additional properties are not allowed. |
| `tokens_info.cache_creation_input_tokens` | `integer` | Optional | |
| `tokens_info.cache_read_input_tokens` | `integer` | Optional | |
| `tokens_info.cost_usd` | `number` | Optional | |
| `tokens_info.input_tokens` | `integer` | Optional | |
| `tokens_info.num_turns` | `integer` | Optional | |
| `tokens_info.output_tokens` | `integer` | Optional | |
| `tools` | `array \| null` | Required | |
| `tools.[]` | `string` | | |
| `turn_id` | `string \| null` | Required | Turn containing this record, when applicable. |
### session_starting
An execution is starting after its initial checks passed; `wake_index` distinguishes a fresh start from a later wake.
**Example JSON**
```json
{
"kind": "platform",
"source": "lifecycle",
"record_format": "ellipsis_lifecycle@1",
"record_type": "session_starting",
"id": "record_example",
"session_id": "session_example",
"session_execution_id": "execution_example",
"turn_id": null,
"session_message_id": null,
"sandbox_id": null,
"feed_seq": 12,
"stream_seq": 8,
"payload": {
"attempt": 0,
"wake_index": 0
},
"tools": null,
"tokens_info": null,
"cost": null,
"duration": null,
"model": null,
"created_at": "2026-09-10T14:00:00Z"
}
```
**Field specification**
| Field | Type | Presence | Details |
| --- | --- | --- | --- |
| `kind` | `string` | Required | Must be "platform". |
| `source` | `string` | Required | Must be "lifecycle". |
| `record_format` | `string` | Required | Must be "ellipsis_lifecycle@1". |
| `record_type` | `string` | Required | Must be "session_starting". |
| `payload` | `object` | Required | Additional properties are allowed. |
| `payload.attempt` | `integer` | Required | |
| `payload.wake_index` | `integer` | Required | |
| `cost` | `integer \| null` | Required | |
| `created_at` | `string` | Required | Format: date-time. |
| `duration` | `integer \| null` | Required | |
| `feed_seq` | `integer` | Required | Position in the session feed and the stream's resume cursor. |
| `id` | `string` | Required | Unique identifier of the record. |
| `model` | `string \| null` | Required | |
| `sandbox_id` | `string \| null` | Required | Sandbox that produced this record, when applicable. |
| `session_execution_id` | `string \| null` | Required | Execution that produced the record; null for session-scoped events. |
| `session_id` | `string` | Required | Session containing this record. |
| `session_message_id` | `string \| null` | Required | Message this record receives, delivers, requeues, or echoes. |
| `stream_seq` | `integer` | Required | Position within the execution's stream. |
| `tokens_info` | `object \| null` | Required | Additional properties are not allowed. |
| `tokens_info.cache_creation_input_tokens` | `integer` | Optional | |
| `tokens_info.cache_read_input_tokens` | `integer` | Optional | |
| `tokens_info.cost_usd` | `number` | Optional | |
| `tokens_info.input_tokens` | `integer` | Optional | |
| `tokens_info.num_turns` | `integer` | Optional | |
| `tokens_info.output_tokens` | `integer` | Optional | |
| `tools` | `array \| null` | Required | |
| `tools.[]` | `string` | | |
| `turn_id` | `string \| null` | Required | Turn containing this record, when applicable. |
### session_cancelled
An initial check cancelled execution before a sandbox was provisioned, with a reason you can display.
**Example JSON**
```json
{
"kind": "platform",
"source": "lifecycle",
"record_format": "ellipsis_lifecycle@1",
"record_type": "session_cancelled",
"id": "record_example",
"session_id": "session_example",
"session_execution_id": null,
"turn_id": null,
"session_message_id": null,
"sandbox_id": null,
"feed_seq": 12,
"stream_seq": 8,
"payload": {
"reason": "The session budget has been exhausted."
},
"tools": null,
"tokens_info": null,
"cost": null,
"duration": null,
"model": null,
"created_at": "2026-09-10T14:00:00Z"
}
```
**Field specification**
| Field | Type | Presence | Details |
| --- | --- | --- | --- |
| `kind` | `string` | Required | Must be "platform". |
| `source` | `string` | Required | Must be "lifecycle". |
| `record_format` | `string` | Required | Must be "ellipsis_lifecycle@1". |
| `record_type` | `string` | Required | Must be "session_cancelled". |
| `payload` | `object` | Required | Additional properties are allowed. |
| `payload.reason` | `string` | Required | |
| `cost` | `integer \| null` | Required | |
| `created_at` | `string` | Required | Format: date-time. |
| `duration` | `integer \| null` | Required | |
| `feed_seq` | `integer` | Required | Position in the session feed and the stream's resume cursor. |
| `id` | `string` | Required | Unique identifier of the record. |
| `model` | `string \| null` | Required | |
| `sandbox_id` | `string \| null` | Required | Sandbox that produced this record, when applicable. |
| `session_execution_id` | `string \| null` | Required | Execution that produced the record; null for session-scoped events. |
| `session_id` | `string` | Required | Session containing this record. |
| `session_message_id` | `string \| null` | Required | Message this record receives, delivers, requeues, or echoes. |
| `stream_seq` | `integer` | Required | Position within the execution's stream. |
| `tokens_info` | `object \| null` | Required | Additional properties are not allowed. |
| `tokens_info.cache_creation_input_tokens` | `integer` | Optional | |
| `tokens_info.cache_read_input_tokens` | `integer` | Optional | |
| `tokens_info.cost_usd` | `number` | Optional | |
| `tokens_info.input_tokens` | `integer` | Optional | |
| `tokens_info.num_turns` | `integer` | Optional | |
| `tokens_info.output_tokens` | `integer` | Optional | |
| `tools` | `array \| null` | Required | |
| `tools.[]` | `string` | | |
| `turn_id` | `string \| null` | Required | Turn containing this record, when applicable. |
### sandbox_starting
Sandbox preparation began for the listed repositories.
**Example JSON**
```json
{
"kind": "platform",
"source": "lifecycle",
"record_format": "ellipsis_lifecycle@1",
"record_type": "sandbox_starting",
"id": "record_example",
"session_id": "session_example",
"session_execution_id": "execution_example",
"turn_id": null,
"session_message_id": null,
"sandbox_id": null,
"feed_seq": 12,
"stream_seq": 8,
"payload": {
"repositories": ["your-org/api-repo"]
},
"tools": null,
"tokens_info": null,
"cost": null,
"duration": null,
"model": null,
"created_at": "2026-09-10T14:00:00Z"
}
```
**Field specification**
| Field | Type | Presence | Details |
| --- | --- | --- | --- |
| `kind` | `string` | Required | Must be "platform". |
| `source` | `string` | Required | Must be "lifecycle". |
| `record_format` | `string` | Required | Must be "ellipsis_lifecycle@1". |
| `record_type` | `string` | Required | Must be "sandbox_starting". |
| `payload` | `object` | Required | Additional properties are allowed. |
| `payload.repositories` | `array` | Required | |
| `payload.repositories.[]` | `string` | | |
| `cost` | `integer \| null` | Required | |
| `created_at` | `string` | Required | Format: date-time. |
| `duration` | `integer \| null` | Required | |
| `feed_seq` | `integer` | Required | Position in the session feed and the stream's resume cursor. |
| `id` | `string` | Required | Unique identifier of the record. |
| `model` | `string \| null` | Required | |
| `sandbox_id` | `string \| null` | Required | Sandbox that produced this record, when applicable. |
| `session_execution_id` | `string \| null` | Required | Execution that produced the record; null for session-scoped events. |
| `session_id` | `string` | Required | Session containing this record. |
| `session_message_id` | `string \| null` | Required | Message this record receives, delivers, requeues, or echoes. |
| `stream_seq` | `integer` | Required | Position within the execution's stream. |
| `tokens_info` | `object \| null` | Required | Additional properties are not allowed. |
| `tokens_info.cache_creation_input_tokens` | `integer` | Optional | |
| `tokens_info.cache_read_input_tokens` | `integer` | Optional | |
| `tokens_info.cost_usd` | `number` | Optional | |
| `tokens_info.input_tokens` | `integer` | Optional | |
| `tokens_info.num_turns` | `integer` | Optional | |
| `tokens_info.output_tokens` | `integer` | Optional | |
| `tools` | `array \| null` | Required | |
| `tools.[]` | `string` | | |
| `turn_id` | `string \| null` | Required | Turn containing this record, when applicable. |
### sandbox_phase
A sandbox preparation phase started, completed, or failed, with optional timing and details.
**Example JSON**
```json
{
"kind": "platform",
"source": "lifecycle",
"record_format": "ellipsis_lifecycle@1",
"record_type": "sandbox_phase",
"id": "record_example",
"session_id": "session_example",
"session_execution_id": "execution_example",
"turn_id": null,
"session_message_id": null,
"sandbox_id": "sandbox_example",
"feed_seq": 12,
"stream_seq": 8,
"payload": {
"phase": "setup",
"status": "completed",
"step": "build_base",
"duration_ms": 2400,
"detail": null
},
"tools": null,
"tokens_info": null,
"cost": null,
"duration": null,
"model": null,
"created_at": "2026-09-10T14:00:00Z"
}
```
**Field specification**
| Field | Type | Presence | Details |
| --- | --- | --- | --- |
| `kind` | `string` | Required | Must be "platform". |
| `source` | `string` | Required | Must be "lifecycle". |
| `record_format` | `string` | Required | Must be "ellipsis_lifecycle@1". |
| `record_type` | `string` | Required | Must be "sandbox_phase". |
| `payload` | `object` | Required | Additional properties are allowed. |
| `payload.detail` | `object \| null` | Optional | Additional properties are allowed. |
| `payload.duration_ms` | `integer \| null` | Optional | |
| `payload.phase` | `string` | Required | |
| `payload.status` | `string` | Required | |
| `payload.step` | `string \| null` | Optional | |
| `cost` | `integer \| null` | Required | |
| `created_at` | `string` | Required | Format: date-time. |
| `duration` | `integer \| null` | Required | |
| `feed_seq` | `integer` | Required | Position in the session feed and the stream's resume cursor. |
| `id` | `string` | Required | Unique identifier of the record. |
| `model` | `string \| null` | Required | |
| `sandbox_id` | `string \| null` | Required | Sandbox that produced this record, when applicable. |
| `session_execution_id` | `string \| null` | Required | Execution that produced the record; null for session-scoped events. |
| `session_id` | `string` | Required | Session containing this record. |
| `session_message_id` | `string \| null` | Required | Message this record receives, delivers, requeues, or echoes. |
| `stream_seq` | `integer` | Required | Position within the execution's stream. |
| `tokens_info` | `object \| null` | Required | Additional properties are not allowed. |
| `tokens_info.cache_creation_input_tokens` | `integer` | Optional | |
| `tokens_info.cache_read_input_tokens` | `integer` | Optional | |
| `tokens_info.cost_usd` | `number` | Optional | |
| `tokens_info.input_tokens` | `integer` | Optional | |
| `tokens_info.num_turns` | `integer` | Optional | |
| `tokens_info.output_tokens` | `integer` | Optional | |
| `tools` | `array \| null` | Required | |
| `tools.[]` | `string` | | |
| `turn_id` | `string \| null` | Required | Turn containing this record, when applicable. |
### sandbox_output
A chunk of stdout or stderr arrived from sandbox preparation or lifecycle scripts.
**Example JSON**
```json
{
"kind": "platform",
"source": "lifecycle",
"record_format": "ellipsis_lifecycle@1",
"record_type": "sandbox_output",
"id": "record_example",
"session_id": "session_example",
"session_execution_id": "execution_example",
"turn_id": null,
"session_message_id": null,
"sandbox_id": "sandbox_example",
"feed_seq": 12,
"stream_seq": 8,
"payload": {
"phase": "clone",
"step": "your-org/api-repo",
"stream": "stdout",
"chunk": 0,
"lines": ["Cloning into 'api-repo'..."]
},
"tools": null,
"tokens_info": null,
"cost": null,
"duration": null,
"model": null,
"created_at": "2026-09-10T14:00:00Z"
}
```
**Field specification**
| Field | Type | Presence | Details |
| --- | --- | --- | --- |
| `kind` | `string` | Required | Must be "platform". |
| `source` | `string` | Required | Must be "lifecycle". |
| `record_format` | `string` | Required | Must be "ellipsis_lifecycle@1". |
| `record_type` | `string` | Required | Must be "sandbox_output". |
| `payload` | `object` | Required | Additional properties are allowed. |
| `payload.chunk` | `integer` | Required | |
| `payload.lines` | `array` | Required | |
| `payload.lines.[]` | `string` | | |
| `payload.phase` | `string` | Required | |
| `payload.step` | `string \| null` | Optional | |
| `payload.stream` | `string` | Optional | |
| `cost` | `integer \| null` | Required | |
| `created_at` | `string` | Required | Format: date-time. |
| `duration` | `integer \| null` | Required | |
| `feed_seq` | `integer` | Required | Position in the session feed and the stream's resume cursor. |
| `id` | `string` | Required | Unique identifier of the record. |
| `model` | `string \| null` | Required | |
| `sandbox_id` | `string \| null` | Required | Sandbox that produced this record, when applicable. |
| `session_execution_id` | `string \| null` | Required | Execution that produced the record; null for session-scoped events. |
| `session_id` | `string` | Required | Session containing this record. |
| `session_message_id` | `string \| null` | Required | Message this record receives, delivers, requeues, or echoes. |
| `stream_seq` | `integer` | Required | Position within the execution's stream. |
| `tokens_info` | `object \| null` | Required | Additional properties are not allowed. |
| `tokens_info.cache_creation_input_tokens` | `integer` | Optional | |
| `tokens_info.cache_read_input_tokens` | `integer` | Optional | |
| `tokens_info.cost_usd` | `number` | Optional | |
| `tokens_info.input_tokens` | `integer` | Optional | |
| `tokens_info.num_turns` | `integer` | Optional | |
| `tokens_info.output_tokens` | `integer` | Optional | |
| `tools` | `array \| null` | Required | |
| `tools.[]` | `string` | | |
| `turn_id` | `string \| null` | Required | Turn containing this record, when applicable. |
### sandbox_ready
The sandbox is ready to launch the harness, with cache and preparation timing information.
**Example JSON**
```json
{
"kind": "platform",
"source": "lifecycle",
"record_format": "ellipsis_lifecycle@1",
"record_type": "sandbox_ready",
"id": "record_example",
"session_id": "session_example",
"session_execution_id": "execution_example",
"turn_id": null,
"session_message_id": null,
"sandbox_id": "sandbox_example",
"feed_seq": 12,
"stream_seq": 8,
"payload": {
"repositories": ["your-org/api-repo"],
"cache_tier": "exact",
"phase_timings": {
"clone": 2.4
}
},
"tools": null,
"tokens_info": null,
"cost": null,
"duration": null,
"model": null,
"created_at": "2026-09-10T14:00:00Z"
}
```
**Field specification**
| Field | Type | Presence | Details |
| --- | --- | --- | --- |
| `kind` | `string` | Required | Must be "platform". |
| `source` | `string` | Required | Must be "lifecycle". |
| `record_format` | `string` | Required | Must be "ellipsis_lifecycle@1". |
| `record_type` | `string` | Required | Must be "sandbox_ready". |
| `payload` | `object` | Required | Additional properties are allowed. |
| `payload.cache_tier` | `string \| null` | Optional | |
| `payload.phase_timings` | `object` | Optional | Additional properties are allowed. |
| `payload.phase_timings.[key]` | `number` | | |
| `payload.repositories` | `array` | Required | |
| `payload.repositories.[]` | `string` | | |
| `cost` | `integer \| null` | Required | |
| `created_at` | `string` | Required | Format: date-time. |
| `duration` | `integer \| null` | Required | |
| `feed_seq` | `integer` | Required | Position in the session feed and the stream's resume cursor. |
| `id` | `string` | Required | Unique identifier of the record. |
| `model` | `string \| null` | Required | |
| `sandbox_id` | `string \| null` | Required | Sandbox that produced this record, when applicable. |
| `session_execution_id` | `string \| null` | Required | Execution that produced the record; null for session-scoped events. |
| `session_id` | `string` | Required | Session containing this record. |
| `session_message_id` | `string \| null` | Required | Message this record receives, delivers, requeues, or echoes. |
| `stream_seq` | `integer` | Required | Position within the execution's stream. |
| `tokens_info` | `object \| null` | Required | Additional properties are not allowed. |
| `tokens_info.cache_creation_input_tokens` | `integer` | Optional | |
| `tokens_info.cache_read_input_tokens` | `integer` | Optional | |
| `tokens_info.cost_usd` | `number` | Optional | |
| `tokens_info.input_tokens` | `integer` | Optional | |
| `tokens_info.num_turns` | `integer` | Optional | |
| `tokens_info.output_tokens` | `integer` | Optional | |
| `tools` | `array \| null` | Required | |
| `tools.[]` | `string` | | |
| `turn_id` | `string \| null` | Required | Turn containing this record, when applicable. |
### session_resumed
A later execution successfully restored the existing native conversation.
**Example JSON**
```json
{
"kind": "platform",
"source": "lifecycle",
"record_format": "ellipsis_lifecycle@1",
"record_type": "session_resumed",
"id": "record_example",
"session_id": "session_example",
"session_execution_id": "execution_example",
"turn_id": null,
"session_message_id": null,
"sandbox_id": "sandbox_example",
"feed_seq": 12,
"stream_seq": 8,
"payload": {
"wake_index": 1
},
"tools": null,
"tokens_info": null,
"cost": null,
"duration": null,
"model": null,
"created_at": "2026-09-10T14:00:00Z"
}
```
**Field specification**
| Field | Type | Presence | Details |
| --- | --- | --- | --- |
| `kind` | `string` | Required | Must be "platform". |
| `source` | `string` | Required | Must be "lifecycle". |
| `record_format` | `string` | Required | Must be "ellipsis_lifecycle@1". |
| `record_type` | `string` | Required | Must be "session_resumed". |
| `payload` | `object` | Required | Additional properties are allowed. |
| `payload.wake_index` | `integer` | Required | |
| `cost` | `integer \| null` | Required | |
| `created_at` | `string` | Required | Format: date-time. |
| `duration` | `integer \| null` | Required | |
| `feed_seq` | `integer` | Required | Position in the session feed and the stream's resume cursor. |
| `id` | `string` | Required | Unique identifier of the record. |
| `model` | `string \| null` | Required | |
| `sandbox_id` | `string \| null` | Required | Sandbox that produced this record, when applicable. |
| `session_execution_id` | `string \| null` | Required | Execution that produced the record; null for session-scoped events. |
| `session_id` | `string` | Required | Session containing this record. |
| `session_message_id` | `string \| null` | Required | Message this record receives, delivers, requeues, or echoes. |
| `stream_seq` | `integer` | Required | Position within the execution's stream. |
| `tokens_info` | `object \| null` | Required | Additional properties are not allowed. |
| `tokens_info.cache_creation_input_tokens` | `integer` | Optional | |
| `tokens_info.cache_read_input_tokens` | `integer` | Optional | |
| `tokens_info.cost_usd` | `number` | Optional | |
| `tokens_info.input_tokens` | `integer` | Optional | |
| `tokens_info.num_turns` | `integer` | Optional | |
| `tokens_info.output_tokens` | `integer` | Optional | |
| `tools` | `array \| null` | Required | |
| `tools.[]` | `string` | | |
| `turn_id` | `string \| null` | Required | Turn containing this record, when applicable. |
### turn_started
A platform turn began.
**Example JSON**
```json
{
"kind": "platform",
"source": "lifecycle",
"record_format": "ellipsis_lifecycle@1",
"record_type": "turn_started",
"id": "record_example",
"session_id": "session_example",
"session_execution_id": "execution_example",
"turn_id": "turn_example",
"session_message_id": null,
"sandbox_id": "sandbox_example",
"feed_seq": 12,
"stream_seq": 8,
"payload": {
"turn_id": "turn_example",
"turn_index": 0
},
"tools": null,
"tokens_info": null,
"cost": null,
"duration": null,
"model": null,
"created_at": "2026-09-10T14:00:00Z"
}
```
**Field specification**
| Field | Type | Presence | Details |
| --- | --- | --- | --- |
| `kind` | `string` | Required | Must be "platform". |
| `source` | `string` | Required | Must be "lifecycle". |
| `record_format` | `string` | Required | Must be "ellipsis_lifecycle@1". |
| `record_type` | `string` | Required | Must be "turn_started". |
| `payload` | `object` | Required | Additional properties are allowed. |
| `payload.turn_id` | `string` | Required | |
| `payload.turn_index` | `integer` | Required | |
| `cost` | `integer \| null` | Required | |
| `created_at` | `string` | Required | Format: date-time. |
| `duration` | `integer \| null` | Required | |
| `feed_seq` | `integer` | Required | Position in the session feed and the stream's resume cursor. |
| `id` | `string` | Required | Unique identifier of the record. |
| `model` | `string \| null` | Required | |
| `sandbox_id` | `string \| null` | Required | Sandbox that produced this record, when applicable. |
| `session_execution_id` | `string \| null` | Required | Execution that produced the record; null for session-scoped events. |
| `session_id` | `string` | Required | Session containing this record. |
| `session_message_id` | `string \| null` | Required | Message this record receives, delivers, requeues, or echoes. |
| `stream_seq` | `integer` | Required | Position within the execution's stream. |
| `tokens_info` | `object \| null` | Required | Additional properties are not allowed. |
| `tokens_info.cache_creation_input_tokens` | `integer` | Optional | |
| `tokens_info.cache_read_input_tokens` | `integer` | Optional | |
| `tokens_info.cost_usd` | `number` | Optional | |
| `tokens_info.input_tokens` | `integer` | Optional | |
| `tokens_info.num_turns` | `integer` | Optional | |
| `tokens_info.output_tokens` | `integer` | Optional | |
| `tools` | `array \| null` | Required | |
| `tools.[]` | `string` | | |
| `turn_id` | `string \| null` | Required | Turn containing this record, when applicable. |
### message_delivered
An inbox message was delivered to the identified turn.
**Example JSON**
```json
{
"kind": "platform",
"source": "lifecycle",
"record_format": "ellipsis_lifecycle@1",
"record_type": "message_delivered",
"id": "record_example",
"session_id": "session_example",
"session_execution_id": "execution_example",
"turn_id": "turn_example",
"session_message_id": "message_example",
"sandbox_id": "sandbox_example",
"feed_seq": 12,
"stream_seq": 8,
"payload": {
"message_id": "message_example",
"turn_id": "turn_example"
},
"tools": null,
"tokens_info": null,
"cost": null,
"duration": null,
"model": null,
"created_at": "2026-09-10T14:00:00Z"
}
```
**Field specification**
| Field | Type | Presence | Details |
| --- | --- | --- | --- |
| `kind` | `string` | Required | Must be "platform". |
| `source` | `string` | Required | Must be "lifecycle". |
| `record_format` | `string` | Required | Must be "ellipsis_lifecycle@1". |
| `record_type` | `string` | Required | Must be "message_delivered". |
| `payload` | `object` | Required | Additional properties are allowed. |
| `payload.message_id` | `string` | Required | |
| `payload.turn_id` | `string` | Required | |
| `cost` | `integer \| null` | Required | |
| `created_at` | `string` | Required | Format: date-time. |
| `duration` | `integer \| null` | Required | |
| `feed_seq` | `integer` | Required | Position in the session feed and the stream's resume cursor. |
| `id` | `string` | Required | Unique identifier of the record. |
| `model` | `string \| null` | Required | |
| `sandbox_id` | `string \| null` | Required | Sandbox that produced this record, when applicable. |
| `session_execution_id` | `string \| null` | Required | Execution that produced the record; null for session-scoped events. |
| `session_id` | `string` | Required | Session containing this record. |
| `session_message_id` | `string \| null` | Required | Message this record receives, delivers, requeues, or echoes. |
| `stream_seq` | `integer` | Required | Position within the execution's stream. |
| `tokens_info` | `object \| null` | Required | Additional properties are not allowed. |
| `tokens_info.cache_creation_input_tokens` | `integer` | Optional | |
| `tokens_info.cache_read_input_tokens` | `integer` | Optional | |
| `tokens_info.cost_usd` | `number` | Optional | |
| `tokens_info.input_tokens` | `integer` | Optional | |
| `tokens_info.num_turns` | `integer` | Optional | |
| `tokens_info.output_tokens` | `integer` | Optional | |
| `tools` | `array \| null` | Required | |
| `tools.[]` | `string` | | |
| `turn_id` | `string \| null` | Required | Turn containing this record, when applicable. |
### turn_completed
A platform turn completed successfully.
**Example JSON**
```json
{
"kind": "platform",
"source": "lifecycle",
"record_format": "ellipsis_lifecycle@1",
"record_type": "turn_completed",
"id": "record_example",
"session_id": "session_example",
"session_execution_id": "execution_example",
"turn_id": "turn_example",
"session_message_id": null,
"sandbox_id": "sandbox_example",
"feed_seq": 12,
"stream_seq": 8,
"payload": {
"turn_id": "turn_example",
"turn_index": 0,
"duration_ms": 4200
},
"tools": null,
"tokens_info": null,
"cost": null,
"duration": null,
"model": null,
"created_at": "2026-09-10T14:00:00Z"
}
```
**Field specification**
| Field | Type | Presence | Details |
| --- | --- | --- | --- |
| `kind` | `string` | Required | Must be "platform". |
| `source` | `string` | Required | Must be "lifecycle". |
| `record_format` | `string` | Required | Must be "ellipsis_lifecycle@1". |
| `record_type` | `string` | Required | Must be "turn_completed". |
| `payload` | `object` | Required | Additional properties are allowed. |
| `payload.duration_ms` | `integer \| null` | Optional | |
| `payload.turn_id` | `string` | Required | |
| `payload.turn_index` | `integer` | Required | |
| `cost` | `integer \| null` | Required | |
| `created_at` | `string` | Required | Format: date-time. |
| `duration` | `integer \| null` | Required | |
| `feed_seq` | `integer` | Required | Position in the session feed and the stream's resume cursor. |
| `id` | `string` | Required | Unique identifier of the record. |
| `model` | `string \| null` | Required | |
| `sandbox_id` | `string \| null` | Required | Sandbox that produced this record, when applicable. |
| `session_execution_id` | `string \| null` | Required | Execution that produced the record; null for session-scoped events. |
| `session_id` | `string` | Required | Session containing this record. |
| `session_message_id` | `string \| null` | Required | Message this record receives, delivers, requeues, or echoes. |
| `stream_seq` | `integer` | Required | Position within the execution's stream. |
| `tokens_info` | `object \| null` | Required | Additional properties are not allowed. |
| `tokens_info.cache_creation_input_tokens` | `integer` | Optional | |
| `tokens_info.cache_read_input_tokens` | `integer` | Optional | |
| `tokens_info.cost_usd` | `number` | Optional | |
| `tokens_info.input_tokens` | `integer` | Optional | |
| `tokens_info.num_turns` | `integer` | Optional | |
| `tokens_info.output_tokens` | `integer` | Optional | |
| `tools` | `array \| null` | Required | |
| `tools.[]` | `string` | | |
| `turn_id` | `string \| null` | Required | Turn containing this record, when applicable. |
### turn_failed
A platform turn ended unsuccessfully; this event alone does not mean its messages will be requeued.
**Example JSON**
```json
{
"kind": "platform",
"source": "lifecycle",
"record_format": "ellipsis_lifecycle@1",
"record_type": "turn_failed",
"id": "record_example",
"session_id": "session_example",
"session_execution_id": "execution_example",
"turn_id": "turn_example",
"session_message_id": null,
"sandbox_id": "sandbox_example",
"feed_seq": 12,
"stream_seq": 8,
"payload": {
"turn_id": "turn_example",
"turn_index": 0
},
"tools": null,
"tokens_info": null,
"cost": null,
"duration": null,
"model": null,
"created_at": "2026-09-10T14:00:00Z"
}
```
**Field specification**
| Field | Type | Presence | Details |
| --- | --- | --- | --- |
| `kind` | `string` | Required | Must be "platform". |
| `source` | `string` | Required | Must be "lifecycle". |
| `record_format` | `string` | Required | Must be "ellipsis_lifecycle@1". |
| `record_type` | `string` | Required | Must be "turn_failed". |
| `payload` | `object` | Required | Additional properties are allowed. |
| `payload.turn_id` | `string` | Required | |
| `payload.turn_index` | `integer` | Required | |
| `cost` | `integer \| null` | Required | |
| `created_at` | `string` | Required | Format: date-time. |
| `duration` | `integer \| null` | Required | |
| `feed_seq` | `integer` | Required | Position in the session feed and the stream's resume cursor. |
| `id` | `string` | Required | Unique identifier of the record. |
| `model` | `string \| null` | Required | |
| `sandbox_id` | `string \| null` | Required | Sandbox that produced this record, when applicable. |
| `session_execution_id` | `string \| null` | Required | Execution that produced the record; null for session-scoped events. |
| `session_id` | `string` | Required | Session containing this record. |
| `session_message_id` | `string \| null` | Required | Message this record receives, delivers, requeues, or echoes. |
| `stream_seq` | `integer` | Required | Position within the execution's stream. |
| `tokens_info` | `object \| null` | Required | Additional properties are not allowed. |
| `tokens_info.cache_creation_input_tokens` | `integer` | Optional | |
| `tokens_info.cache_read_input_tokens` | `integer` | Optional | |
| `tokens_info.cost_usd` | `number` | Optional | |
| `tokens_info.input_tokens` | `integer` | Optional | |
| `tokens_info.num_turns` | `integer` | Optional | |
| `tokens_info.output_tokens` | `integer` | Optional | |
| `tools` | `array \| null` | Required | |
| `tools.[]` | `string` | | |
| `turn_id` | `string \| null` | Required | Turn containing this record, when applicable. |
### message_requeued
A previously delivered message returned to the inbox for redelivery during failure recovery.
**Example JSON**
```json
{
"kind": "platform",
"source": "lifecycle",
"record_format": "ellipsis_lifecycle@1",
"record_type": "message_requeued",
"id": "record_example",
"session_id": "session_example",
"session_execution_id": "execution_example",
"turn_id": "turn_example",
"session_message_id": "message_example",
"sandbox_id": "sandbox_example",
"feed_seq": 12,
"stream_seq": 8,
"payload": {
"message_id": "message_example",
"turn_id": "turn_example"
},
"tools": null,
"tokens_info": null,
"cost": null,
"duration": null,
"model": null,
"created_at": "2026-09-10T14:00:00Z"
}
```
**Field specification**
| Field | Type | Presence | Details |
| --- | --- | --- | --- |
| `kind` | `string` | Required | Must be "platform". |
| `source` | `string` | Required | Must be "lifecycle". |
| `record_format` | `string` | Required | Must be "ellipsis_lifecycle@1". |
| `record_type` | `string` | Required | Must be "message_requeued". |
| `payload` | `object` | Required | Additional properties are allowed. |
| `payload.message_id` | `string` | Required | |
| `payload.turn_id` | `string` | Required | |
| `cost` | `integer \| null` | Required | |
| `created_at` | `string` | Required | Format: date-time. |
| `duration` | `integer \| null` | Required | |
| `feed_seq` | `integer` | Required | Position in the session feed and the stream's resume cursor. |
| `id` | `string` | Required | Unique identifier of the record. |
| `model` | `string \| null` | Required | |
| `sandbox_id` | `string \| null` | Required | Sandbox that produced this record, when applicable. |
| `session_execution_id` | `string \| null` | Required | Execution that produced the record; null for session-scoped events. |
| `session_id` | `string` | Required | Session containing this record. |
| `session_message_id` | `string \| null` | Required | Message this record receives, delivers, requeues, or echoes. |
| `stream_seq` | `integer` | Required | Position within the execution's stream. |
| `tokens_info` | `object \| null` | Required | Additional properties are not allowed. |
| `tokens_info.cache_creation_input_tokens` | `integer` | Optional | |
| `tokens_info.cache_read_input_tokens` | `integer` | Optional | |
| `tokens_info.cost_usd` | `number` | Optional | |
| `tokens_info.input_tokens` | `integer` | Optional | |
| `tokens_info.num_turns` | `integer` | Optional | |
| `tokens_info.output_tokens` | `integer` | Optional | |
| `tools` | `array \| null` | Required | |
| `tools.[]` | `string` | | |
| `turn_id` | `string \| null` | Required | Turn containing this record, when applicable. |
### session_retrying
Execution will retry after a temporary infrastructure failure before the agent acted.
**Example JSON**
```json
{
"kind": "platform",
"source": "lifecycle",
"record_format": "ellipsis_lifecycle@1",
"record_type": "session_retrying",
"id": "record_example",
"session_id": "session_example",
"session_execution_id": "execution_example",
"turn_id": null,
"session_message_id": null,
"sandbox_id": null,
"feed_seq": 12,
"stream_seq": 8,
"payload": {
"reason": "The sandbox could not be started. Retrying.",
"attempt": 1
},
"tools": null,
"tokens_info": null,
"cost": null,
"duration": null,
"model": null,
"created_at": "2026-09-10T14:00:00Z"
}
```
**Field specification**
| Field | Type | Presence | Details |
| --- | --- | --- | --- |
| `kind` | `string` | Required | Must be "platform". |
| `source` | `string` | Required | Must be "lifecycle". |
| `record_format` | `string` | Required | Must be "ellipsis_lifecycle@1". |
| `record_type` | `string` | Required | Must be "session_retrying". |
| `payload` | `object` | Required | Additional properties are allowed. |
| `payload.attempt` | `integer` | Required | |
| `payload.reason` | `string` | Required | |
| `cost` | `integer \| null` | Required | |
| `created_at` | `string` | Required | Format: date-time. |
| `duration` | `integer \| null` | Required | |
| `feed_seq` | `integer` | Required | Position in the session feed and the stream's resume cursor. |
| `id` | `string` | Required | Unique identifier of the record. |
| `model` | `string \| null` | Required | |
| `sandbox_id` | `string \| null` | Required | Sandbox that produced this record, when applicable. |
| `session_execution_id` | `string \| null` | Required | Execution that produced the record; null for session-scoped events. |
| `session_id` | `string` | Required | Session containing this record. |
| `session_message_id` | `string \| null` | Required | Message this record receives, delivers, requeues, or echoes. |
| `stream_seq` | `integer` | Required | Position within the execution's stream. |
| `tokens_info` | `object \| null` | Required | Additional properties are not allowed. |
| `tokens_info.cache_creation_input_tokens` | `integer` | Optional | |
| `tokens_info.cache_read_input_tokens` | `integer` | Optional | |
| `tokens_info.cost_usd` | `number` | Optional | |
| `tokens_info.input_tokens` | `integer` | Optional | |
| `tokens_info.num_turns` | `integer` | Optional | |
| `tokens_info.output_tokens` | `integer` | Optional | |
| `tools` | `array \| null` | Required | |
| `tools.[]` | `string` | | |
| `turn_id` | `string \| null` | Required | Turn containing this record, when applicable. |
### outbox_collected
A code-review session collected its review output, including raw files, parsed findings, and parsing errors.
**Example JSON**
```json
{
"kind": "platform",
"source": "lifecycle",
"record_format": "ellipsis_lifecycle@1",
"record_type": "outbox_collected",
"id": "record_example",
"session_id": "session_example",
"session_execution_id": "execution_example",
"turn_id": null,
"session_message_id": null,
"sandbox_id": "sandbox_example",
"feed_seq": 12,
"stream_seq": 8,
"payload": {
"raw": {},
"findings": [],
"parse_errors": [],
"parser_version": "1"
},
"tools": null,
"tokens_info": null,
"cost": null,
"duration": null,
"model": null,
"created_at": "2026-09-10T14:00:00Z"
}
```
**Field specification**
| Field | Type | Presence | Details |
| --- | --- | --- | --- |
| `kind` | `string` | Required | Must be "platform". |
| `source` | `string` | Required | Must be "lifecycle". |
| `record_format` | `string` | Required | Must be "ellipsis_lifecycle@1". |
| `record_type` | `string` | Required | Must be "outbox_collected". |
| `payload` | `object` | Required | Additional properties are allowed. |
| `payload.findings` | `array