Skip to main content

The envelope

Every JSON API error has the same shape:
Branch on code. The message is written for a human and may change; requestId is a fresh UUID per response, for correlating with server logs. The complete code list, with HTTP statuses and what to do about each one, is in Error codes.

Handling errors

Retry guidance

POST /api/v1/reports is safe to retry on a network failure: it is idempotent on localReportId and reuses the same quota reservation rather than charging twice.

What errors never contain

Operational logs and error responses carry ids, codes, and timings — never credentials, report bodies, source, or raw traffic. Two consequences worth relying on:
  • INTERNAL gives you a requestId and nothing else. The detail is in the server log.
  • A share link that is revoked, expired, or simply not permitted for you all answer the same SHARE_NOT_AVAILABLE, so the response cannot be used to learn whether a report exists.