Errors

Every failure returns the same envelope — a success:false flag, a human-readable message, and an errors array. Branches on the HTTP status and reads the message; do not parse prose.

Error envelope#

json
{
  "success": false,
  "message": "API key does not have the required scope: ReadCustomer",
  "errors": ["API key does not have the required scope: ReadCustomer"]
}

Status codes#

StatusMeaningWhen
400Bad RequestA parameter or body is invalid. The message names the field.
401UnauthorizedMissing, malformed, expired, or inactive API key.
403ForbiddenThe key lacks the required scope, is outside its IP allowlist, or named another tenant.
404Not FoundNo such resource in the key’s tenant.
409ConflictThe request conflicts with current state (e.g. a duplicate, or a booking slot taken).
422Unprocessable EntityThe request was understood but failed a business rule.
429Too Many RequestsRate limited — see Rate limits.
500Internal Server ErrorUnexpected server error. Retry with backoff; contact support if it persists.

Handling#

Tip

Retry 429 and 5xx with exponential backoff. Treat 401 as a configuration problem (a bad or revoked key) rather than retrying. Read the missing scope from a 403 and grant exactly that — see Authentication.
Was this page helpful?