Roles and permissions
What each built-in role and an API key may do, permission by permission, and which API routes require each one.
Every route on the CoreValue API names one permission it requires, and every role is a set of permissions. Both are declared in code, so this page is rendered from that declaration rather than written beside it.
Built-in roles
An organisation has three built-in roles. They mean the same thing in every organisation and cannot be edited.
- Owner holds every permission, including the four ownership actions: transfer the organisation, delete it, cancel the subscription and remove a payment method. There is one owner per organisation, and ownership moves only by transfer.
- Admin holds everything except
ownership. - Member reads traffic and annotates it:
traffic.readandtraffic.annotate.
Every role, and every API key, holds org.read: the organisation you belong
to, its entitlements and settings reads. It is what lets a person open the
console at all, and no role can drop it.
API keys carry no role. A key holds exactly what a member holds and nothing above it, whichever role the person who created it has. What a key may do is bounded separately, by the permissions set on the key itself.
Custom roles are an Enterprise feature. The catalogue below is what a
custom role is built from: any permission except ownership, which no role
can be given.
The permission catalogue
| Permission | What it allows | Owner | Admin | Member | API key |
|---|---|---|---|---|---|
org.read | Open the organisation: its settings, entitlements and terms. Every role holds this. | ✓ | ✓ | ✓ | ✓ |
traffic.read | Dashboards, requests, sessions, metrics, properties, MCP and A2A views. | ✓ | ✓ | ✓ | ✓ |
traffic.annotate | Feedback, scores, tags and a request's custom property. | ✓ | ✓ | ✓ | ✓ |
org.settings.write | Organisation details, onboarding, PII and retention config, saved views. | ✓ | ✓ | — | — |
org.members.write | Invite, change roles, remove; teams and their membership; visibility mode. | ✓ | ✓ | — | — |
spend_controls.write | Budgets at every scope, key caps, alerts, downgrade mappings, rate limits, prices and declared value. | ✓ | ✓ | — | — |
gateway_config.write | Fallback chains, cache and routing. | ✓ | ✓ | — | — |
keys.write | API keys, proxy keys and their scopes. | ✓ | ✓ | — | — |
provider_keys.write | Provider keys and the vault. | ✓ | ✓ | — | — |
egress.write | Webhooks and integrations: data leaving the organisation. | ✓ | ✓ | — | — |
governance.write | Access rules, MCP and A2A registries. | ✓ | ✓ | — | — |
reports.read | Chargeback, unit economics, value, the budget summary, the breach log, invoices, spend by model, and customer budgets and prices. | ✓ | ✓ | — | — |
audit.read | Read the organisation's audit log and export it. | ✓ | ✓ | — | — |
billing.write | Checkout, upgrades, add-ons and payment setup. | ✓ | ✓ | — | — |
playground.use | Chat with models and MCP tools in the console playground, spending as yourself. | ✓ | ✓ | — | — |
ownership | Transfer, delete the organisation, cancel the subscription, remove a payment method. The owner only; no role can hold it. | ✓ | — | — | — |
Routes by permission
Which API routes require each permission. A path segment in braces is a parameter. A route that does not appear here is not gated on a role.
org.read
GET /v1/a2a/agentsGET /v1/api-keys/scopes/entitlementGET /v1/governance/access-defaultGET /v1/governance/access-rulesPOST /v1/governance/access-rules/auditGET /v1/governance/entitlementGET /v1/mcp-connectionsPOST /v1/mcp-connections/authorizePOST /v1/mcp-connections/consentGET /v1/mcp-connections/settingsDELETE /v1/mcp-connections/{grantId}GET /v1/mcp/serversPOST /v1/mcp/upstream/connectGET /v1/mcp/upstream/connect/{handle}POST /v1/mcp/upstream/connect/{handle}/continueGET /v1/mcp/upstream/connectionsDELETE /v1/mcp/upstream/connections/{connectionId}POST /v1/organization/user/accept_termsGET /v1/organization/{id}/permissions/meGET /v1/organization/{id}/rolesGET /v1/organization/{id}/roles/entitlementGET /v1/organization/{id}/sso/entitlementGET /v1/teamGET /v1/team/settings/visibilityGET /v1/team/{teamId}/membersGET /v1/tool-rates
traffic.read
POST /v1/a2a/callsPOST /v1/a2a/summaryPOST /v1/budget/actions/breakdownPOST /v1/budget/actions/over-timePOST /v1/dashboard/scores/queryPOST /v1/dashboard/verdictsPOST /v1/mcp/filter-optionsPOST /v1/mcp/summaryPOST /v1/mcp/tool-callsPOST /v1/metrics/activeUsersPOST /v1/metrics/averageLatencyPOST /v1/metrics/averageTimeToFirstTokenPOST /v1/metrics/averageTokensPerRequestPOST /v1/metrics/cacheSavingsPOST /v1/metrics/costEfficiencyPOST /v1/metrics/costOverTimePOST /v1/metrics/costPerTokenOverTimePOST /v1/metrics/countryPOST /v1/metrics/errorBreakdownPOST /v1/metrics/errorOverTimePOST /v1/metrics/latencyOverTimePOST /v1/metrics/modelsPOST /v1/metrics/modelsOverTimePOST /v1/metrics/propertyAggregationPOST /v1/metrics/quantilesPOST /v1/metrics/requestCountPOST /v1/metrics/requestOverTimePOST /v1/metrics/requestStatusOverTimePOST /v1/metrics/spendTrendPOST /v1/metrics/threatsOverTimePOST /v1/metrics/timeToFirstTokenPOST /v1/metrics/tokensOverTimePOST /v1/metrics/totalCostPOST /v1/metrics/totalRequestsPOST /v1/metrics/totalThreatsPOST /v1/metrics/usersOverTimePOST /v1/property/hidden/queryPOST /v1/property/properties/over-timePOST /v1/property/queryPOST /v1/property/{propertyKey}/searchPOST /v1/property/{propertyKey}/top-costs/queryPOST /v1/property/{propertyKey}/top-requests/queryPOST /v1/providersPOST /v1/request/count/queryPOST /v1/request/queryPOST /v1/request/query-clickhousePOST /v1/request/query-idsPOST /v1/request/{requestId}/assets/{assetId}POST /v1/security/pii/over-timePOST /v1/security/pii/recentPOST /v1/security/pii/summaryPOST /v1/session/queryPOST /v1/spend/byPOST /v1/test/gateway-requestPOST /v1/user/metrics-overview/queryPOST /v1/user/metrics/queryPOST /v1/user/query
traffic.annotate
POST /v1/request/{requestId}/feedbackPUT /v1/request/{requestId}/propertyPOST /v1/request/{requestId}/scorePOST /v1/session/{sessionId}/feedbackPOST /v1/session/{sessionId}/tag
org.settings.write
POST /v1/filterDELETE /v1/filter/{id}PATCH /v1/filter/{id}PUT /v1/mcp-connections/settingsPOST /v1/organization/body-retention-configPOST /v1/organization/onboardPOST /v1/organization/pii-configPOST /v1/organization/update_onboardingPOST /v1/organization/{id}/create_filterDELETE /v1/organization/{id}/ssoGET /v1/organization/{id}/ssoPUT /v1/organization/{id}/ssoPOST /v1/organization/{id}/sso/testPOST /v1/organization/{id}/sso/verify-domainPOST /v1/organization/{id}/updatePOST /v1/organization/{id}/update_filterPOST /v1/property/hidePOST /v1/property/restore
org.members.write
POST /v1/organization/{id}/add_memberDELETE /v1/organization/{id}/remove_memberPOST /v1/organization/{id}/rolesPATCH /v1/organization/{id}/roles/{roleId}POST /v1/organization/{id}/roles/{roleId}/archivePOST /v1/organization/{id}/update_memberPOST /v1/teamPUT /v1/team/settings/visibilityDELETE /v1/team/{teamId}PUT /v1/team/{teamId}DELETE /v1/team/{teamId}/memberPOST /v1/team/{teamId}/member
spend_controls.write
DELETE /v1/budget/alert-configPUT /v1/budget/alert-configPOST /v1/budget/breachDELETE /v1/budget/customerPUT /v1/budget/customerDELETE /v1/budget/customer-pricePUT /v1/budget/customer-pricePOST /v1/budget/downgrade-mappingsDELETE /v1/budget/downgrade-mappings/{mappingId}PUT /v1/budget/member/{memberUserId}POST /v1/budget/notifyPUT /v1/budget/velocity-limitDELETE /v1/budget/velocity-limit/{id}PUT /v1/budget/window-limitDELETE /v1/budget/window-limit/{id}PUT /v1/budget/window-settingsPOST /v1/chargeback/{month}/closeDELETE /v1/model-pricesPUT /v1/model-pricesPUT /v1/model-prices/importPOST /v1/rate-limitsDELETE /v1/rate-limits/{ruleId}PUT /v1/rate-limits/{ruleId}POST /v1/recommendations/{recommendationId}/applyPOST /v1/recommendations/{recommendationId}/dismissPUT /v1/tool-ratesDELETE /v1/tool-rates/{id}DELETE /v1/value/ratePUT /v1/value/rate
gateway_config.write
POST /v1/gateway/fallback-chainsDELETE /v1/gateway/fallback-chains/{chainId}PUT /v1/gateway/fallback-chains/{chainId}
keys.write
POST /v1/api-keysPOST /v1/api-keys/proxy-keyPUT /v1/api-keys/proxy-key/{proxyKeyId}/scopesDELETE /v1/api-keys/{apiKeyId}PATCH /v1/api-keys/{apiKeyId}PUT /v1/api-keys/{apiKeyId}/scopesGET /v1/mcp-connections/orgGET /v1/mcp/upstream/connections/org
provider_keys.write
POST /v1/api-keys/provider-keyDELETE /v1/api-keys/provider-key/{providerKeyId}GET /v1/api-keys/provider-key/{providerKeyId}PATCH /v1/api-keys/provider-key/{providerKeyId}GET /v1/api-keys/provider-keysPOST /v1/vault/addGET /v1/vault/key/{providerKeyId}GET /v1/vault/keysPATCH /v1/vault/update/{id}
egress.write
GET /v1/integrationPOST /v1/integrationGET /v1/integration/slack/channelsGET /v1/integration/slack/settingsGET /v1/integration/type/{type}GET /v1/integration/{integrationId}POST /v1/integration/{integrationId}POST /v1/integration/{integrationId}/stripe/test-meter-eventGET /v1/webhooksPOST /v1/webhooksDELETE /v1/webhooks/{webhookId}POST /v1/webhooks/{webhookId}/test
governance.write
POST /v1/a2a/agentsDELETE /v1/a2a/agents/{id}PATCH /v1/a2a/agents/{id}PUT /v1/a2a/agents/{id}/keysPOST /v1/a2a/agents/{id}/probePUT /v1/governance/access-defaultPOST /v1/governance/access-rulesDELETE /v1/governance/access-rules/{id}PATCH /v1/governance/access-rules/{id}PUT /v1/mcp/platform-servers/{serverId}POST /v1/mcp/serversPOST /v1/mcp/servers/discoverDELETE /v1/mcp/servers/{id}PATCH /v1/mcp/servers/{id}POST /v1/mcp/servers/{id}/probe
reports.read
GET /v1/budget/breachesGET /v1/budget/customer-pricesGET /v1/budget/customersGET /v1/budget/summaryGET /v1/chargeback/{month}GET /v1/credits/invoicesGET /v1/credits/spend/breakdownGET /v1/unit-economicsGET /v1/valueGET /v1/value/rates
audit.read
GET /v1/organization/{id}/auditGET /v1/organization/{id}/audit.csv
billing.write
POST /v1/stripe/cloud/checkout-sessionPOST /v1/stripe/payment-methods/setup-sessionDELETE /v1/stripe/subscription/add-ons/{productType}POST /v1/stripe/subscription/add-ons/{productType}POST /v1/stripe/subscription/existing-customer/upgrade-to-growthPOST /v1/stripe/subscription/new-customer/upgrade-to-growthPOST /v1/stripe/subscription/undo-cancel-subscription
playground.use
GET /v1/playground/optionsPOST /v1/playground/servers/{serverId}/tools-checkPOST /v1/playground/step
ownership
DELETE /v1/organization/deletePUT /v1/organization/{id}/sso/enforcePOST /v1/organization/{id}/update_ownerDELETE /v1/stripe/payment-methods/{paymentMethodId}POST /v1/stripe/subscription/cancel-subscriptionPOST /v1/stripe/subscription/manage-subscriptionPOST /v1/stripe/subscription/migrate-to-pro
Generated from server/core/src/lib/authz/permissions.ts and middleware/rbac.ts; do not edit by hand.