For AI agents: a documentation index is available at https://docs.coverbase.com/llms.txt. This page is also available in markdown by appending .md to the URL.
Your Coverbase representative turns on the third-party lifecycle features, including OAuth clients, for your organization.
ak_* key can use the OAuth 2.0 client credentials grant instead. An admin creates an OAuth client: a public client_id and a client_secret shown once. The integration trades them for a bearer token that lasts at most an hour, and sends that token wherever an ak_* key goes.
A token acts exactly like an ak_* key: it authenticates as your organization’s API service account, every public route and the IP allowlist apply unchanged, and its calls are recorded in the public API audit log. It carries the elevated scopes the client was granted, or fewer if the token request narrows them.
For a walkthrough, see OAuth 2.0 client credentials.
Get a token
POST
POST /v1/oauth/tokenapplication/x-www-form-urlencoded), not JSON. Send the client ID and secret as HTTP Basic credentials (preferred), or as client_id and client_secret form fields, but not both.
Request body
string
required
Must be
client_credentials.string
Space-separated scopes to request. Optional. It can only narrow what the client was granted: asking for a scope the client does not hold fails with
invalid_scope. Omit it to get every scope the client holds.string
The client ID (
cbci_...), when not sent in HTTP Basic.string
The client secret (
cbcs_...), when not sent in HTTP Basic.Example request
cURL
Example response
Cache-Control: no-store. Send the token as Authorization: Bearer cbat_... until expires_in seconds pass, then request a new one. A client holds at most 50 live tokens. Requesting a 51st revokes its oldest, so an integration should reuse a token until it expires rather than request one per call.
string
The bearer token, prefixed
cbat_.string
Always
Bearer.integer
Lifetime in seconds: the client’s token lifetime, between 300 and 3600.
string
The scopes the token carries, space-separated. Empty for a client with no elevated scopes.
Errors
Errors follow RFC 6749 section 5.2, not the coded envelope:List clients
GET
GET /v1/api-oauth-clients{ "clients": [ ... ] }, one client object per client, revoked ones included. Secrets are never returned.
Create a client
POST
POST /v1/api-oauth-clients201 Created with the client object plus client_secret. This is the only time the secret is returned. Coverbase stores only its SHA-256 digest and last four characters.
string
required
A label, 1 to 200 characters, such as “Archer sync”.
string[]
Elevated scopes to grant:
keys:manage, audit:read, banking:read, review:sensitive_changes. Granting any needs an admin dashboard JWT; any other caller gets 403 scope_grant_forbidden. Omit for a client with standard access.integer
How long each token lives, 300 to 3600. Default 3600.
cURL
Revoke a client
POST
POST /v1/api-oauth-clients/{client_row_id}/revokerevoked_at set. A server that already cached a token can keep accepting it for a few seconds. Creating and revoking clients are recorded in the activity log.
The client object
string
The client’s row ID, used in the revoke path.
string
The label.
string
The public client ID, prefixed
cbci_.string
The last four characters of the secret, to tell clients apart.
string[]
The elevated scopes granted.
integer
Token lifetime in seconds.
integer
Unix seconds.
integer | null
When the client last obtained a token.
integer | null
When it was revoked, or
null.