Authentication

Every request is authenticated with an API key sent as a bearer token.

The Authorization header

Send your key on every request:

Authorization: Bearer bbo_YOUR_KEY_HERE

There are no public data endpoints — a request without a valid key returns 401. (Only /api/health, /api/ready, and the interactive login are reachable without a key.)

Keep keys secret. A key grants access to your org's full data view. Store it in a secret manager or env var — never in client-side code or a committed file. Keys are shown once at creation; if lost, ask us to rotate.

About your key

Error codes

StatusMeaningFix
401 UnauthorizedMissing, malformed, expired, or revoked key.Check the Authorization header; request a new key.
402 Payment RequiredEndpoint requires a higher tier than your plan.Upgrade the plan for that feature.
403 ForbiddenYour entitlements don't include this endpoint or data slice.Ask us to widen your entitlements.
404 Not FoundUnknown path, or a resource id that doesn't exist / isn't yours.Check the path and id.
422 UnprocessableInvalid query/body params (e.g. bad range, out-of-bounds n).Fix the parameter; see the endpoint reference.
429 Too Many RequestsRate limit exceeded.Back off; honor the Retry-After header.

Rate limits

Limits are enforced per authenticated principal:

ScopeLimit
General API (/api/*)600 requests / minute
Intel Agent (/api/agent/*)30 requests / 5 minutes
Login attempts (per IP)10 / 5 minutes

When you exceed a limit you get 429 with a Retry-After header (seconds). A simple backoff:

import time, requests

def get(url, headers, **kw):
    while True:
        r = requests.get(url, headers=headers, **kw)
        if r.status_code != 429:
            return r
        time.sleep(int(r.headers.get("Retry-After", "5")))
Dashboard operators sign in interactively (email + password, optional 2FA) at the dashboard. Programmatic access always uses a bbo_ key as above.