Errors, Pagination & Rate Limits
Error format
Errors come back with a non-2xx HTTP status and a JSON body containing a message:
{ "message": "Access denied: User is not authorized to access this endpoint" }
| Status | Meaning | What to do |
|---|---|---|
400 | Invalid parameters, e.g. an order size below the pair minimum or an unknown symbol | Fix the request. Don't retry it unchanged. |
401 / 403 | Missing or invalid signature, expired api-expires, IP not whitelisted, missing permission, or a user key calling an admin endpoint | Check signing and key permissions. |
404 | Wrong path, often a missing /v2 or the wrong API domain | Check the base URL. |
429 | Rate limited | Back off and retry. See below. |
5xx | Server-side problem | Retry with exponential backoff. Make writes idempotent before retrying them. |
With hollaex-node-lib, a failed call rejects with an error whose message contains the status and the body, e.g. 403 - {"message":"..."}.
Pagination
List endpoints (orders, trades, deposits, withdrawals, users and so on) are paginated and return a total count alongside data:
{ "count": 132, "data": [ ... ] }
| Parameter | Default | Notes |
|---|---|---|
limit | 50 | Maximum 50 on most endpoints |
page | 1 | 1-based |
order_by | Field to sort by, e.g. id or created_at | |
order | asc or desc | |
start_date / end_date | ISO 8601 timestamps |
Example of fetching everything:
async function fetchAll(fn, opts = {}) {
const all = [];
for (let page = 1; ; page++) {
const { count, data } = await fn({ ...opts, limit: 50, page });
all.push(...data);
if (data.length === 0 || all.length >= count) return all;
}
}
const deposits = await fetchAll((o) => client.getExchangeDeposits(o), { currency: 'usdt' });
Admin list endpoints also accept format: 'csv' to download a CSV export.
Rate limits
When you're rate limited, the API responds with HTTP 429. Default limits per IP:
| Scope | Limit |
|---|---|
| General API | 4 requests/second, burst of 10 |
| Charts | 4 requests/second, burst of 15 |
| Order books | 4 requests/second, burst of 3 |
How to stay within them:
- Use the WebSocket for order books, trades, orders and balances instead of polling.
- Cache static data such as
/v2/constantsand/v2/kit, and refresh it only every few minutes. - On a
429, wait and retry with exponential backoff plus jitter. Don't retry straight away in a tight loop. - Use
/v2/orderbooksand/v2/tickersto get every pair in one call instead of one call per pair.
If your integration genuinely needs higher limits, contact HollaEx support.