Choosing a key type
BugBoard has two kinds of API key, and which one you use depends entirely on where your code runs. A project can hold many named keys, and each is individually revocable — revoking one never affects the others.
| Where your code runs | Key type | Prefix | How it authenticates |
|---|---|---|---|
| Browser JS, mobile apps | Publishable | bb_pub_ |
Bearer token (+ optional origin allow-list) |
| Node / PHP / any server | Secret | bb_sec_ |
HMAC request signature (the secret is never sent) |
A secret key cannot be used as a bearer token, and a publishable key is not accepted on the signed path. Use the scheme that matches the key type.
Publishable keys — client-side
Use a publishable key anywhere the credential is shipped to end users and cannot be kept secret: a single-page app, a mobile binary, a browser extension.
- Public by design and write-only — it can only
POSTtasks to its one project, so a leak can't read or exfiltrate anything. - Contained by an optional origin allow-list and the project's monthly quota — those, not secrecy, are what limit abuse.
Authorization: Bearer bb_pub_<48 hex chars>
Secret keys — server-side
Use a secret key whenever the credential never reaches an end user: an API server, a worker, a backend job. The secret never travels on the wire — each request is HMAC-signed instead.
A secret key is issued as two values:
- a key id (
bbk_…) — public; identifies which key signed the request; - a signing secret (
bb_sec_…) — shown once; used to sign; never transmitted.
A simple rule
Can an attacker read your code or memory and extract the key? If yes (browser, mobile), use a publishable key and lock it down. If no (your servers), use a secret key.
For browser apps that need stronger guarantees, proxy reports through your own backend (which holds a secret key) instead of embedding a publishable key. See the server-proxy appendix in the JavaScript SDK guide.
API keys are separate from encryption keys. A key here proves who is reporting; to also keep the report body unreadable in transit, add a project encryption key (a public key safe to embed alongside either API key type). See Encrypted transport.
Ready to wire it up? Continue to Install an SDK or read the Authentication details.