Skip to main content
A SideShift access token carries exactly the scopes a company consented to, and nothing else. Scope enforcement is identical for every scope: a request without the required scope fails with insufficient_scope rather than silently returning less data.
Ask for the narrowest set that does the job. Consent screens show every scope you request, and a request for money-moving access is the most common reason a company declines.

The scope catalog

SideShift defines 65 capability scopes. 63 of them can be requested by a third-party client and consented to by a company; offline_access is a protocol signal rather than a capability, and 1 scope (performance:read) is grantable only to SideShift’s own organisation. 11 scopes are marked sensitive: they move money or change company configuration, the consent screen highlights them, and their tools are rejected for sandbox tokens. Request only what your integration needs.

Sensitive scopes

Sensitive scopes are not enforced differently, but they carry extra guards further down:
  • Their tools and endpoints are rejected for sandbox and test grants, so a test integration cannot move money or send outbound communication.
  • The MCP server can disable them globally with MCP_SAFE_MODE.
  • Money-moving writes require an Idempotency-Key, so a retried call cannot double-charge. See idempotency.

Verifying an access token

Access tokens are JWTs signed by SideShift. A resource server can verify one without calling SideShift on every request:
1

Fetch the signing keys

GET /api/oauth/v1/jwks returns the public JWKS. Cache it and refresh on an unknown kid, which is what a key rotation looks like from outside.
2

Check the signature and standard claims

Verify the signature against the matching kid, then check iss matches the issuer from discovery, aud matches https://app.sideshift.app/api/oauth/v1, and exp is in the future.
3

Check the scope for the operation

The token’s scopes are the ones consented to. Anything outside them must fail rather than degrade.
Verification is stateless up to this point. SideShift additionally applies runtime checks on its own side that a third party cannot replicate, including whether the grant has since been revoked and whether the company’s subscription is still active, so a structurally valid token can still be rejected with 401 or 402.
Do not treat a token as valid purely because it parses. A revoked grant produces a token that still verifies cryptographically until it expires.

Key rotation

Signing keys rotate. Clients that cache the JWKS should key their cache on kid and refetch when they see one they do not recognise, rather than on a fixed timer. Both discovery documents and the JWKS endpoint are public and unauthenticated.

Managing clients and grants from the dashboard

Registration does not have to go through POST /register. Settings → OAuth & MCP lets owners, admins, and members with the manageApiKeys permission:
  • Register a client for their own company automation, or an app other SideShift companies can connect to
  • Review every third-party app the company has connected, with granted scopes, and revoke any connection
  • Browse this scope catalog interactively
  • Run read-only requests against the API without writing any code
That is the quickest route for a single-company integration. Dynamic client registration remains the right path for a distributed app.