Rate limits

Understand API rate limits and pagination.

Overview

The Katura API enforces rate limits to ensure fair usage and platform stability.

Current rate limits

Endpoint typeRate limit
Admin API (read)120 requests/minute
Admin API (write)60 requests/minute
Storefront API300 requests/minute
Webhooks (outgoing)No limit (sent asynchronously)

Rate limit headers

Every API response includes rate limit headers:

  • X-RateLimit-Limit β€” maximum requests per window
  • X-RateLimit-Remaining β€” requests remaining in window
  • X-RateLimit-Reset β€” timestamp when window resets

Pagination

List endpoints use cursor-based pagination:

  • page β€” page number (default: 1)
  • limit β€” items per page (default: 20, max: 100)
  • Response includes total, page, and totalPages

Handling 429 responses

When you hit the limit, the API returns 429 with a Retry-After header (seconds). Honor it. The reference client below uses exponential backoff with full jitter β€” a sane default for any production integration:

async function katuraFetch(url, init = {}, attempt = 0) {
  const res = await fetch(url, init);
  if (res.status !== 429 || attempt >= 5) return res;

  const retryAfter = Number(res.headers.get("Retry-After")) || (2 ** attempt);
  const jitter = Math.random() * retryAfter;
  await new Promise(r => setTimeout(r, (retryAfter + jitter) * 1000));
  return katuraFetch(url, init, attempt + 1);
}

Bursts & bulk imports

For one-time backfills (e.g., importing 10k products), use POST /api/admin/products/importinstead of looping single creates β€” bulk endpoints don't count individual items against the per-minute limit. For sustained higher throughput, contact support to lift the cap on a specific API key.

Was this article helpful?

API Rate Limits β€” Usage Limits & Pagination | K99