Disposable inboxes
A working address for somebody who has not got one: no account, no key, and a lease that ends within a day.
What a disposable inbox is
A caller asks for an address on one of the disposable domains Nextmail runs, watches it for a few minutes, reads whatever arrives, and abandons it. It exists for the confirmation code, the "what does this form actually send" question, and the signup you do not want attached to the address you will still be using in five years.
- It receives and nothing else. There is no send: an inbox has no identity to send as, and none of these nine calls will put a message on the wire.
- The lease is 60 minutes by default and can be pushed to 24 hours, an hour at a time.
- Every message that reaches it is listed, 50 to a page with a cursor for the rest, so nothing is hidden for arriving late. Deleting one takes it off the list.
- At the end of the lease the token stops opening the inbox, and nothing is deleted. Nothing about a lease is stored either, so the address is never held back: anybody can be issued it again, even while your lease runs.
- The mail lands, through the catch-all, in the mailbox of the workspace that runs the pool. These calls read that mailbox, and a lease sees only the mail delivered to its own address since the lease began.
These are the same calls the free tool on this site makes, so anything the page can do your code can do. The API is here for the case the page is not: a test suite that wants a fresh address per run.
The address is not the credential
A disposable address is typed into a signup form the moment it is issued. From there it travels in a To: header, through the sender’s logs, and into whatever CRM sits at the other end. If knowing the address were enough to read the mail, the tool would leak every inbox it issued, by design, and to precisely the party the caller was holding at arm’s length.
So creating an inbox returns a second value: a token, oe_inbox_ followed by the lease itself (the address, when it began, when it ends and the extensions spent) and a signature over it. Nothing about the lease is stored on the server, so a lost token cannot be looked up again, and a token cannot be cancelled either: it opens its inbox until the expiry written inside it. Extending the lease hands back a new token with the later expiry.
# 1. Mint one. Only this and extend return a token.curl -s -X POST "$OE/temp-mail/inboxes" -H "Content-Type: application/json" -d '{}' # 2. Keep it, and read with it.export INBOX="Authorization: Bearer oe_inbox_kQ8v…"curl -s "$OE/temp-mail/inboxes/tinb_k7m2q9xw4bdp/messages" -H "$INBOX"Send an oe_live_ or oe_test_ API key to one of these routes and it is refused with 401 missing_inbox_token, the same answer as sending nothing: only a bearer that starts with oe_inbox_ is read here.
The lease, and extending it
An hour, rather than the ten minutes the genre is named after. Ten is enough for a confirmation code and not enough for the other half of what these are used for: a trial that emails you again the next morning, a form filled in twice because the first attempt timed out. ttlMinutes on create asks for something else, from 1 to 1440; a number outside that is refused with a 422 rather than quietly adjusted, because an expiry you did not ask for is one you have already planned around.
POST /temp-mail/inboxes/{id}/extend adds an hour to the expiry, not to now, so extending early does not waste the time you have left. It works 23 times, and the new expiry never passes 24 hours after the inbox was created, so a call on a lease that already reaches that point still succeeds, still spends an extension and buys nothing. extensionsLeft counts only the 23 calls, not the 24 hours, so compare expiresAt with createdAt before offering more time. Once all 23 are spent the call answers 422 extension_limit. Each extension returns a new token with the later expiry, and the old token keeps its old one.
An expired inbox stops authenticating the instant it expires: its token answers 401 inbox_expired. The expiry itself deletes nothing, but every conversation is deleted for good a day after its newest message arrived, whether its lease is still running or not. DELETE /temp-mail/inboxes/{id} moves the messages the inbox shows to the bin of the mailbox that runs the pool, and it does not end the lease.
The ceilings
Creating an inbox is limited to 10 every 10 minutes from one network, and the next one answers 429 temp_inbox_rate_limited with Retry-After. Nothing else on these routes is counted. The other ceilings are the length of a lease, the size of a page and the day a conversation is kept.
| Ceiling | Value | What happens at it |
|---|---|---|
| Lease | 60 minutes, extendable to 24 hours | 422 validation_error / extension_limit after 23 extensions |
| Messages per page | 50 | The list returns 50 at a time and nextCursor reaches the rest. Nothing past 50 is dropped. |
| Inboxes minted | 10 every 10 minutes from one network | 429 temp_inbox_rate_limited with Retry-After. Wait, or keep using an inbox you already hold. |
| Stored body | No ceiling of its own | truncated is always false. |
| Attachment bytes | Not served | The attachments call returns names, types and sizes, and no bytes. |
| Conversation kept | A day after its newest message | An hourly job deletes it for good, whether the lease is still running or not. |
Nothing is stored per lease, so there is nothing to count against: destroying an inbox frees nothing and costs nothing, and the same address can be leased by several callers at once.
What is not here
Not shipped yetFinding out by trying is worse than being told:
- No sending, in any form. A disposable inbox has no connection to send as, and adding one would make an anonymous, unauthenticated endpoint into an open relay.
- No rename. Changing your address means creating a second inbox, and the old token keeps opening the old address until its lease ends.
- No rules, filters, forwarding, webhooks or AI.
spamis a flag on the message and nothing acted on it. Nothing was filed away, and nothing here is summarised or embedded. - No bounces. Mail to a pooled domain that names no live disposable inbox is dropped silently, on purpose: a public address generator attracts dictionary attacks, and writing a delivery report to whatever return path the attack claims would make the pool a source of backscatter.
- No domain on offer means no service. While no disposable domain is on offer,
GET /temp-mail/domainsanswers with an empty list and creating an inbox answers 503not_configured. While the mailbox behind the pool cannot be read, listing, reading and deleting mail and destroying an inbox answer 503not_configuredas well. Inbound delivery to a pooled domain has not been observed end to end on a live domain.
The domains in the pool
Nextmail runs the pool and picks its domains. GET /temp-mail/domains lists them in the order they are offered, and an inbox created without a domain goes on the first one. A domain you add to your own workspace never joins the pool, and nothing in a workspace changes what the pool hands out.
Reserved local-parts (abuse, admin, administrator, dmarc, hostmaster, mailer-daemon, noc, noreply, no-reply, postmaster, security, support and webmaster) can never be issued, so abuse reports and postmaster mail for a pooled domain still reach Nextmail. Any other name on a pooled domain can be issued to anybody who asks, so never hand one out as an address you mean to keep.
Google Workspace