Understand API usage limits
Rate Limits
Mailpipe enforces rate limits to ensure fair usage and platform stability. Learn about tier limits, response headers, and retry strategies.
Tier Limits
Rate limits vary by subscription tier. All limits are applied per organization.
| Tier | Emails / Hour | Emails / Day | Burst Limit |
|---|---|---|---|
| Standard | 100 | 1,000 | 10 / second |
| Pro | 1,000 | 50,000 | 50 / second |
Rate Limit Headers
Every API response includes rate limit headers so you can track your usage:
X-RateLimit-Limit: 100 X-RateLimit-Remaining: 87 X-RateLimit-Reset: 2024-01-15T12:00:00Z
X-RateLimit-Limit — Maximum requests allowed in the current window
X-RateLimit-Remaining — Requests remaining in the current window
X-RateLimit-Reset — ISO 8601 timestamp when the window resets
Rate Limit Exceeded (429)
When you exceed your rate limit, the API returns a 429 Too Many Requests response with a Retry-After header.
HTTP/1.1 429 Too Many Requests
Retry-After: 3600
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 2024-01-15T13:00:00Z
{
"error": "Rate limit exceeded: hourly email limit reached"
}Retry Strategies
Implement exponential backoff with jitter for the best retry behavior:
async function sendWithRetry(payload, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const response = await fetch('/api/v1/outbound/{orgId}/send', {
method: 'POST',
headers: {
'Authorization': 'Bearer mp_live_xxx',
'Content-Type': 'application/json',
},
body: JSON.stringify(payload),
});
if (response.status !== 429) return response;
const retryAfter = parseInt(response.headers.get('Retry-After') || '60');
const jitter = Math.random() * 1000;
const delay = retryAfter * 1000 + jitter;
console.log(`Rate limited. Retrying in ${delay / 1000}s...`);
await new Promise(resolve => setTimeout(resolve, delay));
}
throw new Error('Max retries exceeded');
}Check Your Quota
You can check your current quota at any time:
curl "https://api.mailpipe.dev/v1/outbound/{orgId}/send" \
-H "Authorization: Bearer mp_live_xxx"{
"orgId": "org_xxx",
"tier": "standard",
"used": 42,
"remaining": 58,
"limit": 100,
"resetsAt": "2024-01-15T13:00:00Z"
}Still have questions?
We can help with anything from setup to scaling.