Rate Limits
VoxBurst applies rate limiting to every authenticated API request. Limits are applied per API key (or per Cognito session) and vary by plan — higher plans receive higher limits.
Do not hard-code a specific limit. Read the current value from the X-RateLimit-Limit
response header on every request instead — the effective limit can change without notice,
and this repo’s security policy does not publish specific numeric thresholds in public
documentation. Treat the limit as dynamic and design your client to back off based on the
headers below, not on an assumed constant.
How It’s Applied
- Rate limiting happens after authentication succeeds. A
401response (missing or invalid credentials) does not include rate-limit headers, and does not count against your limit. - Unauthenticated public endpoints (like
GET /v1/health) are not rate-limited by this mechanism and do not include these headers either. - Every successful, authenticated response includes the headers below, whether or not you are close to the limit.
Response Headers
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed in the current window |
X-RateLimit-Remaining | Requests remaining in the current window |
X-RateLimit-Reset | Unix timestamp when the current window resets |
HTTP/1.1 200 OK
Content-Type: application/json
X-RateLimit-Limit: <requests allowed in the current window>
X-RateLimit-Remaining: <requests remaining in the current window>
X-RateLimit-Reset: <unix timestamp when the window resets>
{
"id": "post_abc123",
"content": "Hello from VoxBurst!",
"status": "scheduled"
}When You’re Rate Limited
When the limit is exceeded, the API returns 429 Too Many Requests with a Retry-After
header indicating how many seconds to wait before retrying:
{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Try again later."
}
}| Status | Code | Cause |
|---|---|---|
429 | RATE_LIMITED | Too many requests in the current window |
Recommended Client Behavior
- Track
X-RateLimit-Remainingand slow down proactively as it approaches zero, rather than waiting to hit429. - On
429, respectRetry-Afterexactly rather than retrying immediately or on a fixed interval. - Use exponential backoff with jitter for repeated
429s, in case of a sustained burst. - Use a separate API key for development and production so a runaway dev script cannot exhaust your production rate limit budget (this also limits the blast radius of a leaked key — see Authentication).
Endpoint-Specific Limits
A small number of endpoints apply their own, tighter rate limit independent of the general
per-key limit described above (for example, the GDPR data export endpoint is limited to a
low fixed number of requests per hour, and certain audit/history endpoints cap requests per
minute). Where this applies, it is called out on that endpoint’s own reference page along
with its specific 429 behavior.