grabmail.io

Limits

Everything that is capped, in one place. Published rather than discovered — a limit you meet by surprise is a bug in the documentation.

At a glance

  • 1/sec

    API requests, per address

    Polling once a second is the intended pattern.

  • 5days

    Message retention

    From arrival, read or not. Hard limit.

  • 5MB

    Maximum message size

    Refused at SMTP time, so the sender is told.

  • Addresses per domain

    Nothing is created in advance, so nothing is counted.

  • 200

    Messages per list call

    Default 50. Use limit to change it.

  • 0

    Outbound messages

    There is no sending endpoint. By design.

Rate limit

One request per second, per address. The limit is per mailbox, not per IP, so a shared CI runner polling twenty different mailboxes is not competing with itself.

Over the limit you get 429 with a Retry-After header in whole seconds. There is no daily quota, no monthly quota and no burst credit to manage.

There is a second ceiling, and it is stated here rather than left to be discovered: 1200 requests a minute from one source address. That is exactly the twenty-mailboxes-a-second example above, so ordinary automation never meets it — it exists so a single host cannot walk ten thousand addresses a second.

HTTP/1.1 429 Too Many Requests
Retry-After: 1
Content-Type: application/json

{
  "error":   "rate_limited",
  "message": "one request per second, per address"
}

Back off on Retry-After rather than a fixed sleep. If the limit ever changes, code that reads the header keeps working.

Message size

Messages up to 5 MB, attachments included. That ceiling is enforced by the mail server during the SMTP conversation, which matters: the sending server is told at the moment it tries, and reports a real failure to its user, instead of the message vanishing.

What counts
The whole encoded message — headers, body and every attachment after MIME encoding. Base64 inflates a binary by about a third, so a 20 MB file is close to the line.
What happens over the line
A 552 at SMTP time. The message is never stored and never appears in the mailbox.
Attachments per message
Not capped separately. The total is what matters.

Retention

A message is deleted 5 days after it arrives, whether or not it has been read, and the clock starts at delivery rather than at first read.

Every message carries expires_at, so a client never has to compute that date or track the policy.

It is a hard limit, not a setting: no parameter, plan or account extends it. If something must outlive the window, fetch it and store it on your side.

Addresses and domains

Addresses per domain
Unlimited, and not counted. Since a mailbox is never created, there is no list of them to grow.
Local-part rules
One to 64 characters: letters, digits, dot, dash, underscore and plus. It must start and end with a letter or digit. Anything else is rejected before it reaches the mail server, in the browser and again on the server.
Plus addressing
name+tag@domain is a distinct mailbox here, not an alias of name@domain. That is deliberate — tags are how people separate signups, and folding them together would merge inboxes that were meant to stay apart.
Case
Everything is lower-cased. Name@ and name@ are the same mailbox.
Custom domains
No limit on how many you point here. Each needs its own MX record.

Fair use

There is no quota to buy your way past, and no plan that raises these numbers. What there is instead: if a single source makes the service worse for everybody else, it gets stopped.

Bulk polling
Thousands of mailboxes polled every second from one source will be throttled at the edge before it reaches the API.
Mail floods
A sending host that opens an unreasonable number of SMTP connections is parked for ten minutes. Normal senders never come close.
Using us as a relay
Impossible rather than forbidden: the mail server only accepts messages addressed to domains hosted here, so it cannot forward anything anywhere.

None of this is aimed at ordinary automation. Poll once a second, all day, across thousands of mailboxes — that is the intended use, not the edge of it.