Rate Limits & Plans
Rate limits protect the platform and ensure fair usage. Limits are applied per API key on REST endpoints. Dashboard (tRPC) requests are not rate limited.
Plan Comparison
| Feature | Free | Pro | Growth | Team | Enterprise |
|---|---|---|---|---|---|
| Price / month | Free | $29 | $79 | $199 | Custom |
| Traces / month | 10,000 | 50,000 | 150,000 | 500,000 | Unlimited |
| LLM evals / month | 500 | 5,000 | 15,000 | 50,000 | Unlimited |
| Data retention | 7 days | 30 days | 60 days | 90 days | Unlimited |
| API rate limit | 100 req/s | 1,000 req/s | 1,000 req/s | 1,000 req/s | 1,000 req/s |
| Seats | 1 | 3 | Unlimited | Unlimited | Unlimited |
| Overages | No | Yes | Yes | Yes | No |
| Audit logs | No | No | Yes | Yes | Yes |
| SSO/SAML | No | No | No | No | Yes |
Rate Limiting
How It Works
Rate limits use a Redis sliding window algorithm per API key. Each API key has an independent counter that tracks requests within a rolling one-second window.
Rate-Limited Endpoints
| Endpoint | Method | Rate Limited |
|---|---|---|
/api/v1/traces | POST | Yes |
/api/v1/traces | GET | Yes |
/api/v1/scores | POST | Yes |
/api/v1/route-model | POST | Yes |
/api/v1/auth/* | POST | Yes |
/api/v1/health | GET | No |
/api/trpc/* | All | No |
Response Headers
Rate-limited endpoints include these headers in every response:
| Header | Description |
|---|---|
RateLimit-Limit | Maximum requests per second for your plan |
RateLimit-Remaining | Requests remaining in the current window |
RateLimit-Reset | Unix timestamp when the window resets |
When Rate Limited (429)
{
"data": null,
"error": {
"message": "Rate limit exceeded. Retry after 1 second.",
"code": "RATE_LIMITED"
}
}Retry Strategy
Implement exponential backoff with jitter. The Python SDK handles retries automatically. For custom integrations:
import time
import random
def call_with_retry(func, max_retries=3):
for attempt in range(max_retries):
resp = func()
if resp.status_code != 429:
return resp
wait = (2 ** attempt) + random.uniform(0, 1)
time.sleep(wait)
raise Exception("Rate limited after retries")Payload Limits
| Endpoint | Max Payload | Max Batch Size |
|---|---|---|
POST /api/v1/traces | 5 MB | 1,000 events per batch |
POST /api/v1/scores | 1 MB | — |
POST /api/v1/route-model | 512 KB | — |
Requests exceeding payload limits receive a 413 Payload Too Large response.
Usage Quotas
Usage is tracked per organization per calendar month (UTC). Counters include:
- Trace count — each trace ingested
- Span count — each span ingested
- Eval run count — each evaluator execution
On the Free plan, trace ingestion is blocked when the monthly trace limit is reached. Upgrade or wait for the next month to resume. See Alerts & Usage for monitoring and alert details.
Data Retention
A daily cleanup worker deletes traces, spans, and associated scores older than your plan's retention window. Retention is calculated from the trace's createdAt timestamp.
| Plan | Retention | Cleanup Frequency |
|---|---|---|
| Free | 7 days | Daily |
| Pro | 30 days | Daily |
| Growth | 60 days | Daily |
| Team | 90 days | Daily |
| Enterprise | Unlimited | N/A |
Deletion is irreversible. Upgrade your plan before data expires if you need longer retention.