Permissions and who can see what

Every permission key the AI Support console uses, which screen and which route needs each one, the twelve Super-Admin-only settings, and two role grants that actually work.

8 min readUpdated 7 August 2026permissions, roles, access, super-admin

Roles are edited at Admin → CRM → Roles (/admin/crm/role), and the key list they draw from is at /admin/crm/permission.

This addon uses thirteen keys of its own and three keys that belong to the core platform. Every other page in this documentation names only the keys its own subject needs: The console, Install, Settings and Channels name access.ai.support and access.ai.support.settings, and Cost and budgets and Knowledge pipeline name the route keys their own screens depend on. That first pair is the one to be careful with: it reads like it opens the whole addon, and it opens three URLs — Overview, Settings and Actions. It does not open Sources, Gaps, Agents, the Handbook or the Live Inbox, and it loads not one figure on Overview. This page is the whole list.

Two gates, not one

Every screen is checked twice, and the two checks use different keys on several screens.

  1. The page gate decides whether the URL opens at all. It is the key in frontend/middlewares/permissions.json for that path — or, for a path with no entry, access.admin, which is the fail-closed fallback rather than a licence.
  2. The route gate decides whether the data behind the page loads. It is the permission declared on each backend route.

Grant the page key and not the route key and the screen opens, renders its frame, and shows nothing — no error, no permission message. The most common instance of this is Overview: the page opens on access.ai.support, and every figure on it comes from a route that requires view.ai.support.analytics.

Nobody reports that as an access problem. They report it as "the dashboard is empty".

The addon's own keys

Key What it actually unlocks Routes
access.ai.support Opens /admin/ai/support. Also gates the master on/off route and all eight admin-assistant console routes — ask, pending, catalogue, approve, dismiss, and the three conversation routes 9
access.ai.support.provider The Provider screen and all three of its routes — read, test, activate 3
access.ai.support.settings The Settings screen and the Actions console, read and write 6
view.ai.support.analytics The Overview figures and the escalation report 2
view.ai.support.knowledge Sources, Gaps, the retrieval tester, the coverage report 8
create.ai.support.knowledge Writing an article, drafting one from a gap, Teach from this ticket 3
edit.ai.support.knowledge Editing or publishing an article, updating a gap, Re-index 3
delete.ai.support.knowledge Deleting an article 1
view.ai.support.agent The Agents screen 1
create.ai.support.agent Creating an agent, and Create default agent 2
edit.ai.support.agent Editing an agent 1
delete.ai.support.agent Deleting an agent 1
view.ai.support.handbook The Handbook screen, and the documentation-only half of it 1

Those thirteen plus the three core keys below cover all 48 admin routes this addon ships. Every route declares one, and every one of the sixteen is seeded — there is no route in here that a role grant cannot reach and no key in here that does not exist to be granted.

The admin assistant is bounded by every OTHER key you hold

The operator's own assistant — the Handbook screen, which is what both the nav and the page header call it — is the one surface in this addon whose reach is not described by a key of its own, and the table above cannot say so. Two keys open it and neither one grants anything:

  • view.ai.support.handbook opens the screen and lets you ask a documentation question. That is the whole of what it grants.
  • access.ai.support unlocks the live half: reading queues, opening screens, procedures, and approving actions.

Settings sit in front of both halves, and no role grant substitutes for one. Every question on this screen — documentation or live — first needs aiSupportEnabled, the same master switch the customer assistant runs on, so an install that has never switched the assistant on has no operator assistant either. The live half then needs aiSupportAdminAssistantEnabled, which ships off and only a Super Admin can turn on: while it is off, the live route refuses every request outright — a Super Admin included — with a plain sentence saying so, while the documentation-only route never consults it and keeps answering. Actions need aiSupportAdminActionsEnabled and at least one key in aiSupportAdminActionKeys on top of that, and procedures containing an action step disappear with them.

Everything the live half can actually reach is then filtered by the rest of your role. A colleague holding access.ai.support and nothing else gets an assistant that can answer from documentation, name no screen, count no queue and offer no action — because each of those is gated on the key its own screen demands, checked against their session on every request.

So the honest reading of access.ai.support here is "may open the assistant", not "may use it". What it can do for a given person is the intersection with what that person could already do by clicking:

