workspace
The signed-in caller's workspace (UI-API) — the activity feed (the audit log, filtered to what the caller could already see) and one cheap overview for the workspace rail and the Inbox header.
GET /v1/activity
The activity feed — what happened to what you can see
The audit log as a feed a person can read, newest first (UI-API). A row is visible when the resource's own read rule already grants it to the caller — its owner user, a member of its owner org, or its creator (runs, rollouts, plans, coach sessions) — or when the caller took the action; a row about a repo is shown on that second ground only while the caller can still read the repo. Public repos grant nothing here: this is the caller's feed, not a public timeline. Visibility is part of the query, never a filter over a page, so nothing about a resource the caller cannot see reaches the page arithmetic — not even a count. summary is one sentence the UI can show verbatim; cost_usd is set only on the row where a cost was incurred (a finished run, a coach session, a planner decision, a closed endpoint session), so summing a page never counts a dollar twice. actor.kind says which credential wrote the row; actor.agent is planner only when a plan's planner took the action — an API key is reported as a key, whoever held it.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
actor_kind | query | ActivityActorFilter |
|
resource_type | query | ActivityResourceType | |
since | query | string (date-time) | Only rows at or after this instant (RFC 3339). |
owner | query | Handle | Only rows about resources owned by this handle (user or org). An unknown handle is an empty page, not a 404. |
limit | query | integer | Page size. |
cursor | query | string | Opaque cursor from the previous page's |
Responses
| Status | Description | Body |
|---|---|---|
200 | A page of activity, newest first. | ActivityPage |
401 | Missing or invalid credentials. | Problem |
422 | Request failed validation. | Problem |
GET /v1/me/overview
Counts for the workspace rail and the Inbox header
One cheap call (UI-API): the approval requests awaiting a person on devices the caller can see (the ten newest with their checks), active runs, running endpoints, active plans, devices online, and today's model spend (coach sessions + planner decisions since UTC midnight) with a sentence saying how it was computed. Every count is a query over the same visibility rule as the list endpoint it summarises, so each can be cross-checked against that list.
Responses
| Status | Description | Body |
|---|---|---|
200 | The caller's overview. | MyOverview |
401 | Missing or invalid credentials. | Problem |
Schemas (38)
The schemas these operations reach before any other tag’s do. A type that links elsewhere is rendered on that tag’s page.
ActivityActorFilter
listActivity's actor filter: the three ActivityActorKinds, plus agent — the rows a plan's planner took (actor.agent: planner) or an agent session's key wrote (actor.agent: agent, A1), whichever credential it acted as.
ActivityResourceType
What a row is about. repo, run, rollout, advice_session (a coach call), device, approval_request, approval, endpoint, endpoint_session, plan, api_key, campaign (C3), agent_session (A1), trial (C4 — a real-robot trial or its session), org (O2 — an organization's profile and memberships).
ActivityPage
| Field | Type | Description |
|---|---|---|
items | array of Activity | |
next_cursor | string | null |
MyOverview
| Field | Type | Description |
|---|---|---|
generated_at | string (date-time) | |
viewer | UserPublic | UI2 — the person this credential belongs to (a session's user, or a key's owner): what the workspace rail and the account button print, so a page needs no second call to |
approvals | OverviewApprovals | |
runs | OverviewJobs | Executed runs ( |
endpoints | OverviewJobs | Endpoints queued for a server, or running. |
plans | OverviewPlans | |
rollouts | OverviewJobs | UI2 — sim-gate rollouts the caller can see, queued / running / total. |
devices | OverviewDevices | |
keys | OverviewKeys | null | UI2 — the caller's live API keys, counted; null for a key credential. |
repos | OverviewRepos | W2 — the caller's own repos by kind, for the rail's My models and My datasets. |
model_spend | ModelSpend | |
campaigns | OverviewCampaigns | C3 — what the rail prints beside Campaigns. |
agent | OverviewAgent | A1 — the caller's agent sessions, and those waiting on a person (a spend above the session's pre-approved budget). |
trials | OverviewTrials | C4 — real-robot trials: how many candidates wait on a person's verdict (the Inbox's "needs your verdict" cards) and how many run. |
Activity
One audit-log row, as a person reads it.
| Field | Type | Description |
|---|---|---|
id | Id | |
created_at | string (date-time) | |
action | string | The audit action ( |
actor | ActivityActor | |
resource | ActivityResource | |
summary | string | One sentence, safe to show verbatim — who did what to what. |
outcome | string | null | The state this action left its resource in, when it set one ( |
cost_usd | number | null | USD the hub recorded for this action, set only where the cost was incurred: |
priced | boolean | null | With |
OverviewApprovals
| Field | Type | Description |
|---|---|---|
pending | integer | Pending approval requests on devices the caller can see. |
can_decide | boolean | True for a signed-in session. An API key can never approve or deny (session-only), so for a key this is false and |
items | array of ApprovalRequest | The ten newest, each with |
OverviewJobs
| Field | Type | Description |
|---|---|---|
queued | integer | |
running | integer | |
total | integer | UI2 — every one the caller can see, whatever its status (for runs: imported and plan runs included; the same WHERE as an unfiltered |
OverviewPlans
| Field | Type | Description |
|---|---|---|
active | integer | |
waiting_on_approval | integer | Active plans whose current approval request is still pending a person. |
total | integer | UI2 — every plan the caller can see, whatever its status. |
OverviewDevices
| Field | Type | Description |
|---|---|---|
total | integer | |
online | integer | Devices whose driver posted a signed event (a heartbeat, |
running | integer | Devices running an approval right now ( |
online_window_s | integer |
OverviewKeys
UI2 — the caller's API keys, counted. Present for a session only: a key learns nothing about its siblings, not even how many there are (listKeys is session-scoped for the same reason).
| Field | Type | Description |
|---|---|---|
total | integer | Keys the caller has not revoked. |
OverviewRepos
W2 — the caller's own repositories by kind: every repo owned by the caller's user or by an org they belong to, public and private alike (the WHERE of listRepos?owner= for each of those handles, summed). What the workspace rail prints beside My models and My datasets; /settings/models and /settings/datasets list the same rows through listRepos.
| Field | Type | Description |
|---|---|---|
robots | integer | |
models | integer | |
datasets | integer |
ModelSpend
Model dollars since UTC midnight, over what the caller can see (UI-API).
| Field | Type | Description |
|---|---|---|
usd | number |
|
coach_usd | number | |
plan_usd | number | |
coach_sessions | integer | |
plan_decisions | integer | Planner decisions metered in the window, rejected ones included (they were paid for). |
agent_usd | number | A1 — agent sessions' model calls in the window (list price, from their ledger rows); the sandbox is not model spend. |
agent_calls | integer | A1 — agent model calls metered in the window. |
unpriced | integer | Sessions and decisions metered at $0 because their model has no list price. |
since | string (date-time) | |
until | string (date-time) | |
basis | string | One sentence saying how the number was computed. |
OverviewCampaigns
C3 — campaigns the caller can see; waiting of them have a round waiting on a decision.
| Field | Type | Description |
|---|---|---|
total | integer | |
active | integer | |
waiting | integer |
OverviewAgent
A1 — the caller's agent sessions: how many are live, and the ones waiting on a person (their pending spend approvals, newest first, at most ten sessions).
| Field | Type | Description |
|---|---|---|
live | integer | Sessions not yet ended. |
pending_spend_requests | integer | Spend requests waiting on a person across those sessions — one Inbox item each. |
allowance | AgentAllowance | The rail's "Agent, this month" box: the caller's own account's month-to-date agent spend against the free allowance. |
running | integer | |
waiting_on_you | integer | |
waiting_on_event | integer | |
idle | integer | |
sleeping | integer | AG1 — sessions asleep (nothing pending, nothing billing). |
total | integer | |
waiting | array of OverviewAgentWaiting | |
pending_decisions | integer | AG1 — decisions waiting on a person across the caller's sessions (plan, spend and shortlist; a handoff is the device consent request already counted in |
decisions | array of AgentDecision | AG1 — those decisions, newest first, at most ten (the Inbox's cards). Light: |
model_backend | string | P2 — whether the hub's model backend (the agent, the Coach, the planner) can answer right now, as this API process last learned it: |
OverviewTrials
C4 — real-robot trials the caller can see.
| Field | Type | Description |
|---|---|---|
needs_verdict | integer | |
running | integer | |
items | array of OverviewTrialItem | The newest trials that need a verdict — the Inbox's cards. |
ActivityResource
| Field | Type | Description |
|---|---|---|
type | ActivityResourceType | |
id | string | The resource's id ( |
label | string | A display name: a repo's full name, a plan's task, a device's name, |
owner | RepoOwner | null | The resource's owner (user or org), as recorded when the row was written. |
parent | ActivityResourceRef | null | The resource a page is reached through, for resources without a page of their own: the device of an approval request or approval, the endpoint of an endpoint session, the run a coach session read. |
AgentAllowance
The owner's free monthly allowance for agent model + sandbox spend (no payment system exists yet).
| Field | Type | Description |
|---|---|---|
period_start | string (date-time) | |
resets_at | string (date-time) | The first of next month, UTC. |
payment_method | string |
|
limit_usd | number | |
used_usd | number | |
remaining_usd | number | |
basis | string | One sentence saying how |
OverviewAgentWaiting
A session waiting on a person — the Inbox's card.
| Field | Type | Description |
|---|---|---|
session_id | Id | |
goal | string | |
approvals | array of AgentApproval | |
since | string (date-time) |
AgentDecision
AG1 — one decision the session waits on or waited on, in one shape for the four kinds; the kind-specific part is plan, approval, shortlist or handoff. Every pending one is also counted and listed in MyOverview.agent (the Inbox).
| Field | Type | Description |
|---|---|---|
id | Id | |
session_id | Id | |
kind | AgentDecisionKind | |
status | AgentDecisionStatus | |
title | string | The card's title, e.g. "Spend · R5 · yaw", "Shortlist for the robot — pick up to 2 of 3". |
sentence | string | What would happen, in one sentence (hub-generated from the call or the round). |
why | string | null | Why it waits — e.g. "Outside the plan you approved and over the $3.00 per-run limit, so it waits for you." (hub-generated). |
on_deny | string | null | What happens if it is denied or left to expire. |
proposal | string | null | The agent's own words for what it proposes, quoted as written. |
budget_usd | number | null | A spend — the session's compute budget when it was asked. |
budget_after_usd | number | null | A spend — what would stay of that budget if the call ran to its cap ("After it, $3.90 of $10.00 stays"). |
raise_to_usd | number | null | A spend — the amount the second button offers as |
expires_at | string (date-time) | null (date-time) | |
created_at | string (date-time) | |
resolved_at | string (date-time) | null (date-time) | |
resolved_by | UserPublic | null | |
resolved_via | string | null | |
outcome | string | null | What the answer was, in words (approved up to $X, denied with the note, shortlisted 1600 and 1900, …). |
answer_via | AgentDecisionAnswer | null | |
links | AgentLinks | null | What the decision is about. P1: an approved spend whose held call then created a run names that run ( |
plan | AgentPlanRef | null | |
approval | AgentApproval | null | |
shortlist | AgentShortlist | null | |
handoff | AgentHandoff | null |
OverviewTrialItem
| Field | Type | Description |
|---|---|---|
id | Id | |
index | integer | |
of | integer | |
label | string | |
status | TrialStatus | |
device | string | null | |
campaign | string | null | |
round | integer | null | |
tilt_max_deg | number | null | |
criteria_failed | integer | |
criteria_total | integer | |
stopped_at | string (date-time) | null (date-time) |
ActivityResourceRef
| Field | Type | Description |
|---|---|---|
type | ActivityResourceType | |
id | string |
AgentApproval
One spend the agent asked for above its session's budget: the tool call exactly as the model made it, and what the hub estimated it would cost.
| Field | Type | Description |
|---|---|---|
id | Id | |
session_id | Id | |
tool_use_id | string | |
tool | string | The tool the model called ( |
arguments | object | The tool call's arguments as the model produced them; approving runs exactly these. |
estimate_usd | number | The hub's estimate of what the call will cost. |
cap_usd | number | The most it can cost ("at most"): the run's own |
rule | AgentSpendRule | null | |
budget_usd | number | null | The session's pre-approved budget when the call was made. |
budget_remaining_usd | number | null | |
reason | string | Why it needs a person — the estimate against what is left of the budget. |
status | AgentApprovalStatus | |
requested_at | string (date-time) | |
resolved_at | string (date-time) | null (date-time) | |
resolved_by | UserPublic | null | |
resolved_via | string | null |
|
note | string | null | |
expires_at | string (date-time) | null (date-time) | AG1 — when a pending spend stops waiting: the end of the session's window when it was asked ( |
decision_id | string | null | AG1 — the |
AgentDecisionKind
plan — approve the agent's plan (approveAgentPlan, session-only; reply in words to change it); spend — a compute call outside the approved plan (resolveAgentApproval); shortlist — pick up to 2 of a round's checkpoints for the real robot (decideRound {action: shortlist}, session-only); handoff — a device consent request, which links to the consent page and is never approved here.
AgentDecisionStatus
pending — waits for a person; resolved — a person (or, for a handoff, the device's consent decision) answered; expired — nobody answered by expires_at (a spend), nothing ran; withdrawn — the session ended, a newer plan replaced it, or the round moved on.
AgentDecisionAnswer
The operation that answers a decision; null for a handoff (the consent page does).
| Field | Type | Description |
|---|---|---|
operation_id | string | |
method | string | |
path | string | The API path with every id filled in. |
AgentLinks
The hub resources a tool call touched, for the page to open.
| Field | Type | Description |
|---|---|---|
run_id | string | null | |
rollout_id | string | null | |
request_id | string | null | |
consent_path | string | null | The web app's consent page for a device request ( |
endpoint_id | string | null | |
plan_id | string | null | |
repo | string | null |
|
campaign | string | null | AG1 — the campaign's slug. |
round_n | integer | null | AG1 — the campaign round. |
round_id | string | null | |
decision_id | string | null | AG1 — a decision card of this session. |
agent_plan_id | string | null | AG1 — a plan version of this session (not an M16 plan, which is |
checkpoint_step | integer | null | AG1 — a checkpoint of |
device_id | string | null | |
approval_id | string | null | P1 — an |
AgentPlanRef
| Field | Type | Description |
|---|---|---|
id | Id | |
version | integer | |
status | AgentPlanStatus | |
cap_usd | number | |
rounds | integer | How many rounds it lists. |
AgentShortlist
The shortlist decision's content — the Shortlist board, read live from the hub's rows on every request.
| Field | Type | Description |
|---|---|---|
round | RunRound | |
round_id | string | null | |
run_id | string | null | |
max_picks | integer | 2 — the founder's "at most two checkpoints to the real robot". |
picks | array of integer | The agent's picks, pre-checked. |
why | string | null | The agent's reason for its picks, quoted as written. |
candidates | array of AgentShortlistCandidate | |
control | AgentShortlistControl | null | |
separates | boolean | null |
|
separates_sentence | string | null | |
device | AgentDeviceRef | null | The device the consent requests will be filed for (the agent's choice, else the only registered device that accepts the model's contract); null — none does, and none will be filed. |
devices | array of AgentDeviceRef | The owner's devices that accept the model's contract. |
minutes | integer | The run window each consent request asks for. |
scan | object | |
battery | string | |
seeds | integer | |
executor | string | null | |
sentence | string | E.g. "the 20-seed band scan on your picks first (13 cells × 20 seeds with video), not billed". |
answer | object | null | What the person shortlisted ( |
candidates | array of integer | |
note | string | null | |
by | UserPublic | null | |
at | string (date-time) | |
followup | AgentShortlistFollowup | null |
AgentHandoff
A device consent request filed for a shortlisted checkpoint — a link to the consent page, never an approval here.
| Field | Type | Description |
|---|---|---|
request_id | Id | |
consent_path | string |
|
status | ApprovalRequestStatus | |
device | AgentDeviceRef | null | |
model_repo | string | null | |
step | integer | null | |
minutes | integer | null |
AgentSpendRule
Which rule judged a spending call, with the numbers: the per-run limit its cap was held to, the budget it had to fit (the campaign's inside a campaign, else the session's, else none), what that budget had already committed, and the worst case if this call runs to its cap.
| Field | Type | Description |
|---|---|---|
level | string |
|
in_plan | boolean | null | AG1 — for a compute call, whether the approved plan names it. |
plan_id | string | null | AG1 — the approved plan the call was judged against. |
plan_round | string | null | AG1 — the plan round it is (its key), when it is one. |
grant_usd | number | null | AG1 — the standing allowance a person granted, when one is in force. |
grant_remaining_usd | number | null | AG1 — what was left of it before this call. |
per_run_limit_usd | number | |
budget_usd | number | null | The budget the call had to fit in; null when only the per-run limit applies. |
committed_usd | number | What that budget had already committed (approved caps) before this call. |
worst_case_usd | number |
|
campaign_id | string | null | |
within | boolean | True when the call was inside the rule (auto-approved). |
sentence | string | One sentence for the card, e.g. "Inside Omni walk's rules: $20.00 budget, $3.00 per run." |
AgentApprovalStatus
auto_approved — inside the rules (the per-run limit, and the session budget or the campaign's budget when there is one), so it ran without asking, and is still recorded and shown; pending — over them, waiting for a person; approved / denied — a person answered; canceled — withdrawn because the session ended before anyone answered; expired (AG1) — nobody answered by expires_at, so it did not run.
AgentPlanStatus
proposed — waiting for a person; approved — a person approved it (session-only), its rounds are the contract; edited — a newer version replaced it before anyone approved it; withdrawn — the session ended, or the agent withdrew it, before anyone approved it.
AgentShortlistCandidate
One column of the Shortlist board — a checkpoint of the round's run, as the hub measured it.
| Field | Type | Description |
|---|---|---|
step | integer | |
pick | boolean | The agent's pick (pre-checked); the person changes it. |
verdict | RoundVerdictValue | |
gates | array of RoundGateResult | The round's locked gates at this step, measured. |
gates_passed | integer | |
gates_total | integer | Counted (locked) gates. |
cells_passed | integer | null | The hub's band rule at this step, cells passing (the 13-cell strip's number). |
cells_total | integer | null | |
cells | array of CheckpointGateCell | |
failing_cells | array of string | The cells that FAIL the band at this step (the "two cells that mattered"). |
seeds | integer | null | Seeds behind the measurement (5 while training, 20 after the band scan). |
source | string | null | |
mean_reward | number | null | The metrics line at this step ( |
noise_std | number | null | |
lineage | string | null | E.g. "laika-omni-c2-700 · 700 → 1600, 900 into R4". |
cost_to_step_usd | number | null | What the run had cost when this checkpoint was published ( |
poster_url | string (uri) | null (uri) | |
gate_rollout_id | string | null | |
render | AgentRenderRef | null |
AgentShortlistControl
C3b's control beside the candidates — the checkpoint the round started from, judged by the same locked gates.
| Field | Type | Description |
|---|---|---|
role | RoundControlRole | |
label | string | null | |
run_id | string | null | |
step | integer | null | |
model_repo | string | null | |
status | RoundControlStatus | |
verdict | RoundVerdictValue | null | |
gates | array of RoundGateResult | |
gates_passed | integer | null | |
gates_total | integer | null | |
cells_passed | integer | null | |
cells_total | integer | null | |
cells | array of CheckpointGateCell | |
mean_reward | number | null |
AgentDeviceRef
| Field | Type | Description |
|---|---|---|
id | Id | |
name | string |
AgentShortlistFollowup
What happens after a person shortlists (the hub does it, not the model): the 20-seed scan on the picks first — or the round's own band scan, when it already measured them — then one device consent request per pick that still passes the round's locked gates, with the person's note as its reason.
| Field | Type | Description |
|---|---|---|
state | string | |
scan_id | string | null | |
reused_round_scan | boolean | True when the round's band scan already measured the picks, so no new scan was queued. |
results | array of AgentShortlistResult | |
error | string | null | |
updated_at | string (date-time) | null (date-time) |
AgentRenderRef
The latest three-view render of a candidate's gate (renderRollout), with its videos once it finished.
| Field | Type | Description |
|---|---|---|
rollout_id | Id | |
status | JobStatus | |
matches | boolean | null |
|
claimed_at | string (date-time) | null (date-time) | |
finished_at | string (date-time) | null (date-time) | |
video_urls | map of string (uri) | Presigned 1-hour GETs of the rendered cell's views ( |
expected_s | number | null | P1 — how long a render takes on this render's executor, measured on this hub ( |
expected_samples | integer | P1 — how many finished renders |
AgentShortlistResult
| Field | Type | Description |
|---|---|---|
step | integer | |
state | string |
|
verdict | RoundVerdictValue | null | The step's verdict by the round's locked gates after the scan. |
request_id | string | null | |
consent_path | string | null | |
reason | string | null |