Rate Limiting
API rate limits by plan tier, response headers, and handling exceeded limits.
Rate Limits by Plan
API requests are rate-limited per user to ensure fair usage and platform stability.
| Plan | Requests/minute | Synthesis/minute | Streaming/minute |
|---|---|---|---|
| Trial | 30 | 10 | 10 |
| Pro | 120 | 10 | 30 |
| Growth | 300 | 10 | 60 |
Response Headers
Every API response includes rate-limit headers:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed in the window |
X-RateLimit-Remaining | Requests remaining in the current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
Usage-Based Limits
In addition to request rate limits, certain operations have usage-based limits tied to your subscription plan:
| Resource | Trial | Pro | Growth |
|---|---|---|---|
| Research sources | 10 | 100 | 500 |
| Agent runs (credits) | 10 | 100 | 500 |
| Documents | 5 | 50 | 200 |
| Syntheses per day | 3 | 20 | 100 |
| API calls per day | 100 | 5,000 | 25,000 |
When Limits Are Exceeded
Rate Limit Exceeded (HTTP 429)
When you exceed the per-minute rate limit, the API returns a 429 Too Many Requests response:
{
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Retry after 12 seconds.",
"details": {
"retry_after": 12
}
}
Best practice: Implement exponential backoff. Wait for the duration indicated by the X-RateLimit-Reset header before retrying.
Usage Limit Exceeded (HTTP 402)
When you exceed a usage-based limit (e.g., max research sources), the API returns a 402 Payment Required response:
{
"code": "USAGE_LIMIT_EXCEEDED",
"message": "File upload limit reached for your plan.",
"details": {
"usage_type": "file_upload",
"current": 10,
"limit": 10,
"plan": "trial",
"upgrade_required": true
}
}
Resolution: Upgrade your plan or purchase a compute boost pack via the billing API.
Was this helpful?