Register and manage APIs
Manage your APIs
Kinde rate limits incoming traffic to maximise API stability and prevent bursts of requests from destabilizing API functions.
If you send too many requests in quick succession, you’ll see error responses with status 429.
For advice on handling these errors, read the sections below. If you suddenly see a rising number of rate-limited requests, contact Kinde support.
Kinde applies two types of limiters: a rate limiter and a concurrency limiter.
The rate limiter caps both request frequency and payload size. Key constraints:
page_size parameter. Use page_size and next_token to paginate through additional results (e.g. GET /api/v1/subscribers).POST/PATCH endpoints (e.g. PATCH /api/v1/organizations/{org_code}/users).If your integration requires a higher limit for an extended period, contact Kinde support.
The concurrency limiter caps the number of requests that can be in-flight at the same time. When this limit is reached, new incoming requests are shed and return a 429 response.
Resource-intensive requests — such as large list queries or requests that include expansions — consume more server resources and take longer to complete, which reduces available concurrency slots for other requests.
Rate limiting most commonly occurs in these scenarios:
When a request is rate limited, the API returns a 429 status code. The response includes a RateLimit-Reset header with the number of seconds until the rate limit resets:
HTTP/1.1 429 Too Many RequestsRateLimit-Reset: 30Exponential backoff with jitter is the recommended retry approach. Wait progressively longer between retries and add randomness to avoid a thundering herd effect where many clients retry simultaneously:
async function fetchWithBackoff(url, options, maxRetries = 5) { for (let attempt = 0; attempt <= maxRetries; attempt++) { const response = await fetch(url, options);
if (response.status !== 429) return response; if (attempt === maxRetries) throw new Error('Max retries reached');
const resetAfter = parseInt(response.headers.get('RateLimit-Reset') || '1', 10); const jitter = Math.random() * 1000; const delay = Math.max(resetAfter * 1000, Math.pow(2, attempt) * 1000) + jitter;
await new Promise((resolve) => setTimeout(resolve, delay)); }}Token bucket (global throttle): An alternative is to manage traffic at a global level using a token bucket algorithm on the client-side. This lets you cap your own outbound request rate before hitting the API. Mature token bucket implementations are available in most programming languages.