CUSTODY_RBAC_ENABLED=true. With CUSTODY_RBAC_SEED_ON_STARTUP=true (default), the five system roles are seeded automatically on first startup.
System roles
| Role | Description |
|---|---|
admin | Full access to all resources and actions |
operator | Create and manage vaults, wallets, and transactions; create webhooks |
viewer | Read-only access to vaults, wallets, transactions, policies, assets, and webhooks |
approver | Read transactions and approve or reject them |
compliance_officer | Read and update compliance screenings; read and export audit logs |
isSystem: true and cannot be deleted.
Permission matrix
A permission is aresource × action pair. There are 12 resources and 6 actions.
Resources (12)
tenants, vaults, wallets, transactions, policies, webhooks, assets, users, roles, credentials, audit, compliance.
Actions (6)
create, read, update, delete, approve, export.
What each system role can do
| Resource | admin | operator | viewer | approver | compliance_officer |
|---|---|---|---|---|---|
tenants | CRUDAE | — | — | — | — |
vaults | CRUDAE | C R U | R | R | R |
wallets | CRUDAE | C R | R | R | R |
transactions | CRUDAE | C R | R | R A | R |
policies | CRUDAE | R | R | R | R |
webhooks | CRUDAE | C R D | R | — | — |
assets | CRUDAE | R | R | R | — |
users | CRUDAE | — | — | — | — |
roles | CRUDAE | — | — | — | — |
credentials | CRUDAE | — | — | — | — |
audit | CRUDAE | — | — | — | R E |
compliance | CRUDAE | — | — | — | R U |
Assigning roles
Custom roles
You can build custom roles by composing permissions. For example, a “treasury reviewer” role that can read transactions and policies but cannot approve:Custom-role management endpoints are reserved for
admin. See the API reference for the full role-management surface.SSO auto-provisioning
When SSO is enabled (CUSTODY_SSO_ENABLED=true) and CUSTODY_SSO_AUTO_PROVISION=true, users authenticated through your IdP are auto-created with the role specified by CUSTODY_SSO_DEFAULT_ROLE (default viewer).
Promote auto-provisioned users by assigning additional roles via the API.
Best practices
Restrict admin role
Assign
admin to two or fewer humans. Use API keys with narrower permissions for service integrations.Enforce dual control
For high-value transfers, require an
operator to create and an approver to approve. Use the REQUIRE_APPROVAL policy rule.Audit role changes
Every role assignment and revocation is recorded in the audit log. Review periodically.
Rotate credentials
Use
POST /v1/credentials/rotate to rotate API keys without downtime.