A valid request URL is required to generate request examples{
"runs": [
{
"runId": "<string>",
"agentRunId": "<string>",
"deviceId": "<string>",
"goal": "<string>",
"executor": "phonebase",
"state": "queued",
"stepSeq": 123,
"maxSteps": 123,
"deadlineAt": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"workerFirstContactAt": "2023-11-07T05:31:56Z",
"initiator": {
"kind": "api_key",
"viaCopilot": true,
"userId": "<string>",
"apiKeyId": "<string>",
"onBehalfOf": {
"kind": "schedule",
"scheduleId": "<string>",
"userId": "<string>",
"apiKeyId": "<string>"
}
},
"scheduleId": "<string>",
"pausedAt": "2023-11-07T05:31:56Z",
"manualControlUntil": "2023-11-07T05:31:56Z",
"lastFrame": {
"frameId": "<string>",
"viewport": {
"width": 123,
"height": 123
}
},
"recovery": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"since": "2023-11-07T05:31:56Z",
"remainingMs": 4503599627370495,
"blockedReason": null
},
"reason": "worker_reported_failure",
"detail": "<string>"
}
],
"nextBefore": "<string>"
}{
"error": {
"code": "backend_resolution_failed",
"message": "<string>",
"retryable": true
}
}{
"error": {
"code": "unauthorized",
"reason": "missing_credentials",
"hint": "<string>"
}
}{
"error": {
"code": "backend_resolution_failed",
"message": "<string>",
"retryable": true
}
}{
"error": {
"code": "rate_limited",
"message": "<string>"
}
}{
"error": {
"code": "backend_resolution_failed",
"message": "<string>",
"retryable": true
}
}List your runs
Your organisation’s runs, newest first. Each entry carries the goal the run was started with and how it ended, so a run is still readable long after it finished and a lost runId is recoverable. Page with the nextBefore cursor a full page hands back; when it is absent you have reached the end.
A valid request URL is required to generate request examples{
"runs": [
{
"runId": "<string>",
"agentRunId": "<string>",
"deviceId": "<string>",
"goal": "<string>",
"executor": "phonebase",
"state": "queued",
"stepSeq": 123,
"maxSteps": 123,
"deadlineAt": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"workerFirstContactAt": "2023-11-07T05:31:56Z",
"initiator": {
"kind": "api_key",
"viaCopilot": true,
"userId": "<string>",
"apiKeyId": "<string>",
"onBehalfOf": {
"kind": "schedule",
"scheduleId": "<string>",
"userId": "<string>",
"apiKeyId": "<string>"
}
},
"scheduleId": "<string>",
"pausedAt": "2023-11-07T05:31:56Z",
"manualControlUntil": "2023-11-07T05:31:56Z",
"lastFrame": {
"frameId": "<string>",
"viewport": {
"width": 123,
"height": 123
}
},
"recovery": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"since": "2023-11-07T05:31:56Z",
"remainingMs": 4503599627370495,
"blockedReason": null
},
"reason": "worker_reported_failure",
"detail": "<string>"
}
],
"nextBefore": "<string>"
}{
"error": {
"code": "backend_resolution_failed",
"message": "<string>",
"retryable": true
}
}{
"error": {
"code": "unauthorized",
"reason": "missing_credentials",
"hint": "<string>"
}
}{
"error": {
"code": "backend_resolution_failed",
"message": "<string>",
"retryable": true
}
}{
"error": {
"code": "rate_limited",
"message": "<string>"
}
}{
"error": {
"code": "backend_resolution_failed",
"message": "<string>",
"retryable": true
}
}Authorizations
The control surface credential. Send Authorization: Bearer <token>.
Two kinds of token are accepted and they are told apart by shape, not by a separate header. A token beginning pbk_ is an org scoped API key, whose public half and secret half are generated together and of which only a hash of the secret is ever stored; anything else is treated as an OAuth 2.1 access token and verified against the authorization server's keys.
Both resolve to the same context: an org, a principal and a set of scopes. Nothing downstream branches on which channel you used, with one deliberate exception, key management, which requires a signed-in person so that a key can never mint another key.
Scopes are enforced when MCP tools are REGISTERED rather than when they are called, so a tool your credential cannot use is absent from tools/list rather than refused mid gesture.
Query Parameters
How many runs to return, 1 to 200. Defaults to 50. A value above 200 is refused, not clamped: page with the cursor instead.
1 <= x <= 200Only runs a particular schedule started. A run with no schedule behind it was started by a person or a key, and is never matched by this filter.
NO OPERATION ON THIS SURFACE CREATES, NAMES OR LISTS A SCHEDULE, so there is nowhere here to go looking for an id to send. Two things hand you one: a schedule.triggered webhook delivery, which is where a schedule id reaches a caller in the first place, and the scheduleId on a run you have already read, which lets you ask for that schedule's other runs. If you receive no webhooks, this filter has no input worth chasing.
Opaque cursor from a previous page's nextBefore. Returns only runs older than it. Treat it as opaque: its form is not part of this contract. Send it only when you have one: an empty value is refused, not read as the first page.
1Return only runs in this state. A run whose deadline has passed counts as failed here, because that is what it already is.
A run state.
queued, running, needs_user_control, paused, succeeded, failed, canceled