Skip to main content

Rate Limits

API requests are rate-limited per tenant based on your plan tier. Rate limits protect the platform and ensure fair usage across all tenants.

Per-tier limits

TierRequests/minRequests/hourMonthly profiles
Basic301,000500
Professional1005,0005,000
Enterprise50020,000Unlimited

Event processing endpoints (/events/*) have separate, higher limits to accommodate real-time transaction feeds:

TierEvents/minEvents/hour
Basic1005,000
Professional50025,000
Enterprise2,000100,000

Rate limit headers

Every API response includes rate limit headers:

HeaderDescriptionExample
X-RateLimit-LimitMaximum requests per minute for your tier100
X-RateLimit-RemainingRequests remaining in the current window97
X-RateLimit-ResetUnix timestamp when the current window resets1712505600

Example response headers:

HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 97
X-RateLimit-Reset: 1712505600

Handling 429 responses

When you exceed your rate limit, the API returns a 429 Too Many Requests response:

{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Please retry after the reset time.",
"status": 429
}

The response includes a Retry-After header with the number of seconds to wait.

Exponential backoff

Implement exponential backoff for rate-limited requests:

async function fetchWithRetry(url, options, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const response = await fetch(url, options);

if (response.status === 429) {
const retryAfter = parseInt(response.headers.get("Retry-After") || "1");
const delay = retryAfter * 1000 * Math.pow(2, attempt);
await new Promise((resolve) => setTimeout(resolve, delay));
continue;
}

return response;
}

throw new Error("Max retries exceeded");
}

Best practices

  • Monitor remaining requests — Check X-RateLimit-Remaining to proactively slow down before hitting the limit
  • Batch events where possible — Use the CBA webhook integration to receive events in batches rather than sending individual event API calls
  • Cache responses — Cache GET responses (profile details, rules, configuration) to avoid unnecessary API calls
  • Use webhooks — Instead of polling for signal updates, use webhooks to receive results asynchronously
  • Contact us for higher limits — If you need higher rate limits, contact your account manager or reach out to support@korastratum.com