Rate Limiting
The Pixee PIM API enforces per-endpoint rate limits to ensure fair usage and platform stability. Limits are tracked in Redis and persist across API instances.
Rate limit tiers
Endpoints are grouped into tiers, each with its own limit:
| Tier | Limit | Endpoints |
|---|---|---|
AUTH | 5 / min | Login, password reset |
READ_STANDARD | 100 / min | GET endpoints (products, imports, etc.) |
WRITE_STANDARD | 50 / min | POST / PATCH / DELETE endpoints |
READ_SENSITIVE | 50 / min | Analytics, KPIs, reports |
IMPORT_STANDARD | 20 / min | Import job creation |
EXPORT_STANDARD | 10 / min | Export job creation |
SEARCH | 200 / min | Search and autocomplete queries |
Rate limit headers
Every API response includes headers showing your current limit status:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed in the current window |
X-RateLimit-Remaining | Requests remaining in the current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
Example response headers
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1747220460
Handling rate limit errors
When you exceed the limit, the API returns 429 Too Many Requests:
429 Response
{
"detail": "Rate limit exceeded",
"retry_after_seconds": 60
}
Check the retry_after_seconds field to know how long to wait before retrying.
Retry strategy
We recommend exponential backoff with jitter:
Exponential backoff (Python)
import time
import random
import httpx
def call_with_backoff(url, headers, max_retries=5):
for attempt in range(max_retries):
response = httpx.get(url, headers=headers)
if response.status_code == 429:
wait = (2 ** attempt) + random.uniform(0, 1)
time.sleep(wait)
continue
return response
raise Exception("Max retries exceeded")
For bulk operations (imports, exports, batch updates), schedule jobs during off-peak hours. These endpoints have the strictest limits.