Rate limits
Rate limits protect the API and ensure fair usage.
Every API-key request counts against a per-account, per-minute sliding window (the limit is shown in the Console and can be raised on paid plans). When the window is exhausted the API returns 429 — back off and retry after a short delay.
Data retention
Message history and the event log (GET /v3/events) are retained for 30 days on Free and 12 months on paid plans; the free workspace inside a paid organisation inherits the organisation’s window. Aggregated metrics accept windows up to 366 days. Suppression lists and unsubscribe records never expire. Downgrading from a paid plan keeps the paid window for a 30-day grace period so you can export first.
Message-shape limits: up to 1,000 recipients combined across to/cc/bcc per single send (larger audiences use POST /v3/messages.batch, up to 5,000 personalized recipients), up to 1,000 addresses in any one field, and messages up to 20 MB via SMTP.
What can return 429
| Parameter | Type | Required | Description |
|---|---|---|---|
Account request rate | per minute · all endpoints | Optional | The sliding-window limit above. Applies to every authenticated request made with an API key. |
Verification route limits | per minute | Optional | POST /v3/validate is additionally capped at 100 requests/min and POST /v3/validate/bulk at 10 jobs/min per account. |
Sending quotas | per month / per day | Optional | Live sends reserve against your monthly plan volume (including any overage policy) and daily ceiling. When a quota is reached the send is rejected with 429. |
Test allowances | per month | Optional | Test keys draw from the free monthly test send/verify allowance (see Test keys) and return 429 when it's exhausted. |
Rate-limit response headers
Every API response reports the current window state, and a 429 additionally tells you exactly how long to wait before retrying:
| Parameter | Type | Required | Description |
|---|---|---|---|
X-RateLimit-Limit | integer | Optional | The size of your per-account request window (requests per minute). |
X-RateLimit-Remaining | integer | Optional | Requests remaining in the current per-account window. |
X-RateLimit-Reset | integer | Optional | Seconds until the current window resets. |
Retry-After | integer · on 429 | Optional | Seconds to wait before retrying the request. Honour this before applying your own backoff. |
Data retention
| Parameter | Type | Required | Description |
|---|---|---|---|
Events (GET /v3/events) | 30 days Free · 12 months paid | Optional | Message lifecycle events queryable through the API and the Console Activity grid. |
Webhook delivery history | 30 days Free · 12 months paid | Optional | Every delivery attempt with response code, latency and outcome (Console → Webhooks → Activity). |
Webhook resend window | 90 days | Optional | How far back POST /v3/webhooks/deliveries/resend can re-deliver, bounded by your plan’s history retention. |
Retention is enforced daily: data older than your plan’s window is deleted permanently. The same numbers are stated on the events, webhooks and resend pages.