Rate Limits
The API rate-limits each request to keep the service fast and fair. Exceeding a limit returns 429 Too Many Requests.
Per-token limits#
Limits are tracked per API token — separate from the per-IP limits applied to unauthenticated traffic. Each token gets its own bucket, so one integration's usage never starves another's.
Limits by endpoint#
| Endpoint | Limit |
|---|---|
POST /companies/search | 60 / minute |
POST /companies/counts | 60 / minute |
GET /companies/{id} | 120 / minute |
GET /companies/{id}/job-postings | 120 / minute |
GET /credits | 60 / minute |
POST /exports/preview | 60 / minute |
POST /exports | 5 / minute |
GET /exports/{id} | 120 / minute |
POST /exports/{id}/download | 30 / minute |
Response headers#
Successful responses carry your current standing, so you can pace yourself instead of discovering the limit by hitting it. So do 429s. Other errors do not.
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Requests allowed in the current window. |
X-RateLimit-Remaining | Requests left in it. Reaches 0 on the last allowed request; the next one is a 429. |
X-RateLimit-Reset | Unix timestamp, in whole seconds, when the window resets and the allowance returns. |
Retry-After | Seconds to wait. Sent on 429 responses only. |
Limits are counted per bucket, and your bucket is your API token — so these numbers describe that token's usage, not your workspace's total.
429 responses#
When you hit a limit, the response carries a Retry-After header (seconds to wait). Always honor it rather than retrying immediately.
Best practices#
Use jittered exponential backoff on 429 (and on 5xx):
async function withBackoff(fn, max = 5) {
for (let attempt = 0; ; attempt++) {
const res = await fn();
if (res.status !== 429) return res;
if (attempt >= max) return res;
const retryAfter = Number(res.headers.get("Retry-After")) || 2 ** attempt;
const jitter = Math.random() * 0.3 * retryAfter;
await new Promise((r) => setTimeout(r, (retryAfter + jitter) * 1000));
}
}The Rate Limits & Backoff guide goes deeper, with samples in all languages.