> For an agent: the map of this documentation is at https://escouade.io/en/mail/docs/llms.txt; every page exists in Markdown, at the same address with `.md` appended.

# 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.fr` only replies: a first message from it is refused with the code `own_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](https://escouade.io/en/pricing).

## 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](https://escouade.io/en/mail/docs/regles-envoi.md).

## 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](https://escouade.io/en/mail/docs/connecteur.md) and [Pricing and payment](https://escouade.io/en/pricing).

## 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](https://escouade.io/en/mail/docs/regles-envoi.md#coupe-circuit).

## 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](https://escouade.io/en/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](https://escouade.io/en/mail/docs/aide.md).
