Skip to content
LogoLogo

Rate Limits

Every account has an overall ceiling (below). Individual routes carry their own, tighter per-route limits, counted per account over a rolling 60-second window. Whichever you hit first returns 429 — the per-route limits all sit inside the account ceiling, so a single route can never consume your whole budget.

Per-route write limits

Each is counted per account over a rolling 60-second window.

EndpointLimit
POST /v1/payouts300/min
POST /v1/wallet/token/withdrawals30/min
POST /v1/wallet/fiat/withdrawals30/min
POST /v1/payouts/beneficiaries20/min
POST /v1/wallet/bank-accounts/{bankAccountId}/address20/min
POST /v1/wallet/deposits/check-missed30/min
POST /v1/wallet/deposits/{id}/redrive60/min
POST /v1/payouts/beneficiaries/{beneficiaryId}/address20/min
Wallet whitelist changes — POST, PATCH and DELETE on /v1/wallet/bank-accounts/{bankAccountId}/address/whitelist60/min, shared between the three
Payout whitelist changes — POST, PATCH and DELETE on /v1/payouts/beneficiaries/{beneficiaryId}/address/whitelist60/min, shared between the three
POST /v1/payouts/deposits/check-missed30/min
POST /v1/payouts/deposits/{id}/redrive60/min
POST /v1/checkout120/min

Per-route read limits

EndpointLimit
GET /v1/payouts/{id} and GET /v1/payouts/active-banks600/min, shared between the two
GET /v1/payout/prefund/balance60/min

Account ceiling

Applied across every endpoint, per account.

EnvironmentRate Limit
Sandbox100 requests/minute
Production1000 requests/minute

Sandbox is deliberately tight. A load test that passes in sandbox at 100/min tells you nothing about production headroom — size against the production ceiling, and treat the per-route numbers above as sub-budgets within it.

Exceeded Limits

Exceeding a limit returns 429 in the standard merchant API error shape:

{
  "code": "RATE_LIMITED",
  "message": "Too many payout requests. Please try again later.",
  "requestId": "…"
}

Retry with exponential backoff. Do not assume rate-limit metadata headers are present on responses.

A 429 on a write means the request never ran, so retrying with the same Idempotency-Key is safe and is what you should do. See Idempotency.

Best Practices

  1. Implement exponential backoff — When you receive a 429, wait before retrying
  2. Cache responses — Reduce API calls by caching data where appropriate
  3. Don't poll for payout status — Register a PAYOUT webhook and act on payout.updated. Read the payout back only to reconcile or to recover a missed delivery. Prefund top-ups have webhooks too (payout.prefund_completed), so the balance endpoint does not need polling either — read it back when an event fires.