Skip to main content

Error envelope

Every error has the same shape:
  • type is the broad kind of error. See the table below.
  • code is stable. Branch on it.
  • message is for people. It can change, so do not parse it.
  • param names the field at fault, or is null.
  • request_id matches the X-Request-Id header. Quote it if you contact us.

Status codes

Common codes

Request

Billing and plan

Permission

Not found

Each area has its own code, such as client_not_found, document_not_found, member_not_found, report_not_found or webhook_endpoint_not_found. All are 404. An id from another firm is treated as not found.

Conflicts

Rate limits

Each API key, and each connected app, may make 120 requests a minute. The window is a fixed minute. Every successful response carries these headers: Over the limit, the API answers 429 with code rate_limited and a Retry-After header in seconds. Wait that long, then try again.

Retrying

  • Retry 429 after Retry-After.
  • Retry 500, 502 and 503 with a backoff.
  • Do not retry 400, 401, 402, 403, 404 or 409 without changing something first.
  • Not every write is safe to repeat. A POST that creates something can create it twice. Read before you retry a create.

Pagination

Lists return one page at a time:
  • limit sets the page size, from 1 to 100. The default is 25.
  • When has_more is true, pass next_cursor as cursor to get the next page, or call next_page_url.
  • Keep the other query parameters the same while you page.
  • When has_more is false, next_cursor and next_page_url are null.