Rate limits and tier quotas.
Rate limits scale with account tier. Audit quota is the binding constraint; result retrieval calls are unlimited within reason. Rate-limit headers are returned on every API response so your code can react gracefully to approaching limits.
// Section 01 · Per-tier limits
Audit quotas by tier.
| Tier | Audits / month | Result retrieval | Use case |
|---|---|---|---|
| Free | 5 | Unlimited | Personal projects, evaluation, single-domain teams |
| Pro | 50 | Unlimited | Solo agencies, in-house SEO leads, multi-project consultants |
| Team | 200 | Unlimited | Marketing agencies, multi-tenant platforms, larger SEO teams |
| Enterprise | Custom | Unlimited | Dedicated infrastructure, SLA, custom integration support |
Audit quotas reset on the first of each month at 00:00 UTC. Unused quota does not roll over. Hitting the quota returns HTTP 429 with error code audit_quota_exceeded; result retrieval calls (GET /audits, GET /audits/{audit_id}) continue working normally.
// Section 02 · Rate-limit headers
Headers returned on every response.
Every API response includes three rate-limit headers. Use these to track approaching limits and back off proactively rather than waiting for 429 responses.
X-RateLimit-Limit: 200
X-RateLimit-Remaining: 147
X-RateLimit-Reset: 1717200000- X-RateLimit-Limit
- Your tier limit. 5 for free, 50 for pro, 200 for team, custom for enterprise.
- X-RateLimit-Remaining
- Audits remaining in the current period. Decrements per audit triggered. Does not decrement for result retrieval calls.
- X-RateLimit-Reset
- Unix timestamp when the limit resets (start of next month). Use this for scheduling automation that waits until quota refreshes.
// Section 03 · Burst limits
Per-second protections on top of monthly quota.
In addition to monthly audit quota, all tiers have a burst limit of 10 audits per minute. This prevents accidental loops or buggy automation from exhausting a month of quota in seconds. Burst limit returns HTTP 429 with error code burst_limit_exceeded and resets after 60 seconds.
Result retrieval calls have a burst limit of 100 requests per minute per workspace. This is generous for normal dashboard usage but will throttle aggressive polling. Use webhooks instead of polling whenever possible.
// Section 04 · Handling 429 responses
Recommended retry pattern.
async function auditWithRetry(domain, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const res = await fetch("https://api.crawlux.com/v1/audits", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CRAWLUX_API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({ domain })
});
if (res.status === 429) {
const resetAt = parseInt(res.headers.get("x-ratelimit-reset"));
const waitMs = Math.min((resetAt * 1000) - Date.now(), 60000);
await sleep(waitMs);
continue;
}
return res.json();
}
throw new Error("max retries exceeded");
}// Section 05 · Increasing limits
When you outgrow your tier.
Upgrading tier instantly increases your quota and resets remaining count to the new tier maximum. Downgrade also takes effect immediately but does not refund the difference for the current period.
Enterprise tier offers custom audit quotas (1,000+ per month is typical), dedicated infrastructure, custom integration support and an SLA. Contact [email protected] for pricing.
// Related docs
Where to go from here.
- Error reference — full error code catalog including 429 codes
- REST API reference — endpoint surface
- Pricing — tier comparison
Run a free audit and download the JSON
The fastest way to evaluate the audit JSON for integration: run a real audit on your own domain and inspect the output. Free first audit per domain.
JSON output live · Webhooks live · API Q4 2026 · 2-week early access window