UPP Docs

Errors and limits

Error format, error codes, rate limits and pagination.

Error format

Every error response is JSON. message is English text you can show to users; code is stable. Branch on code, never on message.

{ "message": "Insufficient balance.", "code": "insufficient_balance" }

Validation errors add errors, keyed by field:

{
  "message": "The order no field is required.",
  "code": "validation_failed",
  "errors": { "order_no": ["The order no field is required."] }
}

Error codes

HTTPcodeMeaning
401unauthenticatedAPI key or signature authentication failed, including invalid timestamps and replayed requests
403forbiddenFeature disabled or not allowed
404not_foundResource does not exist or belongs to another merchant
422validation_failedParameters failed validation; see errors
422insufficient_balanceMerchant balance too low (card balance for card withdrawals)
422duplicate_order_noorder_no already used
422card_status_conflictCard status does not allow the operation
422operation_not_supportedCard product or provider does not support the operation
422limit_reachedUsage limit reached (cards, virtual accounts); see Settings → Limits
422card_rejected, compliance_rejected, exchange_rejected, file_rejected, funding_rejected, ledger_rejected, merchant_rejected, provider_rejected, reference_rejectedOther business rules
429too_many_requestsRate limited; retry after Retry-After seconds
500server_errorInternal error, already alerted; retry later
503provider_unavailableUpstream provider temporarily unavailable; retry later
503service_unavailableMaintenance

New codes may be added. Treat an unknown code by its HTTP status.

Rate limits

  • 300 requests per minute per merchant, across all of its API keys.
  • X-RateLimit-Limit and X-RateLimit-Remaining report the limit and what is left this minute.
  • Over the limit, requests return 429 too_many_requests with Retry-After.
  • More than 10 requests with failed authentication from one IP within a minute block that IP with 429 until Retry-After passes.

Idempotency

Endpoints that move money take an order_no that is unique per merchant. Retrying with the same order_no returns 422 duplicate_order_no instead of creating a second order, so it is safe to retry after a timeout and then look the order up.

Pagination

List endpoints use cursor pagination.

ParameterDescription
limit1–100, default 20
cursornext_cursor from the previous page
{ "data": [], "next_cursor": "eyJpZCI6MTIzfQ" }

next_cursor is null on the last page.

On this page