RaabtaHQ
List human approvals

List human approvals

GET/api/v1/asks

scope asks:readPaginated

Questions 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

NameTypeDescription
limitoptional
integerPage size, 1–100Default: 20
cursoroptional
stringThe `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 }
NameTypeDescription
idrequired
string (uuid)Ask id
run_idrequired
string (uuid)The run parked on this question
assistant_idrequired
string (uuid) | nullThe 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
stringWhat the assistant is asking
contextrequired
string | nullBackground it supplied with the question
optionsrequired
object[]For a choice: the options offered. Empty for every other kind
options[].idrequired
stringPass this back as option_id
options[].labelrequired
stringWhat to show a human
options[].descriptionrequired
string | nullExtra detail, if the assistant gave any
tool_idrequired
string | nullFor a tool_call: the tool the model proposed and has NOT run
tool_inputrequired
map<string, any> | nullThe arguments it proposed
min_rolerequired
stringThe 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 | nullThe decision recorded, once answered
answerrequired
map<string, any> | nullThe answer recorded
answered_byrequired
string (uuid) | nullThe member who answered. Null when an API key, a timeout or a withdrawal settled it
answered_atrequired
string (date-time) | nullWhen it was answered
answer_sourcerequired
string (enum) | nullHow it settledhumantimeoutcancel
created_atrequired
string (date-time)When the assistant asked
updated_atrequired
string (date-time)When it last changed

Errors

StatusCodeWhen
400bad_requestThe request could not be parsed: malformed JSON, an invalid cursor, or a query parameter of the wrong shape.
400validation_errorThe body or query failed validation. `details` lists each failing field with a `path` and a `message`.
401unauthorizedNo usable API key: the Authorization header is missing or malformed, or the key is unknown, revoked or expired. The three are deliberately indistinguishable.
403forbiddenThe 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.
403account_suspendedThe account this key belongs to is suspended. Rotating the key will not help; contact support.
429rate_limitedThe per-key budget, or the per-IP budget for failed authentication, is exhausted. Honour `Retry-After` before retrying.
500internalSomething failed on our side. Safe to retry with the same Idempotency-Key; quote `request_id` if it persists.