Rate Limits
RelayPost enforces rate limits to protect deliverability and prevent abuse. Limits are applied per organization and per API key.
API rate limits
Section titled “API rate limits”Each API key is limited to 60 requests per 60-second sliding window. This applies to all /api/v1/* endpoints.
Every response includes rate limit headers:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed in the current window |
X-RateLimit-Remaining | Requests remaining in the current window |
Retry-After | Seconds to wait before retrying (only on 429 responses) |
When you exceed the rate limit, the API returns:
{ "error": { "code": "RATE_LIMITED", "message": "API key rate limit exceeded" }}Use the Retry-After header to determine when to retry.
Email sending limits
Section titled “Email sending limits”Sending limits vary by plan and are applied per organization:
| Plan | Emails/month | Hourly limit | Daily limit |
|---|---|---|---|
| Free | 3,000 | 100 | 500 |
| Pro | 25,000 | 500 | 5,000 |
| Growth | 100,000 | 2,000 | 15,000 |
| Founding | 25,000 | 500 | 5,000 |
How limits work
Section titled “How limits work”- Monthly limit — total emails you can send per billing period
- Hourly limit — maximum emails in any rolling 60-minute window
- Daily limit — maximum emails in any rolling 24-hour window
When you hit an email sending limit, the API returns:
{ "error": { "code": "LIMIT_EXCEEDED", "message": "Organization email sending limit exceeded" }}Usage alerts
Section titled “Usage alerts”RelayPost sends alerts when you approach your limits:
| Threshold | Alert |
|---|---|
| 80% of monthly limit | Warning notification |
| 90% of monthly limit | Urgent notification |
| 100% of monthly limit | Sends blocked until next period or upgrade |
Upgrading
Section titled “Upgrading”If you consistently hit limits, upgrade your plan from Settings → Billing in the dashboard.
Tips for staying within limits
Section titled “Tips for staying within limits”- Use suppression lists to avoid sending to invalid addresses
- Batch campaign sends across multiple hours instead of all at once
- Monitor your usage dashboard to spot unexpected spikes
- Use the
scheduled_atfield to spread sends over time - Implement exponential backoff when you receive 429 responses