Rate Limits
Rate limiting ensures fair usage and API stability for all users.
Limits by Tier
| Tier | Requests/Minute | Requests/Day |
|---|---|---|
| Free/Basic | 100 | 10,000 |
| Standard | 500 | 50,000 |
| Premium | 1,000 | 100,000 |
Rate Limit Headers
Every API response includes headers indicating your current rate limit status:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests per minute |
X-RateLimit-Remaining | Remaining requests in current window |
X-RateLimit-Reset | Unix timestamp when the limit resets |
Example:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 999
X-RateLimit-Reset: 1709568060
Handling 429 Responses
When rate limited, the API returns HTTP 429 Too Many Requests:
{
"detail": "Rate limit exceeded. Retry after 60 seconds."
}
Recommended Retry Strategy
import time
import requests
def fetch_with_retry(url, headers, max_retries=3):
for attempt in range(max_retries):
response = requests.get(url, headers=headers)
if response.status_code == 429:
retry_after = int(response.headers.get("Retry-After", 60))
print(f"Rate limited. Waiting {retry_after}s...")
time.sleep(retry_after)
continue
return response
raise Exception("Max retries exceeded")
Best Practices
- Implement exponential backoff - Don't hammer the API when rate limited
- Cache responses - Cache frequently accessed data to reduce API calls
- Use webhooks - For high-volume scenarios, consider webhook subscriptions
- Monitor headers - Track
X-RateLimit-Remainingto stay within limits
Ingestion Limits
The ingestion endpoints (/v1/ingest/*) have separate limits:
- 100 requests/minute per API key
- 1000 products per batch
This is to ensure scraping pipelines don't impact search performance.