Skip to Content
AuthorizationRoles & Permissions

Roles & Permissions

SkaleData defines four org-level roles, managed through Clerk. Each user in an org has exactly one role. Roles are hierarchical — higher roles inherit all permissions of lower roles.

Role hierarchy

LevelRoleDescriptionTypical user
4OwnerFull control — billing, org settings, destroy clusters, manage membersFounder, CTO
3AdminManage clusters, clouds, apps, API keys. No billing or org deletionData lead, platform engineer
2OperatorDeploy apps, manage DAGs, view logs, restart apps, terminal accessData engineer, analytics engineer
1ViewerRead-only access to all resources in the orgStakeholder, new hire

Permission matrix

Owner only

ActionEndpoint
Update org settingsPATCH /orgs/me
Manage billing (subscribe, cancel, change plan)POST /billing/*
Create Stripe portal sessionPOST /billing/portal-session

Admin and above

ActionEndpoint
Create clusterPOST /clusters
Update cluster configPATCH /clusters/{id}
Upgrade cluster versionPOST /clusters/{id}/upgrade
Apply cluster (re-run terraform)POST /clusters/{id}/apply
Retry failed clusterPOST /clusters/{id}/retry
Destroy clusterDELETE /clusters/{id}
Manage node poolsPOST/PATCH/DELETE /node-pools/*
Link/unlink cloud accountsPOST/DELETE /clouds/*
Verify cloudPOST /clouds/{id}/verify
Cancel jobsPOST /jobs/{id}/cancel
Create/revoke API keysPOST/DELETE /api-keys/*
GitHub integrationGET/POST /github/*

Operator and above

ActionEndpoint
Deploy custom imagePOST /clusters/{id}/deploy-image
Upload DAGsPOST /applications/{id}/dags
Restart applicationPOST /applications/{id}/restart
Retry failed appPOST /applications/{id}/retry
Update app configPATCH /applications/{id}
Delete applicationDELETE /applications/{id}
Add app to clusterPOST /clusters/{id}/add-app
Get deploy scriptGET /clusters/{id}/deploy-script
Create registry tokenPOST /clusters/{id}/registry-token
Dev credentialsPOST /applications/{id}/dev-credentials
Terminal pod setupPOST /clusters/{id}/terminal/setup

Viewer (all authenticated users)

ActionEndpoint
List/get clustersGET /clusters, GET /clusters/{id}
List/get applicationsGET /applications, GET /applications/{id}
View application healthGET /applications/{id}/health
List/get jobsGET /jobs, GET /jobs/{id}
View pod list and logsGET /clusters/{id}/pods, GET /clusters/{id}/pods/{name}/logs
List cloudsGET /clouds, GET /clouds/{id}
View billing statusGET /billing/subscription
View org infoGET /orgs/me

Backwards compatibility

If a Clerk JWT does not contain a role claim (e.g., older Clerk configurations), the user defaults to the admin role. This ensures existing users are not locked out when RBAC is first enabled.

Setting up roles in Clerk

Create these four custom roles in your Clerk Dashboard  under Organizations > Roles:

  1. owner — assign to org creators
  2. admin — default for existing members
  3. operator — for engineers who deploy but don’t manage infrastructure
  4. viewer — for read-only stakeholders

Clerk automatically includes the role in the JWT’s o.rol field.

Last updated on