Version

Ability Catalog

Every ability string a Subscriby token can carry, what enforces it, and how to pick the right ones when minting.

Ability strings are the fine-grained permissions you tick when you mint a personal access token. Miss the one an endpoint or tool needs and the request returns TOKEN_MISSING_ABILITY, naming it in error.context.required_ability.

One string, every surface

A single ability — say project-subscription-plan:create — is the source of truth in three places:

  1. The dashboard, when a human clicks "Create plan".
  2. The REST API, in the controller before the mutation runs.
  3. The MCP server, inside the tool handler before the action runs.

An MCP tool requires exactly what its REST equivalent requires. Mint for the operations you intend to perform, never for the channel you intend to perform them over. A client connected to the MCP server by signing in acts as the creator themselves and satisfies every ability their team role grants; this catalog governs what a personal access token carries.

Changed in 3.0.0: there is no channel ability

mcp:full has been removed. It read like full access and was really a gate meaning "this token may speak MCP" — 47 of the tools behind it already enforced a real ability of their own. Any token whose abilities cover the tools it calls may now use MCP. Tokens that carried mcp:full are unaffected; the value is simply no longer checked.

webhook-endpoint:manage has been split into the five endpoint verbs plus two webhook-delivery: abilities. It still grants all seven on tokens that carry it, but it cannot be granted to a new one — the mint endpoint refuses it and names the replacements.

Format

<entity>:<action>, with : as the separator and - inside a multi-word entity or action — project-subscription-plan:view-any.

Most entities carry the five CRUD actions (view-any, view, create, update, delete). Two do not, because their lifecycle is not CRUD:

  • team-member — membership is invited and removed rather than created and deleted, and update-role is its own action.
  • webhook-delivery — a delivery is a record of something that already happened, so it can only be listed and retry'd.

The catalog

109 ability strings, of which 108 can be granted to a new token.

The Enforced on column says what actually checks each one today:

REST / MCPA live endpoint or tool demands it.
DashboardEnforced in the app, and by the webhook events it gates, but no API surface requires it.
ComingThe ability exists and the surface that uses it is still being built. It grants nothing yet.
No API surfaceDeliberate — see the note on the row.
RetiredStill honoured on tokens that hold it, refused on new ones.

Projects

AbilityEnforced on
project:createREST + MCP
project:deleteREST + MCP
project:updateREST + MCP
project:viewREST + MCP
project:view-anyREST + MCP

Project resources

AbilityEnforced on
project-access-code:createREST + MCP
project-access-code:deleteREST
project-access-code:updateComing
project-access-code:viewComing
project-access-code:view-anyREST + MCP
project-connector:createREST + MCP
project-connector:deleteREST + MCP
project-connector:updateREST + MCP
project-connector:viewREST + MCP
project-connector:view-anyREST + MCP
project-coupon:createREST + MCP
project-coupon:deleteREST + MCP
project-coupon:updateREST + MCP
project-coupon:viewREST + MCP
project-coupon:view-anyREST + MCP
project-payment-method:createComing
project-payment-method:deleteREST + MCP
project-payment-method:updateREST + MCP
project-payment-method:viewREST + MCP
project-payment-method:view-anyREST + MCP
project-recovery:createREST + MCP
project-recovery:deleteREST + MCP
project-recovery:updateREST + MCP
project-recovery:viewREST + MCP
project-recovery:view-anyREST + MCP
project-resource:createREST + MCP
project-resource:deleteREST + MCP
project-resource:updateREST + MCP
project-resource:viewREST + MCP
project-resource:view-anyREST + MCP
project-subscription-plan:createREST + MCP
project-subscription-plan:deleteREST + MCP
project-subscription-plan:updateREST + MCP
project-subscription-plan:viewREST + MCP
project-subscription-plan:view-anyREST + MCP
project-subscription:createComing
project-subscription:deleteComing
project-subscription:updateREST + MCP
project-subscription:viewREST + MCP
project-subscription:view-anyREST + MCP
project-user:createComing
project-user:deleteComing
project-user:updateREST + MCP
project-user:viewREST + MCP
project-user:view-anyREST + MCP

Support inbox

