Rate Limits
The API enforces rate limits per API key using a token-bucket algorithm. Limits vary by subscription tier.
Limits by tier
| Tier | Plan | Per-key limit | Per-account limit |
|---|---|---|---|
| 0 | Free | 60 req/min | 100 req/min |
| 1 | Indie | 300 req/min | 500 req/min |
| 2 | Platform | 1,000 req/min | 2,000 req/min |
| 3 | Scale | 3,000 req/min | 6,000 req/min |
Rate limits are enforced at the edge (Cloudflare Durable Objects) — low latency, no central bottleneck.
Rate limit headers
Every response includes:
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 298
When a limit is exceeded, the response also includes:
Retry-After: 4
Retry-After is the number of seconds to wait before retrying.
Handling 429s
- TypeScript
- Python
- Manual retry
// The SDK handles 429s automatically with exponential backoff + jitter.
// Default: 3 retries, respects Retry-After header.
// To customize:
const client = new Xavigate({
apiKey: 'test_sk_YOUR_KEY',
maxRetries: 5,
});
# The SDK handles 429s automatically with exponential backoff + jitter.
client = xavigate.Xavigate(
api_key="test_sk_YOUR_KEY",
max_retries=5,
)
# Read Retry-After from the 429 response header:
# Retry-After: 4
# Wait that many seconds, then retry the identical request.
sleep 4
curl -X POST https://api.xavigate.com/v1/nature/subjects ...
Best practices
- Use the SDK. Auto-retry with jitter is built in — you don't need to implement backoff yourself.
- Batch lazily. Don't fan out N API calls simultaneously. Process items in sequence or small batches with brief pauses.
- Monitor
X-RateLimit-Remaining. If it approaches 0, slow down before you hit a 429. - Need higher limits? Upgrade your tier in the dashboard under Billing.