message is a string for most failures, but request validation returns an
array of messages — one per invalid field. Handle both shapes:
Status codes
permanent
The request itself is wrong. On registration this covers an unknown
bankCode and an accountNumber the bank could not confirm; on search it
means neither address nor accountNumber was supplied. On orders it also
covers a recipient or mint that is not a valid address for the chain
you named — on TON, anything that is neither a TON address nor, for mint,
"TON". On payments it covers a TOKEN payment on a chain payments do not
support, such as TON. Retrying identical input will fail identically.permanent
The
x-api-key header is missing or does not match a business. See
Authentication.permanent
Nothing matched. For a search, the bank account has not been registered with
Paj. For rates, no active rate exists for that currency — read this as “not
supported yet”, not as a malformed request.
transient
A failure on Paj’s side or on a rail it depends on. Safe to retry with backoff.
Validation happens before your request is processed
Unknown fields are rejected rather than ignored: sending a body property that is not part of the schema fails the request outright. Send exactly the documented fields.Retrying safely
Registration is idempotent per bank account, so retrying aPOST /pub/v2/bank-account that timed out is safe — you get the existing record
back rather than a duplicate. The two GET endpoints are read-only and always
safe to retry.