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 by category, each with its own limit and sliding window.

Auth

TierLimitEndpoints
AUTH_LOGIN5 / 15 minPOST /auth/login
AUTH_PASSWORD_RESET3 / hourPOST /auth/forgot-password
AUTH_REFRESH30 / minPOST /auth/refresh

Read

TierLimitEndpoints
READ_PUBLIC2 000 / minHealth checks, public routes
READ_STANDARD1 000 / minGET endpoints (products, imports, etc.)
READ_ADMIN200 / minAdmin endpoints
READ_SENSITIVE50 / minAnalytics, KPIs, reports

Write

TierLimitEndpoints
WRITE_STANDARD100 / minPOST / PUT / PATCH / DELETE
WRITE_CONFIG30 / minConfiguration endpoints
WRITE_UPLOAD30 / minFile upload endpoints
WRITE_USER_MGMT20 / minUser management

Bulk

TierLimitEndpoints
BULK_UPDATE30 / minBulk attribute updates
BULK_EXPORT20 / minExport batch jobs
BULK_CREATE20 / minBulk product creation
BULK_IMPORT10 / minImport batch jobs
BULK_DELETE10 / minBulk deletes

AI

TierLimitEndpoints
AI_SINGLE10 / minIndividual AI enrichment
AI_BATCH5 / minBatch AI enrichment

Export & utilities

TierLimitEndpoints
PROGRESS_POLL600 / minJob progress polling
HEALTH_CHECK600 / minHealth endpoints
EXPORT_DOWNLOAD100 / minFile downloads
EXPORT_STANDARD50 / minStandard export jobs
EXPORT_STREAM10 / minStreaming exports

Rate limit headers

X-RateLimit-* headers are injected only on authenticated endpoints accessed via API key. They are not present on every response.

HeaderDescription
X-RateLimit-LimitMaximum requests allowed in the current window
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix timestamp when the window resets

Example response headers (API key endpoints)

X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 987
X-RateLimit-Reset: 1747220460

Handling rate limit errors

When you exceed the limit, the API returns 429 Too Many Requests:

429 Response

{
  "error": "rate_limit_exceeded",
  "message": "Rate limit exceeded",
  "detail": "5 per 15 minutes",
  "retry_after": "Please wait before making more requests"
}

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")

Was this page helpful?