Skip to content

Runs

Report agent and harness activity and progress, and see which runs are still active.

OperationRequest
List runsGET /v1/runs
End runPOST /v1/runs/{id}/end
Heartbeat runPUT /v1/runs/{id}/heartbeat

List runs

GET /v1/runs · listRuns

Private to the signed-in account. Live means not ended and a heartbeat received less than three minutes ago. Output and progress are host-reported Unix milliseconds, separate from receipt time. List filters combine with AND; live=false selects expired or ended runs. Results are newest receipt first, with run ID breaking ties. At most 512 runs; reports disappear from the list after 24 hours without a heartbeat, or 24 hours after ending. Use a fresh ID for a new run. Heartbeat body run must match the path ID. Run kind, harness, harness session, computer, and agent stay fixed; output and progress cannot move backward. Send at most once a minute except on status changes. An exact retry within a minute succeeds without extending presence; the same report after a minute refreshes it. Limits: 12 accepted heartbeats per run and 120 per account in a rolling minute, including status changes; 8 KiB heartbeat body. Repeated end requests succeed for a known ID. Heartbeats for an ended ID conflict while its record is kept. Reports grant no execution or steering authority. Responses are private and no-store.

Sign-in: a bearer credential in the Authorization header.

appBearer: A live app sess_ session or oa_sk_ sign-in key. Account-bound oak_ keys are accepted only where the operation declares them and their scopes permit it. API cookies are ignored.

Parameters

NameInTypeRequiredDescription
livequerybooleanNo
issuequeryintegerNo

Response

200 — The account's runs or a successful update.

Type: RunList

FieldTypeRequiredDescription
runsarray of RunHeartbeatYes
runs[].runstringYes

An identifier other than . or .. .

runs[].kindone of "app_chat", "terminal", "cloud_work", "landing"Yes
runs[].harnessstringYes

An identifier other than . or .. .

runs[].harness_sessionstring or nullNo
runs[].computerstringYes

An identifier other than . or .. .

runs[].issuesarray of integerNo

Default: [].

runs[].statusone of "idle", "working", "awaiting_input", "errored"Yes
runs[].last_output_atinteger (int64)Yes

Unix milliseconds, at most one minute ahead of server time.

runs[].last_progress_atinteger (int64) or nullNo
runs[].notestring or nullNo

One line, fewer than 200 UTF-8 bytes, with no control characters.

runs[].agentstring or nullNo

Agent definition ID, never an agent name.

Errors

StatusMeaningBody
400, 401, 403, 404, 409, 413, 429, 503

Invalid request, signed out, denied, missing run, run_ended/run_conflict, body too large, rate_limited/quota_exhausted, or unavailable.

AppAccountError

Example

curl 'https://api.openagents.com/v1/runs' \
  -H "Authorization: Bearer $OPENAGENTS_TOKEN"

In the Rust SDK

End run

POST /v1/runs/{id}/end · endRun

Private to the signed-in account. Live means not ended and a heartbeat received less than three minutes ago. Output and progress are host-reported Unix milliseconds, separate from receipt time. List filters combine with AND; live=false selects expired or ended runs. Results are newest receipt first, with run ID breaking ties. At most 512 runs; reports disappear from the list after 24 hours without a heartbeat, or 24 hours after ending. Use a fresh ID for a new run. Heartbeat body run must match the path ID. Run kind, harness, harness session, computer, and agent stay fixed; output and progress cannot move backward. Send at most once a minute except on status changes. An exact retry within a minute succeeds without extending presence; the same report after a minute refreshes it. Limits: 12 accepted heartbeats per run and 120 per account in a rolling minute, including status changes; 8 KiB heartbeat body. Repeated end requests succeed for a known ID. Heartbeats for an ended ID conflict while its record is kept. Reports grant no execution or steering authority. Responses are private and no-store.

Sign-in: a bearer credential in the Authorization header.

appBearer: A live app sess_ session or oa_sk_ sign-in key. Account-bound oak_ keys are accepted only where the operation declares them and their scopes permit it. API cookies are ignored.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Response

200 — The account's runs or a successful update.

Type: RunOk

FieldTypeRequiredDescription
okalways trueYes

Errors

StatusMeaningBody
400, 401, 403, 404, 409, 413, 429, 503

Invalid request, signed out, denied, missing run, run_ended/run_conflict, body too large, rate_limited/quota_exhausted, or unavailable.

AppAccountError

Example

curl -X POST 'https://api.openagents.com/v1/runs/{id}/end' \
  -H "Authorization: Bearer $OPENAGENTS_TOKEN"

In the Rust SDK

Heartbeat run

PUT /v1/runs/{id}/heartbeat · heartbeatRun

Private to the signed-in account. Live means not ended and a heartbeat received less than three minutes ago. Output and progress are host-reported Unix milliseconds, separate from receipt time. List filters combine with AND; live=false selects expired or ended runs. Results are newest receipt first, with run ID breaking ties. At most 512 runs; reports disappear from the list after 24 hours without a heartbeat, or 24 hours after ending. Use a fresh ID for a new run. Heartbeat body run must match the path ID. Run kind, harness, harness session, computer, and agent stay fixed; output and progress cannot move backward. Send at most once a minute except on status changes. An exact retry within a minute succeeds without extending presence; the same report after a minute refreshes it. Limits: 12 accepted heartbeats per run and 120 per account in a rolling minute, including status changes; 8 KiB heartbeat body. Repeated end requests succeed for a known ID. Heartbeats for an ended ID conflict while its record is kept. Reports grant no execution or steering authority. Responses are private and no-store.

Sign-in: a bearer credential in the Authorization header.

appBearer: A live app sess_ session or oa_sk_ sign-in key. Account-bound oak_ keys are accepted only where the operation declares them and their scopes permit it. API cookies are ignored.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

Content type: application/json

Type: RunHeartbeat

FieldTypeRequiredDescription
runstringYes

An identifier other than . or .. .

kindone of "app_chat", "terminal", "cloud_work", "landing"Yes
harnessstringYes

An identifier other than . or .. .

harness_sessionstring or nullNo
computerstringYes

An identifier other than . or .. .

issuesarray of integerNo

Default: [].

statusone of "idle", "working", "awaiting_input", "errored"Yes
last_output_atinteger (int64)Yes

Unix milliseconds, at most one minute ahead of server time.

last_progress_atinteger (int64) or nullNo
notestring or nullNo

One line, fewer than 200 UTF-8 bytes, with no control characters.

agentstring or nullNo

Agent definition ID, never an agent name.

Response

200 — The account's runs or a successful update.

Type: RunOk

FieldTypeRequiredDescription
okalways trueYes

Errors

StatusMeaningBody
400, 401, 403, 404, 409, 413, 429, 503

Invalid request, signed out, denied, missing run, run_ended/run_conflict, body too large, rate_limited/quota_exhausted, or unavailable.

AppAccountError

Example

curl -X PUT 'https://api.openagents.com/v1/runs/{id}/heartbeat' \
  -H "Authorization: Bearer $OPENAGENTS_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
  "run": "string",
  "kind": "app_chat",
  "harness": "string",
  "computer": "string",
  "status": "idle",
  "last_output_at": 0
}'

In the Rust SDK