Base URL
GET /api/v1 is the front door. It answers without a key: what the API is, how to get a key, and where the reference lives.
Authentication
Every other route takes a company API key as a bearer token:error.docs, so a caller with no credential at all is told where the way in is. Each operation names the one scope it is filed under, <resource>:<read|write>, where the resource is the first path segment after /api/v1/. A key minted today carries all of them; scopes are recorded on the key and on every audit row, and are not yet enforced.
Your first call
Confirm which company a key belongs to before doing anything with it:Responses
- A single resource answers
{"data": …}. A list answers{"data": […], "page": …}, andpageis there even when there is nothing more. - Paging is by cursor: pass
limitand the previous page’snextCursor. - Every refusal has one shape,
{"error": {"code", "message"}}. Branch oncode, never onmessage.
The API also serves this contract itself, to the same key, as Markdown, JSON or OpenAPI. The API lists where.

