Limits & errors
Limits
| Limit | Value |
|---|---|
| API requests | 600 per minute per API key (or per dashboard user) |
| Daily recipients | Set per account, counted over a rolling 24 hours. Ask us to raise it as your volume grows. |
to addresses per email (/emails) | 50 |
Recipients per request (/v3/mail/send) | 1,000 |
| Emails per batch | 100 |
| Schedule ahead | 30 days (scheduled_at), 72 hours (send_at) |
| Categories per message | 10 |
| Idempotency key lifetime | 24 hours |
Event data | 32 KB |
| Automation steps | 50 |
Over the rate limit, you get 429 with a Retry-After header in seconds. Over the daily quota, you get 429 with daily_quota_exceeded. The quota counts recipients over the last 24 hours, so capacity frees up gradually rather than at a fixed time.
Error formats
Each API has its own error format.
REST API
{ "statusCode": 422, "name": "validation_error", "message": "The `to` field must contain at least one address." }name | Status | Meaning |
|---|---|---|
missing_api_key | 401 | No Authorization header |
invalid_api_key | 403 | The key doesn't exist or was revoked |
restricted_api_key | 401 | A send-only key tried to do something else |
validation_error | 422 / 403 | The request is invalid, or the sender's domain isn't verified |
missing_required_field | 422 | A required field is missing |
not_found | 404 | No such resource in your account |
invalid_idempotent_request | 409 | The idempotency key was used with a different request |
concurrent_idempotent_requests | 409 | The same idempotency key is still being processed |
rate_limit_exceeded | 429 | Too many requests |
daily_quota_exceeded | 429 | Daily recipient quota reached |
internal_server_error | 500 | Something went wrong on our side. Retry with the same idempotency key. |
v3 API
{ "errors": [{ "field": "from.email", "message": "The from email does not contain a valid address." }] }field is null for errors that aren't about one field.
Retrying
Retry 429 (after Retry-After) and 5xx responses with exponential backoff. Don't retry other 4xx responses: fix the request. Use an idempotency key so retries never send twice.