Skip to main content

Rate Limits

Requests to the KnoxCall Management API (/v1) are rate-limited per API key. The limit is enforced consistently across every API worker, so a burst spread across parallel connections counts against the same budget — there is no per-process loophole.
This page covers the Management API (api.knoxcall.com/v1) — the control plane you use to configure routes, secrets, clients, and so on. Rate limits on your proxy traffic (the routes you expose to your own callers) are configured separately, per route / per client / per tenant — see Rate Limiting overview.

Rate-limit headers

When a limit is configured for a request, the response includes these headers — on every response, not only on a 429, so you can watch your remaining budget as you go: A normal, well-under-budget response looks like this:
X-RateLimit-Reset is an epoch-seconds timestamp. Convert it to a delay with reset - now() (in seconds) if you want to sleep until the window rolls over rather than retrying blindly.

The 429 response

When you exceed the limit, the request is rejected with HTTP 429 and the canonical error envelope using the rate_limit_exceeded type. The response also carries a Retry-After header telling you exactly how long to wait:
Continuing to send requests while rate-limited does not reset the window — it just burns effort. Wait for Retry-After seconds (or until X-RateLimit-Reset) before your next attempt.

Backoff guidance

  1. Respect Retry-After first. On a 429 it is the authoritative wait — sleep that many seconds before retrying.
  2. Watch X-RateLimit-Remaining proactively. If it is trending toward 0, slow down before you get a 429 rather than after.
  3. Add jitter. When several workers hit the limit together, a fixed Retry-After makes them all retry in lockstep. Add a small random offset (e.g. Retry-After + random(0, 1s)) to spread the retries.
  4. Cap your retries. Use exponential backoff with a ceiling and a maximum attempt count; surface a clear error to the caller rather than retrying forever.
The first-party SDKs implement Retry-After-aware backoff with jitter for you and raise a typed RateLimitError once retries are exhausted — you rarely need to hand- roll the loop above.

What’s Next?

Errors

The canonical error envelope and the full type → status table.

Idempotency

Retry mutating requests safely without creating duplicates.

Proxy rate limiting

Per-route / per-client / per-tenant limits on your own proxy traffic.

API Overview

Base URLs, response envelope, pagination, and quick examples.