API overview
REST surface map — base URL, response envelope, error model, pagination, and account scoping.
The buzzabout REST API is a thin layer over the same primitives the web app uses. Everything you can do in the product, you can do through this API.
Beta
The API is stable for datasets, mentions, audience_datasets,
and audience_profiles. Newer endpoints (tracking agents, pattern
detections, custom parameters, ask, chats, me) may change. We'll
bump the URL prefix from /v1 to /v2 before any breaking change.
Base URL
https://api.buzzabout.aiAll endpoints live under /v1. Examples in these docs use absolute
URLs so they're easy to copy.
OpenAPI spec
The full machine-readable spec is published at
https://api.buzzabout.ai/openapi.json —
this is the same document that powers the playground on every endpoint
page in these docs. Codegen-friendly; rebuilt on each release.
A hosted Swagger UI lives at
https://api.buzzabout.ai/docs for
quick exploration outside the docs site.
Authentication
Every request needs an x-api-key header:
x-api-key: bz_live_...See authentication for key lifecycle and team semantics.
Content type
JSON in, JSON out. Send Content-Type: application/json on any
request that has a body.
Response envelope
Every response is wrapped in a discriminated envelope. The top-level
status field tells you which shape you got:
{
"status": "success",
"data": { "...": "..." }
}{
"status": "success",
"data": [ { "...": "..." }, { "...": "..." } ],
"has_next": true,
"cursor": "eyJjcmVhdGVkX2F0IjogMTcxNDU2NDg5MCwgImlkIjogImRzXzAxSCJ9"
}{
"status": "client_error",
"error_code": "dataset_not_found",
"detail": "Dataset not found",
"transient": false
}status collapses the HTTP status class:
| HTTP class | status |
|---|---|
| 1xx | info |
| 2xx | success |
| 3xx | redirect |
| 4xx | client_error |
| 5xx | server_error |
Successful 2xx responses always carry a data field. Error responses
carry error_code, detail, and transient (when true, retrying
the same request later may succeed).
A 204 No Content returns an empty body — used for soft-deletes,
pause/resume, and other no-content writes.
Pagination
List endpoints use cursor-based pagination. Pass limit and cursor:
| Parameter | Type | Default | Notes |
|---|---|---|---|
limit | integer | 10 for resources, 20 for mentions / profiles, 25 for chat messages | 1–100. |
cursor | string | null | Opaque base64url. From cursor in a previous response. |
order | enum | desc | asc or desc (where supported). |
The response includes has_next: bool and cursor: string \| null.
When has_next is false, the cursor is null and the page is the
last one.
Cursors are sort-aware on mentions / audience_profiles. If you
change the sort field between calls, request a fresh page (don't pass
the old cursor — it'll fail validation).
Errors
| HTTP | error_code examples | What it means |
|---|---|---|
| 400 | bad_request, source_dataset_has_no_completed_run | Bad request semantics or insufficient state. |
| 401 | unauthorized | Missing or invalid x-api-key. |
| 402 | insufficient_credits | Account has no credits left for this operation. See Pricing. |
| 404 | dataset_not_found, pattern_not_found, chat_not_found | Resource doesn't exist or isn't owned by the key. |
| 409 | audience_dataset_run_already_in_flight | A pending / working run blocks a new one. |
| 422 | unprocessable_entity | Body or query parameters are malformed. |
| 429 | too_many_requests | See rate limits. |
| 5xx | internal_server_error | Something on our end. Often paired with transient: true. |
The error_code is stable — match on it, not on the human-readable
detail.
Account scoping
Every API key carries an account_id (shared with the rest of the
team) plus a user_id (the acting seat):
- Account-shared resources — datasets, mentions, audience datasets, audience profiles, tracking agents, pattern detections, custom parameters — are visible to every key on the account.
- Chats are user-owned: only the seat that created a chat can
read it. Cross-seat lookups return
404. See Chats. - Resource ids on inputs must reference resources owned by the calling
account — otherwise the endpoint returns
404instead of403(existence is hidden). - Global mentions and audience-profiles endpoints implicitly scope to
your account; passing
dataset_ids/audience_dataset_idsonly narrows further.
Endpoint groups
Datasets
Container CRUD plus async scraping runs.
Tracking agents
Scheduled re-scraping with drift alerts.
Audience datasets
Profile collection from a source dataset.
Mentions
Global filterable mention search.
Audience profiles
Global filterable profile search.
Pattern detections
Cross-mention narrative clustering.
Custom parameters
Bespoke LLM-extracted per-mention fields.
Ask + chats
Assistant turns plus chat history reads.
Account + pricing
me, usage history, current credit prices.
Next steps
- Reference types — how assistant
references[]and inline post links resolve. - Rate limits — the per-route quotas.
- Pricing — per-result credit costs.