Rate Limits
The KynectLocal API enforces rate limits to ensure availability across all integrations. Exceeding a limit returns a 429 Too Many Requests response.
When you’d use this
Section titled “When you’d use this”- Designing a polling or bulk-fetch strategy for your integration
- Debugging
429responses in production - Understanding how much headroom your API key has
Current limits
Section titled “Current limits”General limit
Section titled “General limit”All API requests are subject to a global rate limit:
| Limit | Window |
|---|---|
| 100 requests | 60 seconds |
This limit applies across all endpoints, regardless of which resource you are querying.
API key limits
Section titled “API key limits”Per-key limits are enforced at three levels simultaneously:
| Limit | Window |
|---|---|
| 10 requests | 1 second |
| 300 requests | 1 minute |
| 50,000 requests | 1 day |
All three windows are checked on every request. A request is rejected if it would exceed any of the three.
Rate limit response headers
Section titled “Rate limit response headers”Every API response includes headers that tell you your current usage against the active limits:
| Header | Description |
|---|---|
X-RateLimit-Limit | The total number of requests allowed in the current window |
X-RateLimit-Remaining | The number of requests remaining in the current window |
X-RateLimit-Reset | Unix timestamp (seconds) when the current window resets |
Read these headers proactively — don’t wait for a 429 to know you’re close to the limit.
Handling 429 responses
Section titled “Handling 429 responses”When you exceed the rate limit, the API returns:
HTTP/1.1 429 Too Many RequestsRetry-After: 14X-RateLimit-Limit: 100X-RateLimit-Remaining: 0X-RateLimit-Reset: 1714000000The Retry-After header tells you how many seconds to wait before retrying. Always respect this value rather than retrying immediately.
A basic retry pattern in Node.js:
async function fetchWithRetry(url, options, retries = 3) { const res = await fetch(url, options);
if (res.status === 429 && retries > 0) { const retryAfter = parseInt(res.headers.get('Retry-After') || '5', 10); await new Promise(resolve => setTimeout(resolve, retryAfter * 1000)); return fetchWithRetry(url, options, retries - 1); }
return res;}Related
Section titled “Related”- Authentication — API key setup
- Errors — full error envelope and other error codes
- Code Samples — working examples that include
Retry-Afterhandling