REST API
Read projects, issues, events, and AI triage — and change issue status — with an API token. Prefer an agent? See AI agents & MCP.
Authentication
Base URL: https://api.booboo.dev. Create a token in Organization → API tokens
(see Create an API token) and send it on every request:
Authorization: Bearer boo_… Requests and responses are JSON. Tokens are bound to one organization and optionally one project; a Read token can only make GET requests. An invalid, revoked or expired token gets 401.
A Read token grants the same read access as its creator, including member email addresses and full event payloads (request data, user context, breadcrumbs), which may contain your users' personal data. Treat tokens like passwords: never commit them, and scope them to a single project where possible. Tokens expire after 90 days by default (choose Never explicitly if you need a long-lived one), and revoking one under Organization settings → API tokens takes effect immediately.
Example
curl -H "Authorization: Bearer $BOOBOO_API_TOKEN" \
"https://api.booboo.dev/organizations/my-org/projects/backend/issues/?status=open&limit=5" Endpoints
Paths starting with … continue from /organizations/{org}/projects/{project}/. {short_id} is the issue number (the 42 in BACK-42).
| Method | Path | Notes |
|---|---|---|
GET | /organizations/{org}/projects/ | Projects the token can see |
GET | /organizations/{org}/projects/{project}/ | Project detail |
GET | …/{project}/environments/ | Distinct environments seen in the project |
GET | …/{project}/issues/ | List issues — see filters |
GET | …/issues/{short_id}/ | Issue detail |
PUT | …/issues/{short_id}/ | Change status. Body {"status": "resolved"} (open, resolved, or ignored). Read & write tokens only |
GET | …/issues/{short_id}/events/ | Events for the issue, newest first — see parameters |
GET | …/issues/{short_id}/events/{event_id}/ | Event detail with full stack trace, breadcrumbs, request, and context |
GET | …/issues/{short_id}/triage/ | AI triage for the issue, or {"status": "not_generated"} / "generating" |
Issue list parameters
| Parameter | Description |
|---|---|
status | open, resolved, or ignored |
environment | Only issues seen in this environment |
since | ISO 8601 timestamp — issues first seen at or after it ("new issues") |
active_since | ISO 8601 timestamp — issues last seen at or after it |
sort | last_seen (default), first_seen, or count; always descending |
limit | 1–500. When present the response is a page {results, count, limit, offset}; without it, a bare array |
offset | Skip this many issues (use with limit) |
Invalid timestamps return 400.
{
"results": [ ... ],
"count": 37,
"limit": 5,
"offset": 0
} Issue object
{
"short_id": 42,
"display_id": "BACK-42",
"project_slug": "backend",
"title": "ZeroDivisionError: division by zero",
"culprit": "app/utils.py in safe_divide",
"status": "open",
"level": "error",
"is_regression": false,
"first_seen": "2026-10-17T09:12:44.120Z",
"last_seen": "2026-10-18T07:58:03.511Z",
"count": 17,
"environments": ["production"]
} Event list parameters
| Parameter | Description |
|---|---|
limit | 1–200. When present the response is a page {results, count, limit, offset}; without it, a bare array of the newest 200 events |
offset | Skip this many events (use with limit) |
List items are a summary; fetch an event by id for its request data, context, tags, and breadcrumbs.
Errors
| Status | Meaning |
|---|---|
401 | Missing, invalid, revoked, or expired token. Response includes WWW-Authenticate: Bearer |
403 | Outside the token's scope: another organization or project, a write with a Read token, an endpoint tokens can't use, or the creator's role doesn't allow it |
404 | Project, issue, or event doesn't exist |
429 | Rate limit exceeded — 600 requests per hour per token |