SigSentrySigSentry

Key permissions

The permission list each API key carries, what each one allows, and how to grant the minimum a job needs

Every API key carries an explicit list of permissions chosen at creation time. The key can only do what its permission list allows — nothing more, nothing less.

The permission list

PermissionWhat it allowsExample endpoints
analysis:createTrigger new analyses, ask follow-up questions, submit feedbackPOST /v1/analyses, POST /v1/analyses/:id/followup
analysis:readView existing analyses and their resultsGET /v1/analyses, GET /v1/analyses/:id
config:readView project configuration — log sources, channels, watchdog rules, teamGET /v1/log-sources, GET /v1/channels, GET /v1/watchdog/rules
config:writeModify project configuration — add log sources, edit rules, manage channelsPOST /v1/log-sources, PATCH /v1/watchdog/rules/:id

To mint or revoke keys, use the dashboard — Project → SDK Keys, Project → API Keys, or Organization → API Keys. There is no apikey:* permission, so a programmatic key never carries the right to mint another key on your behalf.

Locked permissions on ss_pub_*

Public keys (ss_pub_*) are locked at the platform level to analysis:create and analysis:read. The dashboard form has no permission picker, and the API rejects mint requests that try to broaden the set with 400 INVALID_PUBLIC_KEY_PERMISSIONS. This makes SDK keys safe to ship in browsers and mobile apps — even a stolen key can only run and read analyses.

ss_secret_* and ss_org_* keys can carry any combination from the table above, picked at creation time.

How keys differ from roles

Dashboard users have a role (owner, admin, member, viewer) that maps to a fixed set of permissions. API keys do not.

A key created by an admin doesn't automatically inherit the admin's permissions. The creator picks the key's permission list explicitly. A key only ever has what was granted at creation time.

That separation is intentional — it lets you hand a narrow, purpose- built credential to a CI job or third-party integration without worrying that someone's role change will quietly expand what the key can do.

Role-based access (dashboard users)API key access
Permissions sourceDerived from the user's roleListed explicitly on the key
Changes when role changesYesNo — by design, you rotate a key when its needs change
Typical scopeAll projects the user belongs toOne project, or all projects
LifetimeWhile the user is logged inUntil revoked

Granting the minimum

The most common mistake is over-granting. A CI job that runs analyses on every pull request needs analysis:create and analysis:read — nothing more. Don't tick config:write "just in case."

CI / smoke tests

analysis:create + analysis:read. Triggers analyses, reads results, no configuration access.

Read-only dashboard widget

analysis:read + config:read. Lists analyses and shows project configuration; can't modify anything.

Infra-as-code provisioner

config:read + config:write on an ss_org_* key (it spans projects). Creates and updates log sources and rules from Terraform or similar; no analysis access needed.

Full server integration

All four base permissions on an ss_secret_* or ss_org_* key. Use sparingly — usually only for trusted internal tools.

A pattern: minimum-permission keys for CI

A typical CI pipeline triggers an analysis on each deploy and waits for the result:

# Stored as SIGSENTRY_CI_KEY in GitHub Actions secrets.
# Permissions: analysis:create, analysis:read

curl -X POST https://api.sigsentry.com/v1/analyses \
  -H "Authorization: Bearer $SIGSENTRY_CI_KEY" \
  -H "X-Project-Id: $SIGSENTRY_PROJECT_ID" \
  -d '{ "description": "post-deploy smoke check", "windowMinutes": 15 }'

That key cannot read your team list, edit log sources, or change notification channels — even if a maintainer's account is later compromised, the CI key's reach is bounded.

Checking what a key can do

The dashboard's API Keys table shows the permission list for every key in the Permissions column. To audit a key:

Find the key by name or prefix

Each row shows the key's prefix — match it against the prefix your application is using.

Read the Permissions column

It lists every permission the key carries. If the list is broader than the integration needs, revoke the key and create a new one with fewer permissions.

To change what a key can do, rotate it. Create a new key with the desired permission list, switch the integration over, and revoke the old one. See Revoking keys for the rotation procedure.