Skip to main content
GET
Error

Authorizations

Authorization
string
header
required

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

deviceId
string

Only receipts for this device. Omit for every device the credential can see.

agentRunId
string

Only receipts produced by this agent run, which is how you rebuild one run's action sequence without pulling every receipt for the device and filtering client side. Matching is on the run's own receipts, not on a name prefix, so a run id that begins with another run's id does not collect its receipts. An empty value is refused rather than answered with everything.

Minimum string length: 1
status
enum<string>

Only receipts in this state. failed is the usual one: it is how you list what went wrong without reading everything that went right. A receipt state.

Available options:
pending,
committed,
failed
actorUserId
string

Only actions taken by this person, by the subject id you read off actor.userId. Mutually exclusive with actorApiKeyId: an actor is a person or a key and never both, so asking for both is refused rather than answered with an empty page. An empty value is refused too.

Minimum string length: 1
actorApiKeyId
string

Only actions taken by this key, by the id you read off actor.apiKeyId or from GET /v1/api-keys. This is the answer to "a key was public for eleven hours, what did it do". Mutually exclusive with actorUserId.

Minimum string length: 1
limit
integer

How many receipts to return. Defaults to 50; larger values are clamped to 200 rather than refused.

Required range: x >= 1
before
string<date-time>

Keyset cursor, first half: the nextBefore of the previous page, passed back unchanged. On its own it also works as a plain time bound, returning receipts recorded strictly before this timestamp.

beforeKey
string

Keyset cursor, second half: the nextBeforeKey of the previous page. Send it whenever you send before from a previous page. Paging with before alone cannot separate receipts that share a timestamp, and under concurrent dispatch many do.

Response

A page of receipts.

A page of receipts, newest first.

receipts
object[]
required
nextBefore
string<date-time>

Send back as before for the next page, TOGETHER with nextBeforeKey. ABSENT on the last page, which is how paging ends. It carries microsecond precision; pass it back unchanged rather than reformatting it, because a value rounded to milliseconds skips rows.

nextBeforeKey
string

The other half of the cursor. Send back as beforeKey. Receipts are ordered by timestamp AND key, so a cursor without this half cannot resume correctly when several receipts share a timestamp, which is the normal case under concurrent dispatch.