AbilityEnforced on
support-canned-reply:createREST + MCP
support-canned-reply:deleteREST + MCP
support-canned-reply:updateREST + MCP
support-canned-reply:view-anyREST + MCP
support-conversation:createComing
support-conversation:deleteComing
support-conversation:updateREST + MCP
support-conversation:viewREST + MCP
support-conversation:view-anyREST + MCP

Teams

AbilityEnforced on
team-member:inviteREST + MCP
team-member:removeREST + MCP
team-member:update-roleREST + MCP
team-member:viewREST
team-member:view-anyREST + MCP
team:createREST + MCP
team:deleteREST + MCP
team:updateREST + MCP
team:viewREST + MCP
team:view-anyREST + MCP

Roles & groups

AbilityEnforced on
group:createREST + MCP
group:deleteREST + MCP
group:updateREST + MCP
group:viewREST
group:view-anyREST + MCP
role:createREST + MCP
role:deleteREST + MCP
role:updateREST + MCP
role:viewREST
role:view-anyREST + MCP

Webhooks

AbilityEnforced on
webhook-delivery:retryREST + MCP
webhook-delivery:view-anyREST + MCP
webhook-endpoint:createREST + MCP
webhook-endpoint:deleteREST + MCP
webhook-endpoint:manageRetired — Split into the five webhook-endpoint verbs plus the two webhook-delivery abilities. Still grants all seven on tokens that carry it; cannot be granted to a new one.
webhook-endpoint:updateREST + MCP
webhook-endpoint:viewREST + MCP
webhook-endpoint:view-anyREST + MCP

API tokens

AbilityEnforced on
token:createREST
token:deleteREST + MCP
token:viewREST
token:view-anyREST + MCP

Payments

AbilityEnforced on
payment:refundComing
payment:viewComing
payment:view-anyComing

Passes

AbilityEnforced on
pass-window:createREST + MCP
pass-window:deleteREST + MCP
pass-window:updateREST + MCP
pass-window:viewREST + MCP
pass-window:view-anyREST + MCP

A token holding project-subscription-plan:view-any also satisfies pass-window:view-any, because the window list gated on the plan ability before the pass-window family had a surface of its own; tokens minted for n8n or the MCP docs keep working, and new tokens should carry pass-window:view-any explicitly.

Broadcast

AbilityEnforced on
broadcast:sendComing

Billing

AbilityEnforced on
billing:manageNo API surface — The creator's own Subscriby billing is deliberately dashboard-only.
billing:readNo API surface — Subscribes an endpoint to the billing.* webhook events. The creator's own Subscriby billing has no REST surface to read.

Account

AbilityEnforced on
account:readREST — GET /v1/me/identities
account:writeREST — DELETE /v1/me/identities/{identity}

Analytics

AbilityEnforced on
dashboard:readREST + MCP

Activity log

AbilityEnforced on
activity:readREST + MCP
AbilityEnforced on
distribution:readREST + MCP

Machine-readable export

GET https://api.subscriby.net/abilities.json

Regenerated on every deploy from the same enum the application checks against, so it cannot drift. Each entry carries value, category, status and, where one applies, a note.

Choosing abilities when minting

Least privilege, in practice:

  1. Read-only tooling — the :view-any and :view abilities for the entities you read, and nothing else.
  2. Automation that creates plans — add project-subscription-plan:create and :update.
  3. An assistant over MCP — add every ability for the tools you want it to run. Start with reads; the tools reference maps each tool to its ability.
  4. Zapier and n8n triggers — add webhook-endpoint:create and webhook-endpoint:delete; subscribing to events registers and removes an endpoint behind the scenes.
  5. A token that mints other tokens — add token:create, and read attenuation first. A token can only grant what it already holds, and can never pass on token:create.

Team and project scope entries

Alongside abilities, every token carries one required and zero-to-many optional scope entries:

  • scope:team:<uuid> — required. Frozen at mint time; the token can never act outside this team.
  • scope:project:<uuid> — optional, repeatable. If present, the token is restricted to the listed project ids even when the user owns more projects inside the team.

These are stored in the same array as abilities but are not abilities, and the Tokens API reports them separately under scopes for that reason. See tenancy and scopes for how they combine with tenant isolation at request time.

How is this guide?

Version

On this page

Subscriby is a product
designed by you — for you.
No boardroom full of executives deciding what we ships next. Our roadmap always shaped by you with your feedback.

Share feedback or a request