Conventions
Methods
Most creations return 201, other successes 200.
Errors
Read the HTTP status first. The body of an error has a message that says what went wrong, in one of two shapes.
Most errors, validation included:
validationErrors lists, for each invalid field, what is wrong with it. Some endpoints, sign-in among them, answer
with the envelope of successful responses instead, with "success": false, the reason in message and
"data": null.
Pagination
Lists return all their items at once, except the issues of a project, which can also be read page by page with
GET /api/workspaces/{slug}/projects/{projectId}/issues/paged. It takes page (from 0) and size (default 30,
at most 100), and returns a page in data:
Read the next pages until last is true.
Rate limits
Each IP address has a budget per minute:
Each response carries X-RateLimit-Remaining. Past the limit, the API answers 429 with Retry-After, the number
of seconds to wait, and a short body:
Wait for Retry-After before retrying, and back off when you retry several times.
AI features also share a budget per minute across the instance (429 with Retry-After), and the instance may
cap each workspace owner’s AI use per month: past that cap, AI calls return 409 until the first day of next month.
Formats
- Identifiers are numbers (
projectId,issueId). Issues also have a readable identifier made of the project’s key and a number (WEB-42). - Dates are ISO 8601. Date-times are in UTC, written without a time zone (
2026-10-19T14:12:00): add theZbefore converting them to local time. - Text in issues, comments and Brain OS pages is Markdown.
Good habits
- Make your calls safe to repeat: after a network error or a
429, the same call may run twice. - Generate a client from the OpenAPI description rather than writing each call by hand: contract changes then show up when you regenerate it.