Rate limits
Rate limits keep HighQube fast for everyone. By default:
| Limit | Default |
|---|---|
| Each key | 120 requests a minute |
| All of your organization's keys together | 600 requests a minute |
| Short bursts | Up to 2× the limit, after a quiet spell |
Your organization may have different limits. HighQube can raise them for a busy integration, so ask if you need more.
Know where you stand
Every response to a request made with a key includes these headers:
| Header | Meaning |
|---|---|
X-RateLimit-Limit | The key's requests per minute |
X-RateLimit-Remaining | Requests it can make right now |
X-RateLimit-Reset | Seconds until it's back to its full allowance |
Slow down when X-RateLimit-Remaining gets low, and you'll never be refused.
When you go over
The answer is 429 with code rate_limited and a Retry-After header. Wait that many seconds and send the same request again. Nothing is lost: the request is only delayed.
import time
import requests
def send(session: requests.Session, method: str, url: str, **kwargs) -> requests.Response:
"""Send a request, waiting and retrying when it is rate limited."""
for _ in range(5):
response = session.request(method, url, timeout=30, **kwargs)
if response.status_code != 429:
return response
time.sleep(int(response.headers.get("Retry-After", "1")))
return response
async function send(url, options = {}) {
for (let attempt = 0; attempt < 5; attempt++) {
const response = await fetch(url, options);
if (response.status !== 429) return response;
const seconds = Number(response.headers.get("Retry-After") ?? 1);
await new Promise((resolve) => setTimeout(resolve, seconds * 1000));
}
return fetch(url, options);
}
Tips
- Search lanes together. One rate search can take several routes, which uses one request instead of many.
- Cache reference data. Port codes and airport codes rarely change.
- Spread out scheduled jobs. A nightly sync that sends everything at once will hit the limit. Pace it below the per-minute rate.

