Rate Limits
Each account has an overall ceiling (below). Some routes also have their own, lower per-route limits. BLOX counts these limits for each account over a rolling 60-second window. The first limit that you reach causes a 429 response. The per-route limits are all in the account ceiling, so one route cannot use all of your account ceiling.
Per-route write limits
BLOX counts each limit for each 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 |
Changes to allowed senders (Wallet): POST, PATCH, and DELETE on /v1/wallet/bank-accounts/{bankAccountId}/address/whitelist | 60/min, shared by the three methods |
Changes to allowed senders (Payout): POST, PATCH, and DELETE on /v1/payouts/beneficiaries/{beneficiaryId}/address/whitelist | 60/min, shared by the three methods |
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 by the two endpoints |
GET /v1/payout/prefund/balance | 60/min |
Account ceiling
BLOX applies this limit to all endpoints together, for each account.
| Environment | Rate Limit |
|---|---|
| Sandbox | 100 requests/minute |
| Production | 1000 requests/minute |
The sandbox ceiling is intentionally low. A load test that passes in sandbox at 100/min does not show the capacity that is available in production. Use the production ceiling to plan your load. The per-route limits above are parts of that ceiling.
Exceeded Limits
If you send more requests than a limit permits, BLOX returns 429 in the standard error format of the merchant API:
{
"code": "RATE_LIMITED",
"message": "Too many payout requests. Please try again later.",
"requestId": "…"
}Retry with exponential backoff. Rate-limit metadata headers are not always in the response.
If a write request gets a 429 response, BLOX did not process the request. Retry it with the same Idempotency-Key. This retry is safe. Refer to Idempotency.
Best Practices
- Use exponential backoff: If you get a 429 response, wait before you retry.
- Cache responses: Keep data in a cache where possible, to send fewer API calls.
- Do not send repeated requests for the payout status: Register a
PAYOUTwebhook and use thepayout.updatedwebhook event. Get the payout only to reconcile, or to find the status after you did not receive a webhook event. Top-ups also have webhook events (payout.prefund_completed). Thus, you do not need to send repeated requests to the balance endpoint. Get the balance when a webhook event arrives.