Skip to main content

Rate Limits

All API requests are subject to rate limits based on your plan.

Free Plan Limits​

LimitValue
Monthly requests10,000
Daily requests1,000
Requests per minute (RPM)60
API tokens5

Rate Limit Headers​

Every API response includes rate limit headers:

HeaderDescription
X-RateLimit-LimitMaximum requests per minute
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetUnix timestamp when the window resets

When Redis is unavailable, the API fails open and returns:

HeaderDescription
X-RateLimit-StatusSet to degraded when rate limiting is unavailable

Handling 429 Errors​

When you exceed the rate limit, the API returns 429 Too Many Requests with the ErrorInfo format:

{
"requestId": "a1b2c3d4-...",
"path": "/api/v1/email",
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Try again later.",
"details": []
}

The response includes a Retry-After header with the number of seconds to wait before retrying.

Best practices:

  • Implement exponential backoff on 429 responses
  • Use the Retry-After header to know when to retry
  • Use the X-RateLimit-Remaining header to throttle proactively
  • Cache responses when possible to reduce API calls

Quota Headers​

Every API response includes quota headers:

HeaderDescription
X-Quota-LimitMonthly request quota
X-Quota-RemainingRemaining monthly requests
X-Quota-Daily-LimitDaily request quota (if applicable)
X-Quota-Daily-RemainingRemaining daily requests (if applicable)

Monthly Quota​

When your monthly quota is exhausted, requests return 429:

{
"requestId": "a1b2c3d4-...",
"path": "/api/v1/email",
"code": "QUOTA_EXCEEDED",
"message": "Monthly quota exceeded. Upgrade your plan.",
"details": []
}

Daily Quota​

When your daily quota is exhausted, requests return 429:

{
"requestId": "a1b2c3d4-...",
"path": "/api/v1/email",
"code": "DAILY_QUOTA_EXCEEDED",
"message": "Daily quota exceeded. Try again tomorrow.",
"details": []
}

Paid plans with higher limits are coming soon.