Error Catalog

Every API endpoint shares the same error codes. Look up the HTTP status or error.code to find the likely cause, whether it's retryable, and what to do.

View as Markdown

Every error response looks like { ok: false, requestId, correlationId, error: { code, message, nextAction } }. Branch your code on error.code (a stable string) — message/nextAction are human-readable and their wording may change. Full envelope shape: API Fundamentals.

Validation & request shape

HTTPcodeCommon causeRetryable?
400VALIDATION_ERRORMissing field, wrong type, or out of allowed range (e.g. a non-integer amount)Fix the field and resend — retrying as-is won't help
400IDEMPOTENCY_KEY_REQUIREDA financial mutation (payment/refund/checkout) was sent without an Idempotency-Key headerAdd the header and resend

Auth & permissions

HTTPcodeCommon causeRetryable?
401UNAUTHENTICATEDMissing Authorization: Bearer, or the key doesn't exist / was revokedUse a valid key and resend; retrying as-is won't help
401TOKEN_EXPIREDThe access token of a signed-in API has expired (15 minutes)Call the matching */Refresh with the refresh token, then resend
401INVALID_TOKENThe access token is malformed or its signature is wrongSign in again for a new token
401INVALID_REFRESH_TOKENThe refresh token was already used, signed out or expiredSign in again; refresh tokens rotate and an old one never works again
403WRONG_TOKEN_TYPEA token of the wrong kind (e.g. a merchant token on Admin*)Use the sign-in that matches the API
404ROUTE_NOT_FOUNDThe path doesn't exist (e.g. still using an old /v1/... path)Check GET /api/OpenApi and use the correct path
403SCOPE_DENIEDThe key lacks the scope this operation needsCreate a key with the right scope
403SCOPE_DISABLEDThe requested scope (e.g. payouts:*) isn't publicly available yetNot retryable — this capability isn't live, see Sandbox vs Production
403WORKSPACE_ACCESS_DENIEDThe key can only access the workspace it was created in, but the request named a different oneCheck x-workspace-id or use the right key; not retryable
403ENVIRONMENT_DENIEDThe request specified an environment other than sandbox (Production isn't available yet)Use sandbox; not retryable

Resource state

HTTPcodeCommon causeRetryable?
404NOT_FOUNDWrong ID, the resource belongs to another workspace, or it was deletedVerify the ID and resend; retrying as-is won't help
409CONFLICTConflicts with existing data (e.g. a duplicate unique value)Adjust the field and resend

Rate limiting

HTTPcodeCommon causeRetryable?
429RATE_LIMITEDThis key exceeded its request quota (default 120 per 60 seconds)Retryable — wait the number of seconds in Retry-After, see API Fundamentals

Server errors

HTTPcodeCommon causeRetryable?
500INTERNAL_ERRORAn unexpected server errorRetry once or twice with backoff; if it persists, contact support with the requestId
Payment "non-error" states (like a pending-reconcile unknown payment, or the PAYMENT_UNKNOWN_NEEDS_RECONCILE code returned in a refund preview) aren't HTTP errors — they're business fields inside a 200 response. See Refunds & Idempotency; they're not in this table.
When to contact support: if the same requestId keeps returning 500 INTERNAL_ERROR after a retry, or you get an error.code not listed here, include the requestId/correlationId when you reach out — it makes triage much faster.