Skip to content

Error Codes

All errors follow the same JSON structure:

json
{
  "error": {
    "code": "SESSION_EXPIRED",
    "message": "The payment session has expired",
    "detail": "Session ops_01HZGV expired at 2026-04-24T04:15:00Z",
    "request_id": "req_01HZGV..."
  }
}

Include request_id when contacting support — it traces the request through all gateway logs.

HTTP Status Codes

StatusMeaning
200Success
201Resource created
400Bad request — invalid parameters
401Unauthorised — missing or invalid API key / token
403Forbidden — valid key but insufficient permissions
404Not found
409Conflict — resource already exists (e.g. handle taken)
422Unprocessable — semantically invalid (e.g. amount too low)
429Rate limited
500Gateway internal error
503Gateway or bank core temporarily unavailable

Error Code Reference

Authentication

CodeHTTPCause
INVALID_API_KEY401API key missing, malformed, or revoked
INVALID_BANK_KEY401Bank key invalid or revoked
TOKEN_EXPIRED401Access token has expired — refresh it
TOKEN_REVOKED401Token revoked (consent deleted)
CONSENT_REVOKED401Consent was revoked; re-initiate the flow
PKCE_INVALID400Code verifier does not match challenge
PKCE_METHOD_REJECTED400plain challenge method not accepted

Payments

CodeHTTPCause
SESSION_NOT_FOUND404Unknown session_id
SESSION_EXPIRED422Session TTL elapsed
SESSION_ALREADY_COMPLETED409Cannot modify a completed session
ALIAS_NOT_FOUND404NPT alias does not exist
ALIAS_INACTIVE422Alias exists but is deactivated
BANK_NOT_PARTICIPATING422The destination bank is not connected
AMOUNT_TOO_LOW422Below bank minimum transaction amount
AMOUNT_TOO_HIGH422Exceeds bank maximum transaction amount
INSUFFICIENT_FUNDS422Source account balance too low
OTP_INVALID401OTP entered by customer was wrong
OTP_EXPIRED422OTP TTL elapsed
CBS_TIMEOUT503Bank core did not respond in time
CBS_ERROR502Bank core returned an error

Open Banking

CodeHTTPCause
CONSENT_NOT_FOUND404Unknown consent_id
SCOPE_INSUFFICIENT403Consent does not include required scope
ACCOUNT_NOT_FOUND404Account ID not in consented accounts
SCA_REQUIRED428SCA needed; redirect to sca_url
PAYMENT_ORDER_REJECTED422Bank declined the payment order

Identity Registry

CodeHTTPCause
HANDLE_TAKEN409NPT handle already claimed by another user
HANDLE_INVALID400Handle format does not meet requirements
BANK_NOT_REGISTERED404Bank handle not in the registry

Rate Limits

Default limits (contact your gateway operator for custom limits):

Endpoint classLimit
POST /payments/sessions100 req/min per merchant
GET endpoints300 req/min per key
POST /ob/token30 req/min per client
Identity resolution600 req/min (public, IP-based)

Rate limit headers are included in every response:

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 94
X-RateLimit-Reset: 1714024200