Skip to content

Errors

{
"error": {
"type": "invalid_request_error",
"code": "amount_below_minimum",
"message": "The amount is below the minimum of 100.",
"param": "amount"
},
"requestId": "req_Z3k9QmP2xR7tLw4NbV8cYh1s"
}
FieldDescription
typeError group (next table)
codeStable code to branch on in your code
messageHuman-readable text. It may change; never branch on it
paramThe offending field or header, when there is one
requestIdSame as the X-Request-Id header. Quote it when you contact support

A 500 internal_error never contains internal details. Send the requestId to the team.

For nested fields, param is a path such as payer.accountNumber.

A successful response can carry a warnings array next to data. A warning never changes the result of the request; log it and act on it if you want. It has the same code, message and param fields as an error, without type. warnings is only present when there is at least one.

{
"data": { "object": "payin", "id": "pin_...", "...": "..." },
"warnings": [
{
"code": "payer_name_differs",
"message": "An existing payer with this bank account was used. Its stored account name differs from the one sent and was kept; it is used for payment matching.",
"param": "payer.accountName"
}
],
"requestId": "req_..."
}
codeReturned byMeaning
payer_name_differsPOST /v1/payins, POST /v1/payouts with an inline payerAn existing payer with the same bank and account number was used, and its stored name (param: payer.accountName) or English name (payer.accountNameEn) differs from the one you sent. The stored name was kept because it is used to match transfers; change it with PATCH /v1/payers/{id} if needed
typeHTTPMeaning
invalid_request_error400, 404, 409, 422The request is invalid, or conflicts with a state or a business rule
authentication_error401Authentication or signing failed
permission_error403Authenticated, but not allowed to do this
rate_limit_error429Quota exceeded
api_error500Error on the platform side
CaseWhat to do
500, timeouts, connection errorsRetry with backoff (e.g. 1, 2, 4, 8 seconds), signing each attempt again
429 quota_exceededPause before retrying, or contact the team
422 not_available_now, maintenance, no_collection_account_available, no_payout_account_available, slip_verification_unavailableTry again later
400, 401, 403, 404, 409 and other 422Do not repeat the same request. Fix the request or the state first

If POST /v1/payins, POST /v1/payouts or POST /v1/withdrawals times out, you do not know whether it was created. Send an Idempotency-Key header with every create so you can simply send it again:

Idempotency-Key: 6f1c2e8a-3b7d-4c0e-9a51-2d8f4b7e1c30
  • Use a new unique key (for example a UUID) for each payment, and the same key when you retry that payment. Keys are 8-255 characters of A-Z a-z 0-9 _ - : ..
  • A retry with the same key and the same request within 24 hours returns the original response with the header Idempotent-Replayed: true; nothing is created again.
  • The same key with a different request (another body or query string) returns 422 idempotency_key_reused.
  • While the first request is still running, a retry returns 409 idempotency_request_in_progress. Wait a moment and retry.
  • If the first request failed with an error, the key is released and the retry runs as a new request.

The header is optional. Without it, search by reference before sending again, e.g. GET /v1/payouts?reference=withdraw-20001, and use a unique reference for every payment.

codeMeaning
invalid_requestThe request is invalid, e.g. unreadable JSON
parameter_invalidA parameter has an invalid value; see param
parameter_missingA required parameter is missing; see param
parameter_unknownUnknown parameter (in the body, the query or a multipart part)
parameters_exclusiveTwo parameters that exclude each other were both sent, e.g. payerId and payer; param names the second one
invalid_cursorInvalid cursor
date_range_too_largeThe date range exceeds 31 days
invalid_webhook_urlwebhookUrl is invalid or missing
invalid_return_urlreturnUrl is invalid
unsupported_currencyCurrency not supported
unsupported_methodPayment method not supported
file_invalidNo file, or not a JPG/PNG of at most 5 MB
codeMeaning
authentication_requiredA required header is missing; param names it
invalid_api_keyInvalid API key, or a test key while the account is not in test mode
invalid_timestampX-Timestamp is not in seconds or is more than 300 seconds off
invalid_nonceX-Nonce must be 16-128 characters of A-Z a-z 0-9 _ -
nonce_reusedThis nonce was already used
invalid_signatureWrong signature; see Common signing mistakes
codeMeaning
partner_inactiveThe partner account is not active
ip_not_allowedThis IP address is not on the allow-list
payins_disabledPay-ins are disabled for this account
payouts_disabledPayouts are disabled for this account
codeMeaning
resource_not_foundNot found, not yours, or a malformed id
route_not_foundUnknown endpoint; check the method and path
payer_not_foundThe payerId in the body was not found
codeMeaning
pending_payin_existsThe payer already has an open pay-in
pending_payout_existsThe payer already has an open payout
pending_withdrawal_existsA withdrawal is already being processed
payin_not_cancelableThe pay-in cannot be canceled in its status
payout_not_cancelableThe payout cannot be canceled in its status
payin_not_pendingThe pay-in is no longer waiting for payment
payer_has_paymentsThe payer has payments and cannot be deleted
slip_duplicateThe slip was already used
idempotency_request_in_progressA request with this Idempotency-Key is still running; retry shortly
conflictThe request conflicts with the current state of the resource
codeMeaning
amount_invalidInvalid amount
amount_below_minimumBelow the minimum; the message states it
amount_above_maximumAbove the maximum; the message states it
amount_below_feeLower than the total fee
insufficient_balanceNot enough available balance
daily_limit_exceededThe daily withdrawal limit would be exceeded
no_collection_account_availableNo collection account is available
no_payout_account_availableNo payout account is available
not_available_nowOutside service hours
maintenanceUnder maintenance
payer_inactiveThe payer is inactive
payer_blockedThe payer is blocked
bank_not_foundUnknown bankCode
referral_code_not_foundUnknown referral code
referrer_inactiveThe referrer is inactive
slip_unreadableThe slip’s QR code could not be read
slip_verification_failedThe slip could not be verified
slip_amount_mismatchThe slip amount does not match the pay-in
slip_receiver_mismatchThe slip receiver does not match the pay-in
slip_verification_unavailableSlip verification is temporarily unavailable
request_unprocessableThe request could not be processed; send the requestId to the team
idempotency_key_reusedThe Idempotency-Key was already used with a different request
HTTPcodeMeaning
429quota_exceededUsage quota exceeded
500internal_errorInternal error; send the requestId to the team