Rate limits
ChronaPilot enforces per-key rate limits at the edge. Limits are designed to be invisible to well-behaved integrations.
Default limits
| Surface | Limit | Window | Concurrency |
|---|---|---|---|
| REST (general) | 100 req/sec | rolling 1s | 5 concurrent |
| Free/Busy queries | 50 req/sec | rolling 1s | 5 concurrent |
| Voice WebSocket | — | — | 10 concurrent sessions |
| Smart Suggestions | 10 req/sec | rolling 1s | 2 concurrent |
| Webhook delivery (outbound) | up to 24 retries / 72h | — | — |
Limits are enforced per API key. OAuth tokens count against the issuing connected account's pool.
Per-resource sub-limits
A few endpoints have stricter limits than the platform-wide budget. They share the same 429 rate_limit_error shape:
| Endpoint | Limit |
|---|---|
| POST /v1/events/{id}/departure/recompute | 4 / minute per event |
| POST /v1/connections/{id}/refresh | 1 / minute per connection |
| POST /v1/webhook_endpoints/{id}/test | 30 / hour per endpoint |
| POST /v1/voice/sessions | 60 / hour per user |
Response headers
Every response includes:
| Header | Meaning |
|---|---|
| X-RateLimit-Limit | Maximum requests in the current window. |
| X-RateLimit-Remaining | Requests remaining in the current window. |
| X-RateLimit-Reset | Unix epoch seconds when the window resets. |
When you exceed
You receive a 429 with:
JSON
{
"error": {
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Retry after 1.2s.",
"retry_after_seconds": 1.2
}
}A Retry-After header is also set. Back off and retry — preferably with jitter to avoid retry thunder.
Increasing limits
Custom limits are available on Scale and Enterprise plans. Email support@chronapilot.com with your typical and peak traffic patterns and we'll provision additional headroom — usually within one business day.