Rate Limiting

The Pixee PIM API enforces per-endpoint rate limits to ensure fair usage and platform stability. Limits are tracked in Redis, organized into 26 tiers, and persist across API instances.

Rate limit tiers

Endpoints are grouped into tiers by category, each with its own limit and sliding window. Limits below were raised significantly in v6.19 to accommodate large catalogs (100k+ products) — most read/write tiers increased 5–10×; AI batch got stricter (cost control).

Auth

TierLimitEndpoints
AUTH_LOGIN5 / 15 minPOST /auth/login, POST /auth/login/json
AUTH_PASSWORD_RESET3 / 15 minPOST /auth/forgot-password
AUTH_REGISTER3 / 15 minPOST /auth/register
AUTH_REFRESH30 / minPOST /auth/refresh
AUTH_LOGOUT30 / minPOST /auth/logout

Read

TierLimitEndpoints
READ_PUBLIC1 000 / minHealth checks, public routes
READ_STANDARD1 000 / minStandard GET endpoints (products, imports, etc.)
READ_ADMIN1 000 / minAdmin panel reads
READ_SENSITIVE50 / minUser data, audit logs, analytics/reports

Write

TierLimitEndpoints
WRITE_STANDARD100 / minStandard POST / PUT / PATCH / DELETE
WRITE_CONFIG100 / minConfiguration changes
WRITE_UPLOAD100 / minFile upload endpoints
WRITE_USER_MGMT100 / minUser / role management

Bulk

TierLimitEndpoints
BULK_IMPORT500 / minImport batch jobs
BULK_EXPORT500 / minExport batch jobs
BULK_CREATE500 / minBulk entity creation
BULK_UPDATE500 / minBulk attribute updates
BULK_DELETE500 / minBulk deletes

AI

TierLimitEndpoints
AI_SINGLE10 / minIndividual AI enrichment
AI_BATCH1 / hourBatch AI job creation/start (cost control)

Export & data access

TierLimitEndpoints
EXPORT_STANDARD50 / minStandard export jobs
EXPORT_STREAM50 / minStreaming exports
EXPORT_DOWNLOAD50 / minFile downloads
EXPORT_SCHEDULE50 / minScheduled exports

Public & health

TierLimitEndpoints
HEALTH_CHECK1 000 / minHealth / status endpoints
PROGRESS_POLL1 000 / minJob progress polling

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: 1758100460

Handling rate limit errors

When you exceed the limit, the API returns 429 Too Many Requests. This response uses a distinct shape from the standard error envelope described in Errors — it comes from a separate rate-limiting layer that has not been unified onto it:

429 Response

{
  "error": "rate_limit_exceeded",
  "message": "Too many requests. Please try again later.",
  "detail": "5 per 15 minute",
  "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?