Skip to Content
RBACPermissions

Permission Catalog

Permissions are strings evaluated against a member’s role and enforced by the API on every request.


Tenant Permissions

These permissions are held by tenant members. All are scoped to the tenant identified in the JWT tenant_id claim — a user cannot hold tenant A’s tenant:notifications:audit:read and use it to read tenant B’s audit log.

Settings & Administration

PermissionSelf-scoped?Allows
tenant:settings:readNoRead tenant name, slug, tier, status, features map, region
tenant:settings:writeNoUpdate name, slug (transactional slug swap), feature flags
tenant:members:readNoList all members with their roles and last-seen timestamps
tenant:members:inviteNoCreate, list, and revoke pending invites
tenant:members:removeNoRemove any member except the owner
tenant:members:role:writeNoChange a member’s role (cannot promote to or demote the owner role)
tenant:grants:readNoRead the grant row for all members
tenant:grants:writeNoCreate, update, or delete a member’s grant
tenant:keys:readNoList all API keys in the tenant (metadata only, no plaintext)
tenant:keys:read:selfYesList own API keys only
tenant:keys:writeNoCreate and revoke any API key in the tenant (members restricted to own keys by enforcement in handler)
tenant:billing:readNoRead subscription status, usage summary, invoice list
tenant:billing:writeNoChange the payment method; cancel the subscription (owner only enforced in handler)
tenant:gdpr:readNoRequest the tenant’s GDPR right-to-access export and read the presigned download URL
tenant:transfer:ownerNoTransfer tenant ownership to another member. Current owner only, enforced in handler.
tenant:deleteNoSoft-delete the tenant. Current owner only, enforced in handler.
tenant:features:readNoRead the tenant feature-flag map
tenant:features:writeNoEnable or disable a tenant feature flag. Disabling preserves data.

Integrations

PermissionAllows
tenant:integrations:hubspot:connectConnect a new HubSpot integration or reconnect after token expiry
tenant:integrations:hubspot:disconnectDisconnect the HubSpot integration and delete the stored credentials
tenant:integrations:hubspot:readRead the integration status, hub_id, granted scopes, and connected-at timestamp
tenant:integrations:slack:readRead the Slack integration status, connected workspace, and configured channels
tenant:integrations:slack:writeConnect, configure channels, set routing rules, and disconnect the Slack integration
tenant:integrations:apn:configureConnect, configure catalog (Sandbox/Production), and disconnect APN
tenant:integrations:apn:readRead APN integration status, partner account ID, catalog, and sync statistics

FlowState Domain

PermissionAllows
tenant:hubspot:readCall HubSpot CRM and reporting APIs using the tenant’s stored credentials
tenant:deals:analyzeTrigger a pipeline refresh run; invoke AI deal analysis
tenant:deals:readRead precomputed deal snapshots, pipeline summaries, and deal details
tenant:deals:reanalyzeForce a per-deal reanalysis, bypassing the TTL cache
tenant:goals:readRead annual revenue and deal-count goals and rep quotas
tenant:goals:writeSet annual goals and per-rep quota targets
tenant:win-loss:readRead win/loss aggregations and trend analyses
tenant:win-loss:triggerStart a win/loss batch (up to 48 month-analysis workers). Rate-limited to one run per tenant per 15 minutes
tenant:slack:testSend a test message to the tenant’s configured Slack channel
tenant:apn:readRead APN sync state for all deals; list opportunities; read conflicts and errors
tenant:apn:sync:triggerTrigger manual syncs; retry failed syncs; resolve conflicts; accept/reject engagement invitations
tenant:marketplace:offers:readRead Marketplace private offers, their draft changesets and release status
tenant:marketplace:offers:writeCreate and amend DRAFT private offers. A released offer’s commercial terms can never be changed
tenant:marketplace:offers:releaseRelease a draft private offer to the buyer. Irreversible — kept separate from write for that reason
tenant:mcp:invokeInvoke any tenant-scoped MCP tool. Required in addition to the tool’s own permission.

Notifications

PermissionSelf-scoped?Allows
tenant:notifications:readNoView which members in this tenant are subscribed to which notification categories. Admin view.
tenant:notifications:read:selfYesRead own global and per-tenant notification preferences
tenant:notifications:write:selfYesUpdate own notification preferences (enable/disable categories, per-tenant overrides)
tenant:notifications:audit:readNoRead the per-tenant notification send log (category, ses_message_id, status, timestamp)

Self-Scoped Permissions

Permissions marked “self-scoped” (*:self) enforce that a member can only exercise them on their own resources:

  • tenant:keys:read:self — member can list their own keys but not others’.
  • tenant:notifications:read:self — member can read their own prefs but not another member’s.
  • tenant:notifications:write:self — member can update their own prefs only.

The :self scoping is enforced by verifying the resource belongs to the requesting member. The presence of the :self permission never grants access to another member’s resources.

Admins and owners hold the non-self-scoped variants which implicitly cover self-access as well.