Permissions

The permission each Corporate API endpoint requires, and how a role is evaluated against it.

Before You Start

Read the following guides before proceeding:

GuideWhy
AuthenticationPermissions travel in the corporation token
RolesHow roles are created and assigned

Overview

Every corporation-scoped endpoint declares a set of permissions. The permission set in the caller's
corporation token is evaluated against that declaration before the handler runs.

The evaluation has three rules:

  1. Su overrides everything. A holder of Su passes every endpoint, whatever it declares.
  2. The declared permissions are alternatives, not a conjunction. Holding any one of them is enough.
  3. An empty declaration admits any authenticated caller — any valid corporation token passes.

A caller that fails evaluation gets 403:

{
  "error_reason": "ErrorPermissionDenied",
  "error_description": "User does not have required permissions",
  "error_category": {
    "category": "CategoryForbidden",
    "http_status_code": 403
  }
}

A caller whose token carries an empty permission set, calling an endpoint that declares any permission,
gets 403 with User does not have any permissions.

Permissions are resolved at login and frozen into the token. Changing a role, or moving an
employee to a different role, has no effect until that employee logs in again.


Permission Codes

These are the names accepted by POST /api/v1/roles and PUT /api/v1/roles/{roleId}. The numeric code
is what appears as the key in the token's permissions claim.

PermissionCodeGrants
Su101Everything. Cannot be assigned to a custom role
CardSu102Every card operation
CardCreate103Order new cards and create fee invoices
CardViewDetails104Read PAN, CVV and PIN; read and confirm 3DS requests
CardManage105Activate, block, unblock, close, rename; decide 3DS requests
CardLimitManage106Change card limits
CardView107List cards
EmployeeSu108Every employee and role operation
EmployeeManage109Invite, update and delete employees; change employee roles
EmployeeView110List and search employees; list roles
TransactionSu111Every transfer operation
TransactionCreate112Estimate and execute transfers
TransactionManage113Create, update and delete recipients
TransactionView114Read transfer data
AccountSu115Every bank account operation
AccountCreate116Activate bank account details
AccountManage117Modify account settings
AccountView118Read bank accounts

TransactionView, AccountManage and CardView alone do not unlock any endpoint that the table below
does not list — they exist so a role can express read-only intent that future endpoints will honour.


Endpoint Permission Matrix

Anonymous — no token

EndpointMethod
/api/v1/configGET
/api/v1/global/capabilitiesGET
/api/v1/validation/rulesGET

Partner token

EndpointMethodPermissions
/api/v1/tokenPOST— (client credentials)
/api/v1/config/tokensGETNone — any valid token
/api/v1/employees/corporationsGETNone
/api/v1/corporations/registerPOSTNone — on-chain ownership is checked instead
/api/v1/corporations/loginPOSTNone

Corporation — profile and verification

EndpointMethodPermissions
/api/v1/corporationsGETNone
/api/v1/corporations/freshdesk-idPUTNone
/api/v1/corporations/verification-tokenPOSTSu
/api/v1/corporations/level-tokenPOSTSu

Employees and roles

EndpointMethodPermissions
/api/v1/employeesGETEmployeeSu, EmployeeManage, EmployeeView
/api/v1/employees/searchGETEmployeeSu, EmployeeManage, EmployeeView
/api/v1/employees/{employeeId}GETNone at the route; enforced in the handler — see below
/api/v1/employees/invitePOSTEmployeeSu, EmployeeManage
/api/v1/employees/{employeeId}PUTEmployeeSu, EmployeeManage
/api/v1/employees/{employeeId}/rolePUTEmployeeSu, EmployeeManage
/api/v1/employees/{employeeId}DELETEEmployeeSu, EmployeeManage
/api/v1/rolesGETEmployeeSu, EmployeeManage, EmployeeView
/api/v1/roles/{roleId}GETNone
/api/v1/rolesPOSTEmployeeSu
/api/v1/roles/{roleId}PUTEmployeeSu
/api/v1/roles/{roleId}DELETEEmployeeSu

GET /api/v1/employees/{employeeId} declares no permission because a caller may always read their
own
employee record. Reading anyone else's record requires Su, EmployeeSu, EmployeeManage or
EmployeeView, checked inside the handler.

Wallets and FX

EndpointMethodPermissions
/api/v1/walletsGETNone
/api/v1/wallets/globalPOSTSu
/api/v1/fx/estimatePOSTTransactionSu
/api/v1/fxPOSTTransactionSu

Cards

