Skip to main content
All API endpoints require authentication unless explicitly marked as public.

API Key Authentication

Include your API key in the X-API-Key header:

Key Format

The checksum enables client-side format validation before making a request:

Key Types

Publishable keys (cpk) differ from the other types in that they are:
  • Scoped to a single organization (returns org context, not user context)
  • Limited to a lower default rate (100 requests/minute) suited to client-side use
Per-key rate limits (rate_limit_per_minute, rate_limit_per_day) and optional expiration (expires_at) apply to every key type, not just publishable ones — see Rate Limits.

Key Lifecycle

Keys are shown once at creation time. The raw key is never stored — only its SHA-256 hash.

Organization Roles (RBAC)

Users belong to organizations through memberships, each with a role: Roles are evaluated per-organization. A user can be an Owner of one organization and an Editor of another.

Permission Reference

The five permissions marked No are reachable only from a signed-in browser session. An API key is refused with 403 even when the person who created it holds the role — deleting an organization, changing who belongs to it, moving money, and minting further keys all require a human at a keyboard.This is a property of the credential, not of the person: it applies to keys created by owners and by staff alike, and to OAuth bearer tokens. It exists so that a leaked key is bounded by what a key can do, rather than by whoever happened to create it. Automate these five against the Dashboard instead.

Session Authentication

Browser-based access (Dashboard, admin) uses Django session cookies. This is automatic when logged in and is primarily for internal use. API integrations should always use API key authentication.

Security Best Practices

  • Never expose csb or csu keys in client-side code — use cpk publishable keys instead
  • Store keys in environment variables, not in source code
  • Rotate keys periodically and revoke unused ones
  • Use per-key rate limits on publishable keys to prevent abuse
  • Set expiration dates on keys used for temporary integrations