Real inboxes for end-to-end email tests
Your test signs up with a fresh address, waits for the email and reads the code or link. FutureMail extracts both for you, so a test step or a shell script gets the OTP in one call instead of a sleep and a regex.
Works with a domain you already own. One price for your whole team.
- t
test@loopcart.dev
Base address: each run uses test+<run-id>@
- s
signup@loopcart.dev
Target for new-account flow tests
- r
reset@loopcart.dev
Password reset tests
- m
magic@loopcart.dev
Magic-link sign-in tests
- c
ci@loopcart.dev
Catch-all mailbox for anything else CI receives
Unlimited addresses, catch-all and plus-addressing included.
Why FutureMail works for QA and testing
A fresh address every run
Plus-addressing always works, so test+run-4821@ is a brand new address with no setup. Filter wait calls by that recipient and parallel jobs never read each other's mail.
No sleeps, no polling
GET /v1/emails/wait holds the request until a matching email arrives, for up to 5 minutes, and returns 204 on timeout so the test fails cleanly instead of hanging.
Codes and links already parsed
Every waited email comes back with extracted.otp and extracted.links, so asserting on a one-time code or following a magic link takes a single line.
One line in a CI job
Install the CLI with npm i -g futuremail, store FUTUREMAIL_API_KEY as a CI secret, and run CODE=$(fm wait --from yourapp.com --otp) in the step that needs the code.
Simulate bounces and complaints
Send to bounced@, complained@ or delayed@test.futuremail.dev, optionally with a +label, to check how your app handles failures. Test sends don't count toward your limits.
A catch-all for everything else
Set a catch-all on your test domain and any address your fixtures invent still lands in a mailbox you can inspect in the web inbox or over the API.
Agent-ready
A password reset test in CI
The test requests a reset for test+RUN_ID@ your domain, then calls wait_for_email filtered by recipient and a since timestamp. It opens the link from extracted.links, sets a new password and asserts that sign-in works. A coding agent in Cursor can run the same check over MCP while it builds the feature.
- Confirm a signup OTP arrives and is accepted
- Follow a magic link and assert the user is signed in
- Check that your app handles a simulated hard bounce correctly
# give an agent its own inbox and a key scoped to it $ fm agents create "Test" \ --address test@loopcart.dev ✓ Created agent Test address test@loopcart.dev scopes send, read # connect Claude, Cursor or any MCP client url https://api.futuremail.dev/mcp header Authorization: Bearer fm_live_…
Set up in an afternoon
- 1
Subscribe
Create an account and start Pro for $20/month. Cancel anytime.
- 2
Connect your domain
Copy the DNS records we generate into your registrar. FutureMail checks them live and tells you when you're set.
- 3
Create your addresses
Add the addresses you need, point them at shared or individual mailboxes, and invite your team.
- 50,000 recipients a month
- Unlimited custom domains
- Unlimited addresses & aliases
- Agent inboxes with scoped API keys
- REST API, CLI & remote MCP server
- Webhooks, templates & scheduled send
- Open & click tracking
- Team roles & audit log
Paid only, cancel anytime. New accounts can send to up to 1,000 recipients a day for their first 14 days; receiving is never limited. Pricing details
Common questions
How do I test OTP emails in CI?
Sign up with a unique plus-address on your FutureMail domain, then call GET /v1/emails/wait (or fm wait --otp) filtered to that address. The response includes extracted.otp, ready to type into the form.
Does my app have to send through FutureMail?
No. Your app can send with any provider; FutureMail only needs to receive at your test domain. If it does send through FutureMail, you also get delivery events and the simulated outcome addresses.
Do test emails count toward my monthly limit?
Sends to @test.futuremail.dev addresses don't, and neither does mail you receive. Email your app sends through FutureMail to a real address counts as normal sending.
Can parallel test jobs share one mailbox?
Yes. Give each job its own plus-address, such as test+job7@, and filter wait calls by recipient and a since timestamp so each job only sees its own email.
How much does FutureMail cost? Is there a free plan?
FutureMail is paid-only: Pro is $20/month and includes 50,000 recipients a month, unlimited domains and addresses, agent inboxes, the API and MCP server. There is no free tier or trial. Limits are hard caps, so there are never overage charges and no per-seat pricing. Charged in USD; Stripe may show your local currency and add applicable tax. Need more volume? Email support@futuremail.dev.
More answers in the general FAQ.
Related use cases
SaaS products
Send receipts, password resets and sign-in codes from your SaaS via REST or a Resend-compatible API, and get a real inbox so customer replies reach your team.
AI agents
Give each AI agent its own email address and inbox on your domain, with a scoped API key, OTP extraction, REST, the fm CLI and a remote MCP server.
Startups
Startup email on your own domain for $20/month: founders@ and hiring@ in a fast shared inbox now, then product email and agent inboxes on the same account.