EndpointMethodPermissions
/api/v1/cardsGETCardSu, CardView
/api/v1/cards/{type}/fees/{country}GETCardSu, CardCreate, CardView
/api/v1/cards/delivery/countriesGETCardSu, CardCreate, CardView
/api/v1/cards/delivery/methods/{country}GETCardSu, CardCreate, CardView
/api/v1/cards/{type}/fees/{country}/paymentPOSTCardSu, CardCreate
/api/v2/cards/{type}/fees/{country}/paymentPOSTCardSu, CardCreate
/api/v1/cards/virtual, /api/v2/cards/virtualPOSTCardSu, CardCreate
/api/v1/cards/plastic, /api/v2/cards/plasticPOSTCardSu, CardCreate
/api/v1/cards/{cardId}/activatePUTCardSu, CardManage
/api/v1/cards/{cardId}/blockPUTCardSu, CardManage
/api/v1/cards/{cardId}/unblockPUTCardSu, CardManage
/api/v1/cards/{cardId}/closePUTCardSu, CardManage
/api/v1/cards/{cardId}/namePUTCardSu, CardManage
/api/v1/cards/{cardId}/limitPUTCardSu, CardLimitManage
/api/v1/cards/{cardId}/detailsPOSTCardSu, CardViewDetails
/api/v1/cards/{cardId}/cvvPOSTCardSu, CardViewDetails
/api/v1/cards/{cardId}/pinPOSTCardSu, CardViewDetails
/api/v1/confirmation/signature/verifyPOSTCardSu, CardViewDetails
/api/v1/confirmation/signaturePOSTCardSu, CardViewDetails
/api/v1/cards/3ds/requestsGETCardSu, CardViewDetails
/api/v1/cards/3ds/requests/{transactionId}/approvePOSTCardSu, CardManage
/api/v1/cards/3ds/requests/{transactionId}/declinePOSTCardSu, CardManage
/api/v1/cards/transfer/estimatePOSTCardSu
/api/v1/cards/transferPOSTCardSu

Reading a 3DS request needs CardViewDetails; deciding it needs CardManage. A role that can see
pending challenges but not approve them is the default outcome — grant both if one employee is meant
to handle the whole flow.

Bank accounts and transfers

EndpointMethodPermissions
/api/v1/bank/accountsGETTransactionSu, TransactionCreate, AccountView
/api/v1/bank/accountsPOSTTransactionSu, AccountSu, AccountCreate
/api/v1/bank/transfer/estimatePOSTTransactionSu, TransactionCreate
/api/v2/bank/transfer/estimatePOSTTransactionSu, TransactionCreate
/api/v1/bank/transferPOSTTransactionSu, TransactionCreate
/api/v3/bank/estimate/{corridor}POSTTransactionSu, TransactionCreate
/api/v3/bank/initiate/{corridor}POSTTransactionSu, TransactionCreate
/api/v3/bank/confirm/{corridor}POSTTransactionSu, TransactionCreate
/api/v1/bulk/transferPOSTTransactionSu, TransactionCreate

Recipients

EndpointMethodPermissions
/api/v1/recipientsGETNone
/api/v1/recipients/{recipientId}GETNone
/api/v1/recipients/filter/catalogGETNone
/api/v1/recipients/filter/currencyGETNone
/api/v1/recipients/filter/nameGETNone
/api/v1/recipients/filter/typeGETNone
/api/v1/recipients, /api/v2/recipientsPOSTTransactionSu, TransactionManage
/api/v1/recipients/{recipientId}, /api/v2/recipients/{recipientId}PUTTransactionSu, TransactionManage
/api/v1/recipients/{recipientId}DELETETransactionSu, TransactionManage
/api/v1/recipients/{recipientId}/payment_detailsPOSTTransactionSu, TransactionManage
/api/v1/recipients/{recipientId}/payment_details/{paymentDetailsId}PUTTransactionSu, TransactionManage
/api/v1/recipients/{recipientId}/payment_details/{paymentDetailsId}DELETETransactionSu, TransactionManage
/api/v1/recipients/{recipientId}/usagePOSTTransactionSu, TransactionCreate, TransactionManage

Activity

EndpointMethodPermissions
/api/v1/activity/feedGETNone
/api/v1/activity/statement/fullPOSTNone
/api/v1/withdrawal/requestsGETNone

Designing Roles

The permission model maps onto four operational areas — cards, employees, transactions, accounts — each
with its own *Su. A practical split:

FunctionPermissions
Finance operator — pays suppliers, cannot change who is paidTransactionCreate
Finance manager — maintains the payee book and paysTransactionCreate, TransactionManage
Card administratorCardCreate, CardManage, CardLimitManage, CardView
Cardholder — sees their own card details onlyCardView, CardViewDetails
People operationsEmployeeManage, EmployeeView
AuditorCardView, TransactionView, AccountView, EmployeeView

Su is reserved for the on-chain owner. It is refused by POST /api/v1/roles and
PUT /api/v1/roles/{roleId} with 400 and Su permission is not allowed for custom roles.

Three endpoints require Su outright and cannot be delegated through a custom role:
POST /api/v1/corporations/verification-token, POST /api/v1/corporations/level-token and
POST /api/v1/wallets/global.


Did this page help you?