Rate Limits
The Translation API enforces per-key daily rate limits to ensure fair use.
How limits work
| Plan | Default daily limit |
|---|---|
| Free | 5,000 requests / day |
| Solo | 100,000 requests / day |
| Team | 2,000,000 requests / day |
| Business | 10,000,000 requests / day |
- The counter resets at midnight UTC every day.
- The counter is tracked per API key, not per IP.
- Both live (
/v1/translations/*) and cached (/v1/cached/translations/*) endpoint calls consume quota.
Grace zone
A 10% grace zone is applied above the hard limit. Requests between 100–110% of your limit are served but you will receive a warning header:
X-RateLimit-Warning: Approaching daily limit: 10450/10000 requests usedRequests above 110% return 429 Too Many Requests.
Handling 429 responses
json
{
"detail": "Rate limit exceeded: 11100/10000 requests today"
}Response headers:
| Header | Value |
|---|---|
Retry-After | 86400 (seconds until midnight UTC reset) |
X-RateLimit-Limit | Your daily limit |
Recommended handling:
js
if (response.status === 429) {
const retryAfter = parseInt(response.headers.get('Retry-After') || '86400')
console.warn(`Rate limited. Retry after ${retryAfter}s`)
// Use cached data or graceful degradation
}python
if response.status_code == 429:
retry_after = int(response.headers.get('Retry-After', 86400))
print(f"Rate limited. Retry after {retry_after}s")
# Fall back to cached dataTips to stay within limits
- Use cached endpoints in production — they consume the same quota but serve from pre-built files, not the database.
- Cache responses on your end — translations rarely change in real time. A 10-minute in-memory cache in your app can reduce calls by 99%.
- Batch language fetches —
GET /v1/translations/{language}returns everything at once. Don't fetch key-by-key.