Skip to Content

RBAC — Role-Based Access Control

Fine-grained per-resource access control for the isA Model Service, using a resource:action permission model.

Overview

RBAC restricts which operations an API key can perform. Permissions are expressed as resource:action strings and are embedded in JWT claims. Every authenticated request is checked against the required permission for that endpoint.

Enable RBAC via environment variable:

RBAC_ENABLED=true

Note: When RBAC_ENABLED=false (default in development), all authenticated requests are permitted regardless of permissions.

Resource Types

ResourceActionsDescription
agentsread, write, execute, adminAgent configs, templates, deployments
toolsread, execute, adminMCP tool execution and metadata
modelsread, execute, adminModel invocation and management
sessionsread, write, adminSession state and checkpoints
checkpointsread, write, adminCheckpoint storage and compaction
usersread, write, adminUser accounts and profiles
orgsread, write, adminOrganization management
billingread, adminUsage data and credit management
audit_logsread, adminAudit log access
storageread, write, adminObject storage (MinIO)
pipelinesread, execute, adminData pipeline execution

Actions

ActionMeaning
readGET / list / query — no mutations
writeCreate / update / delete
executeTrigger execution (model call, tool call, pipeline run)
adminAll of the above + destructive ops (delete all, purge, force rollback)

JWT Permission Claims

Permissions are embedded in the JWT as an array under the permissions claim:

{ "sub": "user_abc123", "iss": "https://auth.isa.ai", "permissions": [ "agents:read", "agents:execute", "tools:execute", "models:execute", "billing:read" ], "exp": 1743120000 }

Common Permission Sets

Builder (typical developer API key)

[ "agents:read", "agents:write", "agents:execute", "tools:read", "tools:execute", "models:read", "models:execute", "sessions:read", "sessions:write", "billing:read" ]

Operator (production monitoring)

[ "agents:read", "agents:execute", "tools:read", "models:read", "sessions:read", "checkpoints:read", "billing:read", "audit_logs:read" ]

Admin

[ "agents:admin", "tools:admin", "models:admin", "sessions:admin", "checkpoints:admin", "users:admin", "orgs:admin", "billing:admin", "audit_logs:admin", "storage:admin", "pipelines:admin" ]

Read-Only Auditor

[ "agents:read", "billing:read", "audit_logs:read", "sessions:read" ]

Endpoint → Permission Mapping

EndpointRequired permission
POST /api/v1/invokemodels:execute
GET /api/v1/modelsmodels:read
GET /api/v1/usagebilling:read
GET /api/v1/auditaudit_logs:read
DELETE /api/v1/tenants/{id}orgs:admin
GET /api/v1/agents/{id}agents:read
POST /api/v1/agentsagents:write
POST /api/v1/deploymentsagents:write
POST /api/v1/deployments/{id}/promoteagents:admin

Error Response

When a request lacks the required permission:

{ "error": "forbidden", "message": "Missing required permission: billing:read", "required": "billing:read", "status": 403 }

Feature Flag Rollout

RBAC can be enabled incrementally using the RBAC_ENABLED flag. During rollout:

  1. Deploy with RBAC_ENABLED=false — all existing requests continue working
  2. Audit JWT claims across your API keys using GET /api/v1/audit?resource=auth
  3. Update API key permissions to match required scopes
  4. Set RBAC_ENABLED=true in production

Next Steps