Skip to main content
All errors share one shape:
{
  "error": {
    "code": "conflict",
    "message": "idempotencyKey was already used with a different payload",
    "details": { "idempotencyKey": "order-1001-reward" },
    "requestId": "f0e1d2c3-4b5a-6789-0abc-def012345678"
  }
}
  • code — a stable machine-readable code (see below).
  • message — human-readable explanation.
  • details — optional structured context. For validation failures (bad_request) this contains the specific field issues.
  • requestId — correlation id, also returned in the x-request-id header. Include it when contacting support.

Status codes

HTTPcodeMeaning
400bad_requestMalformed JSON or failed validation (details lists the issues).
401unauthorizedMissing or invalid x-api-key.
403forbiddenAuthenticated but not permitted.
404not_foundResource doesn’t exist (or belongs to another app).
409conflictUniqueness conflict — duplicate email/externalId, or idempotency-key reuse.
422unprocessable_entitySemantically invalid request.
500internal_errorUnexpected server error.
502upstream_errorAn upstream dependency failed.
Branch on error.code, not the HTTP status or message text — codes are stable, messages may change.