List approvals.
const url = 'https://shiftagent.example.com/approvals?limit=20&status=pending';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://shiftagent.example.com/approvals?limit=20&status=pending' \ --header 'Authorization: Bearer <token>'Lists HITL approvals across the key’s subtree, newest first. Filter by ?tenant_id=, ?user_id=, ?conversation_id=, and/or ?status= (a pending-approvals inbox is ?status=pending&tenant_id=…). Serves hosts that poll instead of (or in addition to) consuming approval_required stream events.
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Query Parameters
Section titled “Query Parameters ”Page size (1–100).
Cursor: return items after this object ID (forward pagination). Use the id of the last item of the previous page.
Cursor: return items before this object ID (backward pagination). Mutually exclusive with starting_after.
Restrict to one tenant.
Restrict to conversations owned by one user.
Restrict to one conversation.
Filter by approval status.
Responses
Section titled “ Responses ”A page of approvals.
object
Envelope discriminator.
The page of items.
Whether more items exist beyond this page.
Opaque cursor for the next page (pass as starting_after). Null when has_more is false.
A human-in-the-loop gate raised by the agent mid-run. Resolution requires a signed assertion minted with a per-tenant approver key (never the sk_int_ service key).
object
The assistant message parked on this approval.
expired — expires_at passed unresolved; the parked run ended failed.
Agent-stated explanation of why approval is needed.
What the agent needs (actions and/or secrets).
One thing the agent needs to proceed.
object
action — permission to perform a described action; secret — a credential to be supplied under alias via the approve body’s secrets map.
Agent-stated need, human-readable.
For secret items — the alias to vault the value under.
Resolution deadline; sticky sandboxes stay warm until then.
Approver-key identity that resolved it (e.g. approver_key:apk_…); null while pending.
Resolution time; null while pending.
RFC 3339 / ISO 8601 timestamp, UTC.
RFC 3339 / ISO 8601 timestamp, UTC.
Example
{ "object": "list", "data": [ { "object": "approval", "status": "pending", "requested_items": [ { "kind": "action" } ] } ]}Bad request — malformed body/parameters or an invalid parameter combination (e.g. neither or both of user_id/tenant_id on listConversations, or both pagination cursors).
RFC 9457 problem+json error envelope. type is a URI under https://shiftagent.example.com/problems/{slug} (deployment host substituted); see the API-level problem registry for every slug.
object
Problem type URI (registry slug).
Short, human-readable summary of the problem type.
HTTP status code.
Human-readable explanation specific to this occurrence.
URI reference identifying this occurrence.
Correlation ID for support and log lookup.
On name-conflict, external-id-conflict, and resource-in-use: the ID of the existing/depended-on resource — fetch it and continue (replay recovery).
On validation-error, field-level details.
object
JSON pointer to the offending field.
What failed.
Examples
Invalid parameter combination
{ "type": "https://shiftagent.example.com/problems/validation-error", "title": "Invalid request", "status": 400, "detail": "Exactly one of user_id or tenant_id is required.", "request_id": "req_01hzx8bad001"}Missing or invalid credentials — no bearer token, an unknown/revoked sk_int_ key, or an expired platform JWT.
RFC 9457 problem+json error envelope. type is a URI under https://shiftagent.example.com/problems/{slug} (deployment host substituted); see the API-level problem registry for every slug.
object
Problem type URI (registry slug).
Short, human-readable summary of the problem type.
HTTP status code.
Human-readable explanation specific to this occurrence.
URI reference identifying this occurrence.
Correlation ID for support and log lookup.
On name-conflict, external-id-conflict, and resource-in-use: the ID of the existing/depended-on resource — fetch it and continue (replay recovery).
On validation-error, field-level details.
object
JSON pointer to the offending field.
What failed.
Examples
Missing or invalid bearer token
{ "type": "https://shiftagent.example.com/problems/insufficient-scope", "title": "Unauthorized", "status": 401, "detail": "Provide a valid sk_int_ service key or platform JWT.", "request_id": "req_01hzx8auth001"}