The Bearer prefix is required. A raw token on the header returns 401.
Personal access token. Found under Settings → Profile. A 48-character
hex string with your full role, no expiry. Good for exploring; rotate it with
POST /core/profile/reset_access_token if it ever leaks.
Scoped API key. Created by an account admin at
Settings → Developer → API keys or with
POST /api/v2/accounts/{account_id}/api-keys. Recognised by the hc_
prefix. Carries only the scopes you grant, plus its own
rate limit, optional IP allowlist and expiry. Works on
/core/accounts/{account_id}/… and /api/v2/accounts/{account_id}/… only;
it cannot read your profile or open a session.
Both go on the same header. The server tells them apart by the prefix.
Scope
A personal token acts as you. A scoped key acts as the account, limited to the
scopes it was given. When a key lacks a scope the response is 403:
Keeping it safe
Server-side only. A token in browser code is public the moment the bundle
ships, and a personal token can do everything your user can.
Keep it in an environment variable or a secrets manager. Prefer a scoped key
with the smallest scope set, an expiry date and an IP allowlist. If one leaks,
revoke or rotate it under Settings → Developer → API keys; the old value
stops working immediately.
Checking a token works
200 means the credential is authorized for this request. For 401, check
the token and the Authorization: Bearer format. For 403, check that the
account ID belongs to the key, its owner still has account access, and the
key includes conversations:read.