RaabtaHQ
Set an assistant’s tools

Set an assistant’s tools

PUT/api/v1/assistants/{id}/tools

scope assistants:write

Grants and revokes tools in one call. Send only the tools you have an opinion about — anything you omit falls back to the catalogue default rather than being switched off, so an empty list resets the assistant to defaults rather than disarming it. gated tool ids stop for a human approval before running; tools with sensitivity: critical do that regardless. PUT rather than PATCH because both lists are replaced wholesale.

Path parameters

NameTypeDescription
idrequired
string (uuid)Assistant id

Body

application/json
NameTypeDescription
toolsrequired
map<string, boolean>Tool id to on or off. Omitted tools take the catalogue default
gated_toolsoptional
string[]Tool ids that must raise a human approval first. Replaces the whole list
Request
curl -X PUT "https://your-crm.example.com/api/v1/assistants/8f2c1d3e-4a5b-4c6d-9e0f-1a2b3c4d5e6f/tools" \
  -H "Authorization: Bearer $RAABTA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tools": {
      "bookings.create": true,
      "bookings.cancel": true,
      "contacts.search": true
    },
    "gated_tools": [
      "bookings.cancel"
    ]
  }'
Response · 200 OK
{
  "data": [
    {
      "id": "bookings.create",
      "group": "booking",
      "group_label": "Bookings",
      "title": "create",
      "description": "Book an appointment for a contact.",
      "sensitivity": "write",
      "enabled": true,
      "gated": false,
      "default_enabled": true,
      "explicit": true
    }
  ]
}

Response

Wrapped in { data: … }
NameTypeDescription
idrequired
stringTool id
grouprequired
stringCatalogue group id
group_labelrequired
stringGroup name as shown in the dashboard
titlerequired
stringShort human name
descriptionrequired
stringWhat the tool does
sensitivityrequired
string (enum)A critical tool always raises an approval, whatever `gated` saysreadwritecritical
enabledrequired
booleanWhether this assistant may use it, with the catalogue default already applied
gatedrequired
booleanWhether it pauses for a human approval before running
default_enabledrequired
booleanWhat it would be if the assistant said nothing
explicitrequired
booleanTrue when the assistant states an opinion, false when it is taking the default

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.
404not_foundNo such resource in this account. A resource that exists in another account also returns this.
422unprocessableThe request was well-formed but cannot be carried out. `reason` is a stable string saying why (for example `outside_window` or `stage_not_in_pipeline`).
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.