Getting Started
Rate Limits
Rate limits are applied per API key. Limits vary by plan.
Limits by Plan
| Plan | Requests/min | Calls/day | Notes |
|---|---|---|---|
| Free | — | — | No API access |
| Lite | — | — | No API access |
| Starter | 30 | 500 | — |
| Pro | 60 | 2,000 | — |
| Team | 120 | 10,000 | Per workspace |
Rate Limit Headers
Every API response includes headers indicating your current usage.
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed in the window |
X-RateLimit-Remaining | Requests remaining in the window |
X-RateLimit-Reset | Unix timestamp when the window resets |
Retry-After | Seconds to wait before retrying (only on 429) |
Handling 429 Too Many Requests
When rate limited, the API returns HTTP 429 with a Retry-After header. Use exponential backoff to retry.
TypeScript — exponential backoff
async function fetchWithBackoff(url: string, options: RequestInit, retries = 3) { for (let attempt = 0; attempt < retries; attempt++) { const res = await fetch(url, options);
if (res.status !== 429) return res;
const retryAfter = Number(res.headers.get("Retry-After") ?? 1); const delay = retryAfter * 1000 * Math.pow(2, attempt); await new Promise((r) => setTimeout(r, delay)); } throw new Error("Rate limit exceeded after retries");}