Regions and limits
Regions
Section titled “Regions”You choose your Region when you register: any Region where Amazon SES sends email. Your data stays in that Region, and only our deployment in that Region ever processes it. Install the template there.
We run the service in us-east-2 today, and in other Regions on request. If you register in a Region we don’t run in yet, your account stays pending and we’re told at once. We deploy the service in your Region, and then setup carries on; until then the console shows that you’re waiting for your Region. Your data is never processed in another Region in the meantime.
| Region | Name | Status | API base URL for API keys |
|---|---|---|---|
us-east-2 | US East (Ohio) | Running | https://api.rhinorelay.com/v1 |
us-east-1 | US East (N. Virginia) | On request | https://api.us-east-1.rhinorelay.com/v1 |
us-west-1 | US West (N. California) | On request | https://api.us-west-1.rhinorelay.com/v1 |
us-west-2 | US West (Oregon) | On request | https://api.us-west-2.rhinorelay.com/v1 |
ca-central-1 | Canada (Central) | On request | https://api.ca-central-1.rhinorelay.com/v1 |
sa-east-1 | South America (São Paulo) | On request | https://api.sa-east-1.rhinorelay.com/v1 |
eu-west-1 | Europe (Ireland) | On request | https://api.eu-west-1.rhinorelay.com/v1 |
eu-west-2 | Europe (London) | On request | https://api.eu-west-2.rhinorelay.com/v1 |
eu-west-3 | Europe (Paris) | On request | https://api.eu-west-3.rhinorelay.com/v1 |
eu-central-1 | Europe (Frankfurt) | On request | https://api.eu-central-1.rhinorelay.com/v1 |
eu-north-1 | Europe (Stockholm) | On request | https://api.eu-north-1.rhinorelay.com/v1 |
eu-south-1 | Europe (Milan) | On request | https://api.eu-south-1.rhinorelay.com/v1 |
il-central-1 | Israel (Tel Aviv) | On request | https://api.il-central-1.rhinorelay.com/v1 |
me-south-1 | Middle East (Bahrain) | On request | https://api.me-south-1.rhinorelay.com/v1 |
af-south-1 | Africa (Cape Town) | On request | https://api.af-south-1.rhinorelay.com/v1 |
ap-south-1 | Asia Pacific (Mumbai) | On request | https://api.ap-south-1.rhinorelay.com/v1 |
ap-northeast-1 | Asia Pacific (Tokyo) | On request | https://api.ap-northeast-1.rhinorelay.com/v1 |
ap-northeast-2 | Asia Pacific (Seoul) | On request | https://api.ap-northeast-2.rhinorelay.com/v1 |
ap-northeast-3 | Asia Pacific (Osaka) | On request | https://api.ap-northeast-3.rhinorelay.com/v1 |
ap-southeast-1 | Asia Pacific (Singapore) | On request | https://api.ap-southeast-1.rhinorelay.com/v1 |
ap-southeast-2 | Asia Pacific (Sydney) | On request | https://api.ap-southeast-2.rhinorelay.com/v1 |
ap-southeast-3 | Asia Pacific (Jakarta) | On request | https://api.ap-southeast-3.rhinorelay.com/v1 |
Use your Region’s API base URL with API keys: https://api.rhinorelay.com/v1 for us-east-2, and https://api.<region>.rhinorelay.com/v1 for any other Region. The console’s Setup page shows yours. A request to another Region’s host gets 421 wrong_region. SigV4 requests go to your Region’s own endpoint, shown on the console’s API keys page (see Authentication). SES sandbox status and quotas are also per Region, so request production access in the same Region.
Request limits
Section titled “Request limits”| Limit | Value | When you go over |
|---|---|---|
| Requests for your account | 50 a second | 429 rate_limited, with Retry-After |
| Requests from one IP address | 1,000 per 5 minutes, at AWS WAF | 429 from WAF |
| JSON request body | 1 MB | 413 batch_too_large |
Contacts in POST /contacts/batch |
1,000 | 413 batch_too_large |
Page size (?limit=) |
1 to 500, default 100 | 422 validation_failed |
| Idempotency keys | Kept 24 hours | A reused key with a different request gives 409 idempotency_conflict |
| Presigned upload and download links | 1 hour; the response gives the exact expiry | S3 refuses the link |
Files never go through the API: CSV uploads and exports use presigned links to buckets in your own account. See Pagination and Idempotency.
Contacts
Section titled “Contacts”| Limit | Value |
|---|---|
| Custom fields per contact | 100 |
| Field names | 64 characters: letters, digits, _, . and - |
| Field values | 1,024 characters |
| Tags per contact | 200, each up to 100 characters |
Soft bounces before a contact is marked bounced |
3 in a row |
Segments, templates and sending
Section titled “Segments, templates and sending”| Limit | Value |
|---|---|
| Segment nesting | 3 levels |
| Segment conditions | 50 in all |
| Template HTML | 512 KB, and the HTML and plain text together under 380 KB, since a version is stored as one item in your table. Over 102 KB you get a warning, because Gmail clips larger messages. |
| Subject line | 998 characters |
| Email addresses | Only ASCII before the @: Amazon SES can’t send to anything else, so such addresses are refused, saying why. Domains in any script are accepted (stored in their ASCII form, shown as written in the console). |
| Template versions returned | The newest 20 with the template; all of them from GET /templates/{id}/versions, a page at a time |
| Test send recipients | 10 addresses per request |
| Emails per queued batch | 50 |
| Our SES configuration sets in your account | Two: rhino-relay-campaigns for every campaign, and rhino-relay-test for test sends. Campaigns are told apart by the tags on each email, so there’s no limit on how many you run. |
Flood protection
Section titled “Flood protection”Our work queues are shared by all clients and carry IDs only. We count the messages we take for your account from each queue in every 5-minute window. The limits are far above anything your own sending produces:
| Queue | Messages per 5 minutes, per client |
|---|---|
| Send (a message is a batch of up to 50 emails) | 20,000 |
| SES events | 600,000 |
| Imports | 5,000 |
If your account goes over a limit, for example because something in your account publishes a flood of junk events:
- We stop taking your messages from that queue and set them aside, still IDs only, to replay when taking resumes. Set-aside messages are kept for up to 14 days.
- We email your account’s admins.
- Taking resumes by itself once a 5-minute window stays calm. We check every 5 minutes. Clicking Verify in the console resumes it straight away.
Other clients carry on as normal while your messages are held, and so do you if another client floods.
Defaults you can change
Section titled “Defaults you can change”These are in your settings (GET /settings, PATCH /settings).
| Setting | Default | What it does |
|---|---|---|
pause.hardBounceRate |
2% | A campaign pauses when hard bounces pass this share of sent emails |
pause.complaintRate |
0.1% | A campaign pauses when complaints pass this share of delivered emails |
pause.minDelivered |
1,000 | Rates are checked only once this many emails are delivered |
sunset.enabled |
false |
Turns on sunsetting: leaving unengaged contacts out of segments |
sunset.minSends and sunset.inactiveDays |
4 emails, 180 days | With sunsetting on, a contact with at least this many emails and no human open or click for this long is left out of segments |
quotaReserve |
500 | Emails of your SES daily quota kept free for test sends and other campaigns |
Each plan includes a number of subscribed contacts. Unsubscribed and suppressed contacts don’t count. The SES production access request text asks AWS for the daily quota shown.
| Plan | Subscribed contacts | SES daily quota to request |
|---|---|---|
| Starter | 25,000 | 25,000 |
| Growth | 150,000 | 150,000 |
| Scale | 500,000 | 500,000 |
If a subscription ends, sending continues for a 30-day grace period. Then your account is read-only for 90 days: unsubscribe links, erasure, exports and reads keep working, and new campaigns and imports return 402 entitlement_inactive.
Check your limits
Section titled “Check your limits”curl "$BASE/settings" -H "Authorization: Bearer $KEY"curl "$BASE/health" -H "Authorization: Bearer $KEY"Check it worked: the settings show your pause and sunset thresholds, and the quota and send_rate health checks show your SES daily quota and sending rate.