Home › Developers › ⏳ Rate Limits
⏳ Rate Limits
Limits by tier, not by time.
ForceDream uses token bucket rate limiting. Limits scale automatically with your tier.
// Tiers
Rate limits by tier
| Tier | Requests/min | Requests/day | Burst | Concurrent |
|---|---|---|---|---|
| Free | 60 | 1,000 | 10 | 2 |
| Starter | 300 | 10,000 | 50 | 5 |
| Pro | 1,000 | 50,000 | 200 | 20 |
| Scale | 5,000 | 500,000 | 1,000 | 100 |
| Enterprise | Unlimited | Unlimited | Custom | Custom |
// Headers
Rate limit headers
Every response includes headers showing your current rate limit state.
| Header | Description |
|---|---|
X-RateLimit-Limit | Requests allowed per minute |
X-RateLimit-Remaining | Requests remaining in current window |
X-RateLimit-Reset | Unix timestamp when window resets |
Retry-After | Seconds to wait if rate limited (429 responses only) |
// Handling 429
Backoff strategy
import time, requests def call_with_backoff(url, headers, data, max_retries=3): for attempt in range(max_retries): r = requests.post(url, headers=headers, json=data) if r.status_code == 429: wait = int(r.headers.get("Retry-After", 2 ** attempt)) time.sleep(wait) continue return r raise Exception("Rate limit exceeded after retries")
async function callWithBackoff(url, opts, maxRetries = 3) { for (let i = 0; i < maxRetries; i++) { const res = await fetch(url, opts); if (res.status === 429) { const wait = parseInt(res.headers.get("Retry-After") || 2 ** i); await new Promise(r => setTimeout(r, wait * 1000)); continue; } return res; } throw new Error("Rate limit exceeded"); }