Limits and quotas
Every number of the service on one page. For each one: the value, what the server does when it is reached, and who can change it. A sending limit holds the message back; the others refuse, with a code.
“Default” values are settings of a space. Its human changes the sending window, spacing, the duplicate rule and approval with update_settings, within bounds; an Escouade Mail administrator sets the rest. inbox_status and get_settings return the ones that apply to your space.
Plans
| Plan | Inboxes | E-mails per month | When the limit is reached |
|---|---|---|---|
| Before payment | 1 | None to a third party: the inbox only writes to its human. | Refusal: payment_required. |
| €9 a month | 2 | 800 | Inboxes: refusal inbox_limit. Volume: the message waits for the next period. |
| €19 a month | 5 | 2,000 | Same. |
| €49 a month | 15 | 6,000 | Same. |
- The volume counts the e-mails sent since the start of the paid period. A test send does not count.
- A period lasts one month, from the payment.
- An inbox on the shared domain
subagentmail.fronly replies: a first message from it is refused with the codeown_domain_required. - After an unpaid instalment, sending stays open for three days.
billing_status returns the active plan, and the inboxes and volume already used. See Pricing and payment.
Sending
| Limit | Value | When it is reached |
|---|---|---|
| E-mails per day per inbox | 5 the first week, then 10, 15, and 20 from the fourth. On every plan. | The message waits in the queue: it leaves on the next working day. |
| An inbox’s maximum quota | 20 a day, by default. | Same. |
| Sending hours | By default Monday to Friday, 9 am to 6 pm, Paris time, excluding the eleven French public holidays. | The message waits for the first open moment. |
| Gap between two sends from one inbox | 10 minutes by default, plus a random share. | The message waits its turn. |
| First message to the same recipient | Only one per inbox within 30 days, by default. | Refusal: duplicate_recipient. To follow up: reply_to_thread. |
| An inbox’s queue (drafts and waiting messages) | Ten times its maximum daily quota: 200 with the default quota. | Refusal: queue_full. |
| A key’s cap on messages per day | None for the key returned by sign_up. | Refusal: key_daily_cap, until midnight, Paris time. |
| Sending attempts for a message | 3, when the recipient’s server answers with a temporary refusal. | The message moves to failed (failed). |
A reply to a correspondent who has already written in the thread does not wait for sending hours. It counts towards the daily quota and respects the gap between two sends. See Sending rules.
Inboxes and domains
| Limit | Value | When it is reached |
|---|---|---|
| Inboxes per space | 1 before payment, then 2, 5 or 15 depending on the plan. | Refusal: payment_required before payment, inbox_limit afterwards. |
| Inbox creations in 7 days | Twice the inbox cap. Deleted inboxes count. | Refusal: inbox_creation_limit. |
An inbox name (username) | 3 to 32 characters on the shared domain; 64 at most on another domain. | Refusal: invalid_argument. |
| Domains per space | 5 | Refusal: domain_limit. |
Calls to verify_domain | 6 per minute per space. | Refusal: rate_limited. |
| Re-checking a verified domain | Every day. A suspended domain is re-checked every hour. | If a required record has disappeared, the domain is suspended. |
A message’s content
| Field | At most |
|---|---|
| Recipients | 1 per message |
Copies (cc) | 5 per message, in a conversation only |
| Attachments | 10 per message and 10 MB in total, in a conversation only; per space, 500 MB of attachments sent and 200 MB of attachments received; content kept for 90 days |
subject | 300 characters, on one line |
text | 100,000 characters |
html | 300,000 characters |
metadata | 8,000 characters |
to_name | 120 characters |
An inbox’s display_name | 100 characters |
agent_name | 60 characters |
reason, note | 300 characters |
idempotency_key | 1 to 255 characters |
| A request body | 1 MiB. Beyond that: refusal payload_too_large over HTTP. |
Reading
| Limit | Value |
|---|---|
Items in a list (limit) | From 1 to 100. 20 by default. The rest: next_cursor. |
Messages returned by get_thread | 50 per call. The rest: next_cursor. |
Bodies returned by get_thread | 200 KB per call. Beyond that, later bodies are cut, and the response carries truncated. The whole message: get_message. |
A message preview in a list (preview) | 200 characters |
| A message body in the readable text | 2,000 characters. The whole body is in the structured object. |
| The body of an e-mail received | 100,000 bytes of text, 200,000 for the HTML version. |
| Collecting the inboxes | Every 60 seconds in the server’s default setting; 100 e-mails at most per inbox per collection. |
Request rate
| Caller | Requests per minute, per client address |
|---|---|
| Without a key | 60 |
| With a key | 600 |
Beyond that: refusal rate_limited, HTTP status 429. The Retry-After header gives the number of seconds to wait. The window is one minute.
Sign-up and code
| Limit | Value | When it is reached |
|---|---|---|
| Sign-ups from the same IP address | 5 per 24 hours, by default. | Refusal: signup_rate_limited. |
| Codes sent to the same e-mail | 3 per 24 hours, by default. | Refusal: signup_rate_limited. |
| A code’s lifetime | 24 hours | Refusal: code_expired. attach_human sends a new one. |
| Attempts per code | 10 | Refusal: too_many_attempts. attach_human sends a new one. |
| Delay between two codes | 60 seconds | Refusal: code_too_soon. |
| Codes for the same space | 5 | Refusal: code_limit. |
| Changes to the human’s e-mail | 2 | Refusal: human_change_limit. |
| A space that is never verified | Erased 7 days after it was opened, with its inbox. | You have to sign up again. |
The server also caps the total number of spaces opened and not yet verified. Once that cap is reached, sign_up answers signup_rate_limited.
A space a human opens on the connector’s sign-in page counts towards these limits, like a sign-up.
Connector and payment
| Limit | Value |
|---|---|
| A human’s sign-in code (connector) | 10 minutes, 5 attempts. |
| Connection request | 15 minutes. |
Payment link returned by subscribe | 72 hours. |
| Refund | On request, within 14 days of the first payment. |
| Unpaid instalment | Sending stays open for 3 days. |
See Connector and Pricing and payment.
Circuit breaker
| Measure | Threshold |
|---|---|
| Bounces | Above 5%. During warm-up: above 3%. |
| Complaints | Above 0.1%. |
| Sends judged | The last 100 at most. Shares are computed over at least 40 sends. |
Above a threshold, the inbox is suspended: any send is refused with the code inbox_suspended. Reinstatement is manual. See Sending rules.
Retention
| Data | Period |
|---|---|
A message’s log (events) | 12 months. |
| Expired MCP sessions | 30 days. |
| Closed webhook deliveries | 30 days. |
Feed events (event_feed) | 35 days. |
The other periods: Privacy.
What an agent cannot change
An agent changes no limit: it can neither lift nor speed up the warm-up, nor send outside sending hours, nor raise a cap, nor pay for a plan. The space’s human sets the sending window and tightens spacing with update_settings; quotas and the warm-up cannot be set through any tool. What can be asked of an Escouade Mail administrator: see Help.