Capability Gated on
Count a queue The queue's own key, section by section — access.withdraw, access.deposit, access.kyc.application, access.support.ticket, access.p2p.dispute. A queue you cannot open is not counted; it is absent, not zero
Read platform health Block by block — access.extension for the addon list, access.deposit.gateway for the gateways, access.exchange for the exchange, access.ai.support.settings for the assistant's own tier and budget
Read the audit trail access.admin.audit
Open a screen The permission the catalogue records for that screen, all 120 of them — the page gate itself for all but the four below
Rebuild the knowledge index edit.ai.support.knowledge
Reload the settings cache edit.settings
Back up the database access.database
Re-sync the currency icons edit.currency.icon
Send yourself a test email access.notification.settings
Test the AI provider access.ai.support.provider
A procedure Every step's key. A procedure you cannot finish is never offered

The six rows from Rebuild the knowledge index to Test the AI provider are the whole action catalogue. Each is offered only when it is ticked in aiSupportAdminActionKeys and you hold the key beside it: the allowlist is the operator's decision about the install, the permission is the check against you. Neither substitutes for the other, and neither can widen the other.

The permission is re-derived from the live catalogue when you approve, never read off the proposal — so re-gating an action takes effect on proposals already written rather than on the next one.

/admin/copy-trading/leader, /follower, /health and /settings are the only four of the 120 that do not appear in frontend/middlewares/permissions.json. The copy-trading console ships no permission.ts, so the catalogue carries view.copy_trading — the key its own read routes declare — for all four.

That is the key the assistant filters on. The URL itself falls back to access.admin, so the two differ: a colleague with access.admin can type those four addresses and get in, and the assistant will still not name them until they hold view.copy_trading. Grant that key if you want copy trading in the assistant's catalogue; looking for a per-screen key in permissions.json will not find one.

The three core keys it reuses

These are not ai.support keys and they are the ones most often missed, because nothing in the addon's name suggests them.

Key What it unlocks here Why it is this key
view.support.ticket The entire Live Inbox — the queue and every conversation The inbox is a support-agent workspace that happens to show AI drafts. Your ticket agents already hold this key, so the screen appears on upgrade with no grant step.
edit.support.ticket Take over, Release, requesting a draft, and cancelling a process a customer abandoned Same reasoning: acting on a conversation is a ticket action.
view.user The Ask about this user rail on /admin/crm/user/{id} Deliberately the same key as the customer page the rail sits on. It never widens access — the model is shown strictly less than the page already shows.

view.support.ticket is also the key the prompt-cache alarm notifies. When prompt caching stops working, the hourly job raises an admin notification to everyone holding it.

Screen by screen

Screen Path Page gate Also needs
Overview /admin/ai/support access.ai.support view.ai.support.analytics for every figure
Live Inbox /admin/ai/support/inbox view.support.ticket edit.support.ticket to take over, release or draft; create.ai.support.knowledge for Teach from this ticket
Handbook /admin/ai/support/handbook view.ai.support.handbook access.ai.support for the live half — see below. Super Admin for the three switches
Sources /admin/ai/support/knowledge view.ai.support.knowledge edit.ai.support.knowledge for Re-index
Gaps /admin/ai/support/gaps view.ai.support.knowledge create.ai.support.knowledge to draft an article from a gap; edit.ai.support.knowledge to publish that draft and to close the gap
Provider /admin/ai/support/provider access.ai.support.provider
Agents /admin/ai/support/agents view.ai.support.agent create / edit / delete.ai.support.agent for the row actions
Settings /admin/ai/support/settings access.ai.support.settings Super Admin for twelve keys — below
Actions /admin/ai/support/workflows access.ai.support.settings Super Admin for the three capability keys

Two of these deserve a sentence, because they look like oversights and are not.

Actions has no key of its own. It is the Settings screen's workflow field promoted to a page, and every request it makes — the operation, workflow and guide catalogues, and the settings read and write — is gated on access.ai.support.settings on the server. A separate access key for Actions would gate the door and nothing behind it: the page would open and all four fetches would return 403.

Gaps shares the knowledge key. A gap is the knowledge base's to-do list, and closing one writes an article.

The twelve settings no role grant can unlock

Writes AI Support settings. Refuses the whole payload if it contains a key you may not write.

