Address limits
Cap what one address sends, receives and keeps, hold it, or choose who it may write to and hear from. With no limits set, the plan is the only cap.
How limits work
Every address starts with no limits of its own, and the plan of the workspace is the only cap until somebody sets one. Limits sit on top of the plan, so a message has to pass both. They hold on every way mail leaves the address: the app, the assistant, the API and the SDKs, MCP, mail apps over SMTP, sign-up forms, broadcasts, automations and booking pages. Receiving limits hold on mail that arrives here, which leaves out connected mailboxes, as Receiving explains.
An address an AI agent works from is the usual case. Allowed recipients set to client.com, a cap of 50 messages a day and allowed senders set to client.com mean the agent only writes to that client, never more than 50 times a day, and only hears from them.
- An hour is the current clock hour in UTC, so it starts again on the hour.
- A day is the last 24 clock hours, the current one included, so it lets go of one hour at a time.
- A month is the calendar month in UTC.
Sending
| Limit | What it does |
|---|---|
| Hold: paused | A new message is refused with 429 address_sending_paused. Queued and scheduled mail waits and is tried again every 15 minutes until sending is resumed. |
| Hold: disabled | A new message is refused with 403 address_sending_disabled. Queued and scheduled mail fails, each fires email.failed, and a message written in the app tells its sender. |
| Messages per hour, day or month | How many messages the address may send in each window. Past one, a message is refused with 429 address_limit_reached. |
| Recipients per hour, day or month | How many recipients its messages may go to in each window, counting every address in to, cc and bcc. Past one, 429 address_limit_reached. |
| Recipients per message | How many recipients one message may have. More is a 403 too_many_recipients, and so is a message that no cap could ever let through, such as 60 recipients against 50 an hour. |
| Allowed recipients | The only recipients it may send to. Anyone else is a 403 recipient_not_allowed that names up to five of them. Not set means anyone, and an empty list means nobody. |
| Blocked recipients | Recipients it may never send to, refused the same way. An empty list blocks nobody. |
Receiving
| Limit | What it does |
|---|---|
| Hold: paused | Mail is turned away with a temporary bounce, 4.2.1, so the sender knows to try again later. |
| Hold: disabled | Mail is turned away with a permanent bounce, 5.2.1. |
| Messages per hour, day or month | How much mail it accepts in each window. Past one, mail is turned away with a temporary bounce, 4.2.2. |
| Storage quota | The most mail it may keep, from 1 MiB to 1 TiB. A message that would take it past the quota is turned away with a permanent bounce, 5.2.2, and Storage quota below says what counts. |
| Allowed senders | The only senders it accepts mail from, matched against the From header and the envelope sender. Anyone else gets a permanent bounce, 5.7.1. Not set means anyone, and an empty list means nobody. |
Receiving limits never apply to a connected mailbox, such as a Gmail or Outlook address. Its mail arrives at the provider and syncs in from there, so it never passes the check that turns mail away. Sending limits apply to a connected mailbox like any other address.
Mail that is turned away is never filed, so the mailbox, its rules and the assistant never see it. A receiving cap is checked as each message arrives, so a burst of mail at the same moment can go a few messages over it.
Storage quota
A storage quota caps how much mail one address keeps. It is set in bytes, from 1 MiB (1,048,576) to 1 TiB (1,099,511,627,776), and the limits of the address report what it keeps now as usage.storage, with its bytes and its messages.
- Each message the address receives counts once it is filed in its mailbox, at the size it arrived, together with its original when the address keeps originals. A plus tag counts toward the address it belongs to.
- Counting began when storage quotas shipped. Mail an address held before then is not counted, so its total can be lower than what its mailbox holds.
- Mail routed to a webhook is never stored in a mailbox, so it never counts. Sent copies, drafts and messages a mail app uploads do not count either.
- Deleting mail for good makes room again: deleting a conversation forever, emptying the Bin, and the retention of temporary mail. Moving a conversation to the Bin keeps it, so it still counts.
- Removing a domain stops counting what its addresses kept. Their conversations stay in the mailbox but no longer count toward any quota.
- Moving a domain to another workspace takes what its addresses keep with it, and so does renaming the free address that follows a username.
- In the web app, the Storage quota field sits in the Receiving section of the Limits tab, in megabytes or gigabytes, and the Usage section shows the stored mail with its number of messages. In the phone app, the Limits tab of the address screen sets the storage quota too.
The quota is checked as each message arrives, so messages that arrive at the same moment can take an address a little past it. Mail it turns away is never filed and never counts.
Writing a list or a cap
Allowed recipients, blocked recipients and allowed senders each hold up to 100 entries, and case does not matter:
[email protected]matches that address alone.client.commatches every address at that domain, and not at its subdomains.*.client.commatches every subdomain of it, such asmail.client.com. Addclient.comas well to include the domain itself.
Caps take whole numbers from 1 to 10,000,000, and a storage quota takes bytes from 1 MiB to 1 TiB. To stop sending or receiving altogether, use the hold instead.
When a limit is reached
| Code | Status | What it means |
|---|---|---|
| address_limit_reached | 429 | A cap is used up. param names it, such as sending.perDay, and retryAfterSeconds in the body, like the Retry-After header, says when it lifts. When several caps are used up, it names the one that lifts last. |
| address_sending_paused | 429 | Sending is paused. It lifts only when somebody resumes it, so waiting alone never clears it. |
| address_sending_disabled | 403 | Sending is disabled. |
| too_many_recipients | 403 | The message has more recipients than the address allows in one message, or than a cap could ever let through. |
| recipient_not_allowed | 403 | A recipient is outside the allowed recipients or on the blocked ones. The message names up to five. |
A mail app that sends over SMTP gets the same answers as SMTP replies: 451 4.7.1 while sending is paused or a cap is used up, so the app tries again later, 550 5.7.1 when sending is disabled or a recipient is not allowed, and 452 4.5.3 for too many recipients. In the app, the composer says why the message was stopped.
How usage is counted
- A message counts when it is accepted, so a scheduled message counts the moment it is scheduled. A message a limit refuses counts for nothing.
- Recipients count every address in
to,ccandbcc. A plus tag counts toward the address it belongs to. - Received mail counts once it is filed. Mail that is turned away does not count.
- Usage is counted for every address, limited or not, so a new cap starts from what the address has already sent or received in that window.
- Sends made with a test API key are never limited or counted.
- Forwarding stays apart: mail an address forwards to other places does not count toward its sending caps and is not held by a sending hold. Mail the address turns away is never forwarded.
- Counting started when address limits shipped, so nothing sent or received before then is in the totals. Stored mail is counted from when storage quotas shipped.
- The limits of an address come with its usage for the current hour, the last 24 hours and the month, with the mail it keeps in
usage.storage, and withresets: when the hour starts again, when the oldest counted hour drops out of the last 24, and when the month starts again.
Who can set limits
- Reading the limits of an address needs
domains:read, and changing them needsdomains:write. - Changing them also needs reach of the address: the workspace owner, or a member whose role reaches it. Anyone else gets 403
insufficient_authority. - An API key or a connected app limited to some addresses only reaches the limits of those, and any other address answers 404.
- A mailbox login can read the limits of its own address and cannot change them.
- Moving a domain to another workspace takes the limits of its addresses with it, and what they keep.
Set limits
- In the web app, on the Limits tab of the address page, under Settings → Addresses. In the phone app, on the Limits tab of the address screen.
- Over REST,
GETandPATCH /domains/{id}/addresses/{addressId}/limits. The patch takessendingandreceiving: a field left out stays as it is, null clears it, and clearing every field brings the address back to no limits. - In the SDKs,
domains.getAddressLimits(id, addressId)anddomains.updateAddressLimits(id, addressId, patch), under the same names in Python, Ruby, PHP, Go, Java and C#, written the way each language writes names. - On the command line,
nextmail domains get-address-limitsandnextmail domains update-address-limits. - Over MCP and in the assistant,
getAddressLimitsandsetAddressLimits.setAddressLimitschanges what an address may do, so it asks before it runs, andwhoAmIlists up to 20 addresses that have limits of their own.
nextmail domains update-address-limits <domain-id> <address-id> --sending-per-day 50 --sending-allowed-recipients client.com --receiving-allowed-senders client.comnextmail domains update-address-limits <domain-id> <address-id> --receiving-storage-bytes 1073741824nextmail domains get-address-limits <domain-id> <address-id>
Google Workspace