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.
| Endpoint | Limit |
|---|---|
POST /v1/payouts | 300/min |
POST /v1/wallet/token/withdrawals | 30/min |
POST /v1/wallet/fiat/withdrawals | 30/min |
POST /v1/payouts/beneficiaries | 20/min |
POST /v1/wallet/bank-accounts/{bankAccountId}/address | 20/min |
POST /v1/wallet/deposits/check-missed | 30/min |
POST /v1/wallet/deposits/{id}/redrive | 60/min |
POST /v1/payouts/beneficiaries/{beneficiaryId}/address | 20/min |
Wallet whitelist changes — POST, PATCH and DELETE on /v1/wallet/bank-accounts/{bankAccountId}/address/whitelist | 60/min, shared between the three |
Payout whitelist changes — POST, PATCH and DELETE on /v1/payouts/beneficiaries/{beneficiaryId}/address/whitelist | 60/min, shared between the three |
POST /v1/payouts/deposits/check-missed | 30/min |
POST /v1/payouts/deposits/{id}/redrive | 60/min |
POST /v1/checkout | 120/min |
Per-route read limits
| Endpoint | Limit |
|---|---|
GET /v1/payouts/{id} and GET /v1/payouts/active-banks | 600/min, shared between the two |
GET /v1/payout/prefund/balance | 60/min |
Account ceiling
Applied across every endpoint, per account.
| Environment | Rate Limit |
|---|---|
| Sandbox | 100 requests/minute |
| Production | 1000 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
- Implement exponential backoff — When you receive a 429, wait before retrying
- Cache responses — Reduce API calls by caching data where appropriate
- Don't poll for payout status — Register a
PAYOUTwebhook and act onpayout.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.