Twelve keys are refused by that route for anyone who is not a Super Admin, and no permission grant changes that. The check is by role name: rolesGate treats the role literally named Super Admin as bypassing permission checks entirely, and this route resolves the caller's role on every request.

The twelve are not a hand-written list. The route intersects this addon's own keys with the platform's protected-settings register, so a thirteenth added to that register is locked here the moment it lands, with no edit to this screen.

Key What it decides Where a Super Admin changes it
aiSupportEnabled Whether the assistant speaks to customers at all Guardrails, master switch
aiSupportAutonomy COPILOT / AUTO_TICKET / AUTO_ALL — whether a human approves each reply Guardrails, master switch
aiSupportProvider Which AI service answers Provider
aiSupportDailyBudgetUsd The daily spend ceiling Guardrails
aiSupportMonthlyBudgetUsd The monthly spend ceiling Guardrails
aiSupportAccountToolsEnabled Whether the assistant may read customer account data at all Guardrails
aiSupportOperationsEnabled Whether it may offer an action a customer confirms Actions
aiSupportWorkflowsEnabled Whether it may carry a customer through a multi-step process Actions
aiSupportWorkflowKeys Which processes are allowed Actions
aiSupportAdminAssistantEnabled Whether your own console — its queues, its screens, what a colleague changed this morning — is described to a model at all Handbook
aiSupportAdminActionsEnabled Whether that assistant may offer you a platform-wide action to approve Handbook
aiSupportAdminActionKeys Which of the six admin actions it may offer. Empty means none Handbook

The last three are a different decision from the nine above them, which is why they are separate keys rather than sharing the customer ones. The nine decide what an automated system says to your customers, and every action behind them runs on the confirming customer's own account. The three decide whether your operational state leaves the install, and the actions behind them rebuild indexes, flush caches and dump the database.

All twelve are disclosed to everyone with access.ai.support.settings rather than hidden. The master switch and the autonomy mode are the panel at the top of the Guardrails tab; the other ten are rows under Super Admin controls, each showing its current value. For anyone who is not a Super Admin every one of them carries a padlock and, where one exists, a link to the screen that does change it; a Super Admin gets live controls for the two budget ceilings and the account-tools switch, which have no other home in the product. A control an operator cannot find is a control they assume does not exist, and hunting for a master switch that is merely hidden produces a support ticket of its own.

The Settings screen submits every changed field as a single payload, and the write route collects every refused key and throws one 403 for the entire batch. It does not drop the offender and save the rest.

So an admin who changes the retention period and touches a protected key loses the retention period too, with nothing on screen naming the control that did it. The locked rendering is derived from the same list the server enforces precisely so you cannot reach that state from the UI — but you can reach it from a stale page, or from an API client.

The two errors are worded differently on purpose. "These settings cannot be changed here" means the key does not belong to this addon and no role will accept it. "Only a Super Admin can change these" names the people who can.

A minimum working grant for a support lead

Someone who runs the desk day to day: works the inbox, closes gaps, keeps the knowledge base honest, and tunes thresholds. They do not need to be able to switch the assistant on or change what it spends.

access.ai.support
access.ai.support.settings
view.ai.support.analytics
view.ai.support.knowledge
create.ai.support.knowledge
edit.ai.support.knowledge
view.ai.support.agent
edit.ai.support.agent
view.support.ticket
edit.support.ticket

What that grant does not include, deliberately:

  • access.ai.support.provider — changing the AI service is a billing decision.
  • delete.ai.support.knowledge and delete.ai.support.agent — deleting an article is how a good answer disappears without anyone noticing.
  • view.ai.support.handbook — add it if you want them asking the operator documentation. Every answer is a real model call, and admin-side calls are summed into the same daily and monthly ceilings the customer assistant spends against, so it is a decision rather than an omission.
  • view.user — the Ask about this user rail is on the customer record, not in this console, and that key opens the whole customer page.

A read-only reviewer grant

Someone auditing what the assistant said and what it cost, who must change nothing:

access.ai.support
view.ai.support.analytics
view.ai.support.knowledge
view.ai.support.agent
view.support.ticket

view.support.ticket is what makes the Live Inbox readable. Without edit.support.ticket they can read every conversation and the reasoning rail behind it, and cannot take one over, release one, or ask for a draft.

Leave access.ai.support.settings out of a reviewer grant even though it is named access: on this addon that single key is read and write, on both Settings and Actions.