Skip to content

Permissions

A permission is named <resource>:<action>. A member’s role carries a set of them, and so does an API key. The GraphPilot API checks them on every operation, and the portal hides or disables most controls a member may not use. Which role holds which permissions is in the table under members and roles.

Each resource has two levels: view reads it, and edit changes it and includes view. A role still lists both: a key can only be given permissions the member creating it holds by name, so a role with service:edit alone could not create a read-only key. Three permissions stand on their own because of what they do: deleting a service, deleting the organization, and purging.

PermissionAllows
service:viewSeeing the organization’s services and reading them through the API, including ipRanges, purges, custom domains, telemetry and the persisted query registry. Without it, services are not visible and lists come back empty.
service:editEverything service:view allows, and creating a service (within the plan’s allowance), changing its settings, origin, custom domains, alert rules and persisted query manifest, uploading the schema and configuration every deployment starts with, reading the deployed configuration back, and seeing (masked), rotating and activating its signing key. It does not include deleting a service or purging.
service:deleteDeleting a service, with a confirmation code, and resetting a service’s history. Includes seeing the organization’s services, not their custom domains.
deployment:viewSeeing deployments (Deployments), what each one built, its diagnostics and configuration analysis, and the portal’s Schema and Config pages. Through the API, the live deployment’s schema and analysis on the service (Service.deployedSchema, Service.schemaAnalysis, Service.configAnalysis) need only service:view.
deployment:editEverything deployment:view allows, and starting a deployment, canceling one that is still in progress, and tearing down a service’s deployed edge infrastructure while keeping the service.
cache:purgeEvery purge. service:edit does not include it.
organization:editChanging the organization’s settings.
organization:deleteDeleting the organization, with a confirmation code.
billing:viewSeeing the plan, payment method and billing address.
billing:editEverything billing:view allows, and changing the plan, payment method and billing address.

Roles and API keys set up before October 2026 can carry the earlier, finer-grained names. They keep working for now, each allowing what it allowed before, and will stop being accepted once every role and key has moved to the names above. A key that carries one should be replaced with a key that carries the new name.

Earlier nameNow part of
service:create, service:view-signing-key, service:rotate-signing-key, service:activate-signing-keyservice:edit
service:manageservice:edit and service:delete
deployment:create, deployment:delete, deployment:cancel-deployment, deployment:managedeployment:edit
organization:manageorganization:edit and organization:delete
billing:managebilling:edit

Your own account is not governed by permissions: anyone can delete their own account. See your account.

An API key can carry these six permissions:

service:view, service:edit, deployment:view, deployment:edit, cache:purge, billing:view

Everything a person decides, such as organization settings, billing changes or deleting a service, is not available to a key. A key holding service:edit cannot see, rotate or activate the signing key: those parts of service:edit are removed from every API key. A key holding service:edit can read the deployed configuration back, as a member can. Deleting a service, an organization or an account also needs a confirmation code, which an API key cannot request or spend (FORBIDDEN). The earlier names service:create, deployment:create and deployment:delete are still accepted on a key while they are being phased out.

WhereWhat happens
A read through the APIFiltered, not refused: a key without service:view sees no services, not an error.
A mutation through the APIRefused with FORBIDDEN. See codes.
The gpilot CLIThe API’s error is printed and the CLI exits with 4. See exit codes.
The portalThe control is hidden or disabled; a disabled one says why when you point at it.

What each job needs. Every CLI command that takes --service looks the service up first, which needs service:view.

JobCLIAPIPermissions
Deploygpilot deploycreateSchemaUploadUrl, createConfigUploadUrl, createDeployment, deploymentProgressservice:edit (uploads the schema and configuration) and deployment:edit (starts the deployment and waits for the result)
Cancel a deploymentgpilot deployment cancelcancelDeploymentdeployment:edit
Tear down the edge infrastructuregpilot service destroydestroyDeploymentdeployment:edit
Pin or unpin the runtime versiongpilot service runtime pin, gpilot service runtime unpinsetServiceRuntimePinservice:edit and deployment:edit (changing the pin can redeploy the service, and decides what its next deployment builds)
Read a deployment’s diagnosticsgpilot deploy outputDeployment.diagnostics, Deployment.configAnalysisservice:view, deployment:view
Read the deployed configurationgpilot config get, the portal’s gpilot.toml viewscreateConfigDownloadUrl, Deployment.configDocumentservice:edit, for members and API keys alike. Every resolved setting, secrets redacted, needs only deployment:view (configAnalysis, the portal’s Config values).
Purge the cachegpilot purgepurgeBySurrogateKey, purgeByQueryHash, purgeByRequest, purgeAll, POST /purgecache:purge
Read the purge historyService.purgesservice:view
Push persisted queriesgpilot pq pushpushPersistedQueriesservice:edit
Revoke persisted queriesgpilot pq rm, gpilot apq rmremovePersistedQueriesservice:edit
List persisted queriesgpilot pq list, gpilot apq lsService.persistedQueries, Service.clientRegisteredQueriesservice:view
Create a servicegpilot service createcreateServiceservice:edit
Read request telemetrygpilot requestsService.requests, serviceRequestsStreamservice:view; some filters also need a plan, see Insights
Read the origin IP rangesService.ipRangesservice:view
Manage custom domainsaddServiceDomain and the other domain mutationsservice:edit
Switch an alert rule on or offsetAlertRuleEnabledservice:edit; reading the rules (Service.alertRules) needs service:view
See the signing key, maskedService.signingKey, Service.pendingSigningKeyservice:edit
Rotate the signing key, or cancel a rotationrotateServiceSigningKey, cancelServiceSigningKeyRotationservice:edit
Activate a pending signing keyactivateServiceSigningKeyservice:edit
Delete a servicegpilot service deleterequestActionConfirmation, deleteServiceservice:delete and a confirmation code; a member, not an API key
Reset a service’s historyresetServiceHistoryservice:delete; a member, not an API key

The signing-key rows are for members only: an API key that carries service:edit still cannot do them.