DocsGuides
Rate limits
Per-key request limits, 429 responses, and how to back off.
Each API key has its own rate limit measured in requests per minute. The default is 120 requests per minute; your key's limit is set when it is created and shown in the vendor dashboard.
Exceeding the limit
When a key exceeds its limit, requests return 429 with the rate_limited error code:
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded. Retry after 12s.",
"request_id": "req_8Kd2p1"
}
}
When present, the Retry-After response header tells you how many seconds to wait before retrying.
Retry-After: 12
Staying under the limit
- Back off on
429. Wait forRetry-After(or use exponential backoff if it is absent), then retry. - Use
updated_sincefor polling so you fetch only what changed. See pagination. - Batch with larger pages. Request
limit=100to move more data per call. - Spread scheduled jobs rather than firing every request at the top of the minute.
- Split traffic across keys by workload, for example a separate key for a nightly reporting job, so bursty background work does not starve real-time booking calls.
Backoff example
async function withBackoff(makeRequest, max = 5) {
for (let attempt = 0; attempt < max; attempt++) {
const res = await makeRequest();
if (res.status !== 429) return res;
const retryAfter = Number(res.headers.get("Retry-After")) || 2 ** attempt;
await new Promise((r) => setTimeout(r, retryAfter * 1000));
}
throw new Error("rate limited: exhausted retries");
}
Combine backoff with idempotency keys on writes so retries after a 429 never create duplicate reservations or orders.