Skip to main content
Glide issues native client_credentials JWTs. There is no authorization server to configure, no dynamic registration, and no static bearer token.

Get your credentials

A Glide admin creates your partner record and returns client_id and client_secret once. Client IDs look like gpc_<slug>_<8 hex> and secrets like gps_ followed by 32 random bytes in base64url. Both contain only URL-safe characters. Store the secret in your server secret manager. Glide stores only a salted scrypt hash and can never show it to you again. If you lose it, ask Glide to rotate the secret.

Mint a token

POST https://glide.co/api/partner/oauth/token Send Content-Type: application/x-www-form-urlencoded with a required grant_type=client_credentials and an optional space-separated scope. Authenticate with HTTP Basic: form-encode each credential, then base64-encode client_id:client_secret per RFC 6749 section 2.3.1.
You may instead send client_id and client_secret as form fields. Do not do both. Combining the two authentication methods, or repeating any parameter, returns invalid_request. Form bodies are limited to 4096 bytes. Response:
Every token response carries Cache-Control: no-store and Pragma: no-cache.

Use the token

Send Authorization: Bearer <access_token> on every resource request.

Cache the token

Tokens live exactly one hour. Minting one per request will hit the 30 per minute issuance limit and waste latency on every call. Cache the token in process and refresh it shortly before expiry.
Treat a single 401 invalid_token as a signal to drop the cache and mint once more. Do not loop. If the second attempt also fails, the credentials or the client status is the problem, not the cache. Rotating your secret changes your cache key. Clear the cached token when you deploy a new secret.

Token claims

Partner tokens share the agent issuer’s ES256 signing key and issuer, published at /.well-known/agent-jwks.json. You do not need to verify them yourself, but the claims are stable if you want to inspect them. Glide verifies locally with JOSE against its configured public JWK. Verification permits only ES256, checks issuer, audience and type, enforces the one-hour maximum lifetime, and allows 30 seconds of clock skew. Missing or malformed key configuration returns 503 auth_unavailable on the resource API. Invalid tokens return 401 invalid_token.

Scopes

Two different things are called scopes, and both must line up. Token entitlements are what your client may request. They are recorded on your partner record. They default to the five consent scopes, and an admin can additionally authorize treasury:write. User consent scopes are what an individual user approved for you. See Users and consent. Omitting scope on the token request asks for all of your current entitlements. An explicit scope must be a subset of them, otherwise you get invalid_scope. Empty entitlements produce an empty scope string.
treasury:write is a token permission only. It never appears in a user grant or in consent copy, and it never substitutes for the user’s payouts:receive consent. Holding a token entitlement grants you nothing about any user.
Admin entitlement changes apply to newly issued tokens. Claims inside an already-issued JWT stay as they were until it expires.

Rotation and suspension

Ask Glide to rotate your client secret when you suspect exposure or on a schedule you set. Rotation replaces the stored hash immediately and keeps your client_id unchanged. The old secret can no longer mint tokens, but JWTs already issued stay valid until they expire, subject to the verifier’s clock tolerance. To cut off access right now, ask Glide to suspend the partner. Suspension disables resource access and webhook delivery immediately. Token issuance holds a lock on your partner row through verification and signing, so a concurrent rotation, entitlement change or suspension is ordered against issuance rather than racing it.

Rate limits and errors

Token issuance allows 30 requests per minute per registered client. Wrong-secret and suspended-client attempts count against the same budget. Unknown clients perform the same scrypt derivation against a dummy hash, so timing does not reveal whether a client exists. Token errors use the OAuth JSON envelope, which is different from the resource API envelope:
A 503 here means Glide withheld the token rather than issue one it could not audit. Retry with backoff.