Rate limits
Every CHeKT App gets a baseline rate limit that scales with the plan. We use a token bucket per app and a separate burst allowance for read-heavy endpoints.
Default limits
| Tier | Sustained (req/min) | Burst (req/s) |
|---|---|---|
| Free | 60 | 5 |
| Pro | 600 | 30 |
| Enterprise | 3,000 | 200 |
Need more? Contact partnerships — Enterprise tiers can be lifted.
Headers we return
Every response includes:
X-RateLimit-Limit— your current ceiling per minuteX-RateLimit-Remaining— requests left in the current windowX-RateLimit-Reset— Unix timestamp when the window resets
When you hit the limit
You'll receive a 429 Too Many Requests. Back off with exponential jitter and respect Retry-After. Most SDKs do this automatically.
async function withBackoff(fn, max = 5) {
for (let i = 0; i < max; i++) {
try { return await fn(); }
catch (e) {
if (e.status !== 429) throw e;
const wait = Math.min(1000 * 2 ** i + Math.random() * 250, 30000);
await new Promise((r) => setTimeout(r, wait));
}
}
}
Patterns to avoid
- Polling
/v1/eventsfaster than once per 5 seconds. Use webhooks instead. - Hammering
/v1/devices/{id}in a tight loop. Batch with/v1/devices?ids=.... - Fanning out from a webhook handler without a queue.