Rate Limits
Tier rate limits, 429 handling, and retry strategies.
Rate Limits by Tier
Each pricing tier has a per-minute rate limit and a monthly request quota:
| Tier | Rate Limit | Monthly Quota | Overage | |------|-----------|---------------|---------| | Free | 10 req/min | 50 req/month | Blocked (no overage) | | Starter | 60 req/min | 1,000 req/month | $0.03/request | | Growth | 300 req/min | 25,000 req/month | $0.01/request | | Enterprise | Custom | Unlimited | Custom |
Rate Limit Headers
Every API response includes rate limit headers:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 42
X-RateLimit-Reset: 1711893600
X-RateLimit-Limit-- Maximum requests per minuteX-RateLimit-Remaining-- Requests remaining in the current minute windowX-RateLimit-Reset-- Unix timestamp when the current window resets
Handling 429 Responses
When you exceed the rate limit, the API responds with 429 Too Many Requests:
{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Retry after 45 seconds."
}
}
The response includes a Retry-After header with the number of seconds to wait.
Monthly Quota
Your monthly quota resets on the first day of each billing period. You can track your quota usage in the dashboard or via the usage API:
curl "https://api.aribatax.com/v1/usage" \
-H "X-API-Key: your_api_key_here"
On the Free tier, requests beyond the monthly quota are blocked with 429. On paid tiers, overage requests are allowed but billed at the per-request overage rate for your tier.
Retry Strategy
For 429 responses, use the Retry-After header:
async function fetchWithRateLimit(url: string, apiKey: string): Promise<Response> {
const res = await fetch(url, {
headers: { "X-API-Key": apiKey },
});
if (res.status === 429) {
const retryAfter = parseInt(res.headers.get("Retry-After") ?? "60", 10);
await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000));
return fetchWithRateLimit(url, apiKey); // Retry once
}
return res;
}
Usage Alerts
Configure usage alerts in the dashboard to get notified when your quota reaches 80%, 100%, or any custom threshold. Alerts can be sent via email or webhook.
Tips
- Batch requests where possible instead of making many individual lookups
- Cache responses for data that does not change frequently (parcel geometry, county lists)
- Use webhooks for usage alerts instead of polling the usage endpoint
- Contact us for custom rate limits if your use case needs more than 300 req/min