Skip to main content
For how to obtain and send an API key, see Authentication. This page covers what happens once your key is on the request.

Status codes

The error body

Errors raised by an endpoint share one JSON body:
The body may also include stackTrace and suppressed as empty arrays; ignore them. Refusals decided before the request reaches an endpoint — a missing, unknown or revoked key, or a key scoped to a different account — return the platform’s standard 403 error body instead, and the JWT 401 carries only error.

The capabilities model

Every operation requires a capability — a read or write grant on a resource type: account, property, building, building space, lease, document, tag, or custom tag. Which capabilities your key carries depends on the key:
  • Account keys carry the REST API and MCP permissions chosen when the key was created. On accounts without granular permissions, they carry the account’s full grant set.
  • User keys carry their user’s permissions, or the subset chosen when the key was created — two keys on the same account can see different data.
Capability checks apply to the primary resource and to each include key. GET /leases/{leaseId} needs lease read; adding ?include=tags additionally needs tag read. A request missing any required capability is rejected with 403 — embedded collections are never silently dropped. Each endpoint page in this reference states the capabilities that operation requires.

Writes need the REST write module

POST, PATCH, and DELETE require the REST API write module to be enabled on the account, on top of the relevant write capability. If writes fail with 403 while reads work, the module is the first thing to check. See Write access for how it is granted.

When 404 means “no access”

For resource ids inside an account your key can see, the API deliberately does not distinguish “doesn’t exist” from “exists but you can’t see it” — so callers can’t probe for the existence of data they aren’t entitled to.
Practically: a 404 during integration debugging is often a permissions problem, not a wrong id. Check, in order:
  1. Is the {accountId} in the path the account the resource actually belongs to? A key scoped to a different account is refused with 403 before the lookup, so a 404 means the account matched but the resource did not.
  2. Does your key have the read capability for this resource type?
  3. Is it a user key whose user lacks access to this building? Building-level permissions filter what you can see, and building-scoped paths report that as 403.
  4. Only then: is the id actually wrong?