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

TierSustained (req/min)Burst (req/s)
Free605
Pro60030
Enterprise3,000200

Need more? Contact partnerships — Enterprise tiers can be lifted.

Headers we return

Every response includes:

  • X-RateLimit-Limit — your current ceiling per minute
  • X-RateLimit-Remaining — requests left in the current window
  • X-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/events faster 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.