Limits
“Per day” is a UTC calendar day (resets at 00:00 UTC), “per month” a UTC calendar month, “per hour” a UTC clock hour. A “network” is one IPv4 address or one IPv6 /64.
Per account
Section titled “Per account”| Limit | Sandbox | Claimed (not available yet) | When reached |
|---|---|---|---|
| Live inboxes | 1 | 3 | 409 inbox_limit |
| Inbox creations per day, the signup inbox included | 3 | 10 | 429 inbox_create_limit, Retry-After until 00:00 UTC |
| Messages received per month, all inboxes together | 1,000 | 5,000 | Further mail is rejected (mailbox unavailable) |
| Size of one received message | 10 MiB | 10 MiB | The mail is rejected (mailbox unavailable) |
Long-polls held at once (wait and events?wait= together) |
5 | 5 | 429 too_many_waits, Retry-After: 1 |
| Sandbox period | 7 days | — | The account works as expired. See Accounts |
Rejected mail is not counted as received, and the agent is not told about it. GET /v1/account shows usage.received_this_month.
Signup
Section titled “Signup”| Limit | Value | When reached |
|---|---|---|
| Signups per network per day | 20 | 429 signup_limit, Retry-After until 00:00 UTC |
| Burst guard, per network, on the challenge and on signup separately | about 20 requests per minute (approximate) | 429 rate_limited, Retry-After: 60 |
| Challenge lifetime | 10 minutes | 400 pow_expired |
| Uses per challenge | 1 | 400 pow_reused |
| Proof-of-work difficulty | 20 leading zero bits by default | 400 pow_invalid |
Requests
Section titled “Requests”| Limit | Value | When reached |
|---|---|---|
| JSON body | 16,384 bytes | 413 payload_too_large |
agent_name, name, display_name |
64 characters | 400 invalid_request |
Idempotency-Key |
1–255 printable ASCII characters, kept 24 hours | 400 invalid_request |
wait hold (timeout) |
0–60 seconds, default 25 | 400 invalid_request |
wait results (limit) |
1–50, default 10 | 400 invalid_request |
wait lookback (since default) |
10 minutes | — |
Message list page (limit) |
1–100, default 20 | 400 invalid_request |
Events per call (limit), events hold (wait) |
1–100 (default 100); 0–60 seconds (default 0) | 400 invalid_request |
from, subject filters |
200 characters | 400 invalid_request |
| Messages scanned per filtered call | the 500 newest | A filtered list page can be short while has_more is true |
| Thread view | the newest 500 messages | truncated: true |
Original message with include=raw |
2 MiB | raw: null with raw_error |
Stored message fields
Section titled “Stored message fields”| Field | Cap |
|---|---|
text |
256 KiB |
reply_text |
64 KiB |
subject |
2 KiB |
to |
100 addresses |
| Attachments | 50 per message |
snippet |
200 characters |
A cut field gets the signal content_truncated (attachments_truncated for attachments). The original message stays stored.
Extraction
Section titled “Extraction”| Limit | Value |
|---|---|
| Text scanned | the subject and the first 100,000 characters of text |
Other plausible codes (otp_candidates) |
4 |
| Links returned | 20 (of the first 200 examined) |
Unusual volume of verification mail
Section titled “Unusual volume of verification mail”When an account receives more than 20 verification-code mails from at least 5 sender domains within an hour, otp_flagged_until (in GET /v1/account) is set for 24 hours. Mail is never rejected or delayed because of it. While it is set, an account that is not claimed (today: every account) may run at most 10 extractions per UTC hour (POST …/extract and wait?extract= together):
POST /v1/messages/{id}/extractanswers429extract_limit, withRetry-Afteruntil the next UTC hour;wait?extract=returns the remaining messages withextracted: nullandextract_limited: true.
Reading messages is never capped.
Headers
Section titled “Headers”Retry-After (whole seconds) comes with rate_limited (60), signup_limit and inbox_create_limit (until 00:00 UTC), too_many_waits (1), extract_limit (until the next UTC hour), signups_disabled (3600) and, only after repeated insert races, address_unavailable on POST /v1/inboxes (1). There are no X-RateLimit-* headers.
Not available yet
Section titled “Not available yet”- A request-rate limit per API key is planned.
- Sending limits do not exist, because there is no sending.