LumireCRM

Docs · Errors

Error envelope

Every non-2xx response uses RFC 7807 problem-details JSON:

{
  "type":     "https://lumirecrm.com/errors/validation-error",
  "title":    "validation-error",
  "status":   400,
  "detail":   "body.amount must be a positive decimal string",
  "instance": "/v1/payments/deposits",
  "errors":   [ { "path": "body.amount", "message": "..." } ],
  "request_id": "req_01H..."
}

SDKs surface this as a typed exception (Python LumireCRMError, PHP LumireCRMException, Go *APIError) — always inspect .status and.detail rather than the message.

Status reference

StatusTitleMeaning
400validation-errorBody or query failed Zod validation. Field-level details in payload.errors.
401unauthenticatedMissing / expired session cookie or invalid API key.
403forbiddenAuthenticated but the role/scope does not permit this operation.
404not-foundResource does not exist or is not visible to your tenant.
409conflictUnique-constraint violation (e.g. duplicate email, slug, ticket).
422unprocessable-entityRequest was well-formed but semantically invalid (state machine violation).
429rate-limit-exceededToo many requests. See X-RateLimit-* headers and the X-RateLimit-Tracker bucket id.
500internal-errorUnexpected failure. Always logged with a request id; retry is safe for idempotent ops.
503upstream-unavailableA required upstream (LumireOne, gateway, S3) is down. Retry with backoff.

Retry policy

  • GETs and idempotent operations: retry on 500, 502, 503, 504, 408, 425, 429. Use exponential backoff.
  • POSTs without an Idempotency-Key header: do not retry blindly; inspect the error first.
  • The official SDKs do not retry by default — wrap calls in your own retry policy that fits your latency budget.