List human approvals
GET/api/v1/asks
scope
asks:readPaginatedQuestions assistants are parked on, newest first. A run raising one stops until it is answered or expires_at passes, at which point on_timeout decides. If you grant runs:start, watch ?status=pending — an unanswered ask holds that conversation’s only run slot.
Query parameters
| Name | Type | Description |
|---|---|---|
limitoptional | integer | Page size, 1–100Default: 20 |
cursoroptional | string | The `next_cursor` from the previous page |
statusoptional | string (enum) | Only asks in this statependingansweredexpiredcancelled |
run_idoptional | string (uuid) | Only asks raised by this run |
kindoptional | string (enum) | Only asks of this kindapprovalchoiceinputtool_call |
Request
curl "https://your-crm.example.com/api/v1/asks?status=pending" \
-H "Authorization: Bearer $RAABTA_API_KEY"Response · 200 OK
{
"data": [
{
"id": "6d7e8f9a-0b1c-4d2e-8f3a-4b5c6d7e8f9a",
"run_id": "3f9a1c2e-5b7d-4e8f-9a0b-1c2d3e4f5a6b",
"assistant_id": "8f2c1d3e-4a5b-4c6d-9e0f-1a2b3c4d5e6f",
"kind": "approval",
"status": "pending",
"question": "Offer Ayesha a free reschedule outside the 24-hour window?",
"context": "She cancelled 3 hours before her slot and has been a customer for two years.",
"options": [],
"tool_id": null,
"tool_input": null,
"min_role": "admin",
"expires_at": "2026-09-03T09:00:00.000Z",
"on_timeout": "reject",
"decision": null,
"answer": null,
"answered_by": null,
"answered_at": null,
"answer_source": null,
"created_at": "2026-09-02T09:01:40.000Z",
"updated_at": "2026-09-02T09:01:40.000Z"
}
],
"meta": {
"next_cursor": null,
"has_more": false,
"limit": 20
}
}Response
Wrapped in { data: [...], meta }| Name | Type | Description |
|---|---|---|
idrequired | string (uuid) | Ask id |
run_idrequired | string (uuid) | The run parked on this question |
assistant_idrequired | string (uuid) | null | The assistant that asked |
kindrequired | string (enum) | What kind of answer the run needsapprovalchoiceinputtool_call |
statusrequired | string (enum) | Only a pending ask can be answeredpendingansweredexpiredcancelled |
questionrequired | string | What the assistant is asking |
contextrequired | string | null | Background it supplied with the question |
optionsrequired | object[] | For a choice: the options offered. Empty for every other kind |
options[].idrequired | string | Pass this back as option_id |
options[].labelrequired | string | What to show a human |
options[].descriptionrequired | string | null | Extra detail, if the assistant gave any |
tool_idrequired | string | null | For a tool_call: the tool the model proposed and has NOT run |
tool_inputrequired | map<string, any> | null | The arguments it proposed |
min_rolerequired | string | The dashboard role floor for answering. NOT enforced for API keys, where the asks:answer scope is the gate |
expires_atrequired | string (date-time) | After this the on_timeout rule applies automatically |
on_timeoutrequired | string (enum) | What happens if nobody answers in timerejectapprovehandofffail |
decisionrequired | string | null | The decision recorded, once answered |
answerrequired | map<string, any> | null | The answer recorded |
answered_byrequired | string (uuid) | null | The member who answered. Null when an API key, a timeout or a withdrawal settled it |
answered_atrequired | string (date-time) | null | When it was answered |
answer_sourcerequired | string (enum) | null | How it settledhumantimeoutcancel |
created_atrequired | string (date-time) | When the assistant asked |
updated_atrequired | string (date-time) | When it last changed |
Errors
| Status | Code | When |
|---|---|---|
| 400 | bad_request | The request could not be parsed: malformed JSON, an invalid cursor, or a query parameter of the wrong shape. |
| 400 | validation_error | The body or query failed validation. `details` lists each failing field with a `path` and a `message`. |
| 401 | unauthorized | No usable API key: the Authorization header is missing or malformed, or the key is unknown, revoked or expired. The three are deliberately indistinguishable. |
| 403 | forbidden | The key is valid but lacks the scope this endpoint requires, or the request came from an address outside the key’s IP allowlist. The message says which. |
| 403 | account_suspended | The account this key belongs to is suspended. Rotating the key will not help; contact support. |
| 429 | rate_limited | The per-key budget, or the per-IP budget for failed authentication, is exhausted. Honour `Retry-After` before retrying. |
| 500 | internal | Something failed on our side. Safe to retry with the same Idempotency-Key; quote `request_id` if it persists. |