request_id for correlation.
Response format
- type — broad category for programmatic handling
- code — short, stable identifier (useful for analytics/alerting)
- message — concise text, safe to show to logs/ops dashboards
- request_id — include in support requests
- status — HTTP status mirrored in the body
- details — optional object with extra context (e.g., invalid fields)
Common categories
- validation_error (400) — malformed or out-of-range parameters
- authentication_error (401) — missing/invalid api-key
- authorization_error (403) — action not permitted for this key/profile
- not_found (404) — resource does not exist (e.g., pay_…, cus_…)
- conflict (409) — conflicting state (e.g., duplicate operation)
- unprocessable_entity (422) — semantically invalid request
- rate_limit (429) — too many requests, see Rate Limits
- internal_error (500) — unexpected server error; safe to retry with backoff
- connector_error (502/503/504) — upstream PSP/network issue; retry with backoff
Examples
400 — validation_error
401 — authentication_error
403 — authorization_error
404 — not_found
409 — conflict
422 — unprocessable_entity
429 — rate_limit
5xx — internal/connector
Client-side handling (Node example)
Best practices
- Always log request_id. Include it in support requests
- Don’t parse by message text. Use type/code for logic and metrics
- Implement retries with exponential backoff + jitter on 5xx/connector errors and safe 409/422 cases where applicable
- Use idempotency on mutating requests to avoid duplicates during retries
- Handle 429 by respecting Retry-After. See Rate Limits
- Surface actionable context to operators (status, code, type, request_id); keep PII out of logs
Need help?
If you cannot resolve an error, contact Support and include:- request_id
- endpoint and HTTP method
- approximate timestamp (UTC)
- high-level description of what you attempted