Skip to main content

Authentication

Self-serve REST, SDK, and CLI requests use a COLA Cloud API key in the X-API-Key header:
Generate API keys at Dashboard > API Keys in the web app. MCP clients may use the same key as a Bearer token:
OAuth-based assistant connectors use WorkOS-issued Bearer tokens and are scoped per connected app. See Assistant Security and Quotas for the assistant-specific scope and revocation model.

SDKs and CLI

Both SDKs require the API key as a constructor argument:
The CLI reads from the COLACLOUD_API_KEY environment variable or a persistent config file:

Quotas

Usage is metered by detail views (single-record lookups) and list records (items returned by list/search endpoints). Quotas are per-user across all channels (web app, API, SDKs, CLI, and MCP). See the live pricing page for current prices and plan terms. Upgrade your tier at Dashboard > API Keys > Upgrade.

Quota Headers

Every response includes these headers: When you exceed a quota, the API returns 429 Too Many Requests with an upgrade_url in the response body. Per-minute burst limits return a Retry-After header.

Pagination

List endpoints support page and per_page parameters: Responses include pagination metadata:

Error Responses

Recovering without repeated failures

Inspect error.code, not HTTP 429 alone. A short wait does not replenish a monthly allowance. Persist a quota pause across scheduled jobs and workers; X-Quota-Reset is a Unix timestamp in seconds for the next UTC calendar month. For burst throttling, coordinate calls that share a credential, wait at least Retry-After seconds, and resume sequentially with a bounded retry budget. GET /usage also uses the burst budget, so do not poll it immediately after a burst rejection. A 400 validation error needs a corrected request, not backoff.

COLA list sorting

For GET /api/v1/colas, omit sort to use newest approvals first, or use one of approval_date_desc, approval_date_asc, brand_name_asc, brand_name_desc, or relevance_desc. Unsupported values return 400 invalid_request with error.details.valid_values. Do not keep sending the unchanged request. Ascending approval-date and brand-name sorts require page pagination without cursor. For incremental cursor traversal, use the default sort and the returned cursor; restart pagination when changing sort or filters.