RaabtaHQ
Get a human approval

Get a human approval

GET/api/v1/asks/{id}

scope asks:read

One ask, with the options offered and what the assistant proposed to do.

Path parameters

NameTypeDescription
idrequired
string (uuid)Ask id
Request
curl "https://your-crm.example.com/api/v1/asks/6d7e8f9a-0b1c-4d2e-8f3a-4b5c6d7e8f9a" \
  -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"
  }
}

Response

Wrapped in { data: … }
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
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.
404not_foundNo such resource in this account. A resource that exists in another account also returns this.
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.