One POST gives you prefix@devmailr.app. Email lands over WebSocket in under 500 ms, your tests assert on it, and the inbox deletes itself. Nothing to clean up. Ever.
No credit card · Free tier forever · Inboxes self-destruct
$ curl -s -X POST https://api.devmailr.app/api/mailboxes \
-H "Authorization: Bearer $DMK_KEY"
{
"address": "ci-run-42@devmailr.app",
"expiresAt": "2026-06-12T09:14:07Z"
}
$ npm test # triggers your signup email
✓ email received (312ms) — "Confirm your account"
$ curl -s https://api.devmailr.app/api/mailboxes/ci-run-42/emails
[ { "subject": "Confirm your account", … } ]
# inbox expires at 09:14 UTC — nothing to tear down
$
The problem
Every signup flow you test leaves a mess somewhere. Devmailr gives each test run its own address — and takes out the trash for you.
Without devmailr
With devmailr
Capabilities
Email is pushed to your dashboard and your sockets the instant SES hands it over. No refresh button, no retry loops — your assertion runs before the spinner would have finished.
email:receivedci-run-42@devmailr.app312ms
email:receivedqa-env@devmailr.app288ms
webhook:deliveredPOST https://hooks.yourapp.dev200 OK
Inboxes vanish on schedule — 24 hours on Free, 7 days on Indie, never on Pro. The cleanup script you keep meaning to write is now a product feature.
Create inboxes, list emails, and fetch full content from any script. Keys are SHA-256 hashed and scoped to read, crud, or crud_webhooks.
A signed POST hits your endpoint the moment an email arrives. Verify the signature, trust the payload, skip the polling loop.
Name inboxes after the thing they test. Readable addresses beat random hashes in every CI log you will ever grep.
Pull invoices, exports, and generated PDFs straight from the API or dashboard on Indie and Pro.
The workflow
No browser automation, no IMAP credentials in your secrets store. Just HTTP.
POST /mailboxes from your test setup. You get an address back in one round-trip.
Run the suite. Your app sends its signup, reset, or invoice email to the new address.
expect() on subject, body, and links. The inbox expires on its own afterwards.
1// email.spec.js — runs on every push2const res = await fetch('https://api.devmailr.app/api/mailboxes', {3 method: 'POST',4 headers: { Authorization: `Bearer ${process.env.DMK_KEY}` },5})6const { address } = await res.json() // ci-a1b2c3@devmailr.app7 8await signUp({ email: address })9 10const email = await waitForEmail(address) // ~300ms11expect(email.subject).toBe('Confirm your account')12expect(email.links[0]).toContain('/verify?token=')Pricing
Three plans, no seats, no usage meters. The price on the card is the price on the invoice.
Kick the tires on a side project.
Enough inboxes for a full test matrix.
For teams running CI around the clock.
Prices in EUR · Cancel anytime · Free needs no credit card · Expired inboxes are deleted permanently, along with their emails
FAQ
Still unsure? The Free tier is the fastest answer — spin up an inbox and see for yourself.
Catches email from anywhere in your stack
Developers
We wire up a new Devmailr inbox in our Jest fixtures and never tear it down — the 7-day expiry does it for us. Cleanest email testing setup I have used.
Jamie K.
Backend Engineer · payments startup
The HMAC-signed webhooks are the killer feature. Our Slack bot posts the second a staging email lands — zero polling, and we can verify every payload.
Sofia R.
DevOps Engineer · e-commerce platform
Finally a Mailinator alternative with a proper REST API. Naming inboxes qa-checkout@ and qa-onboarding@ instead of random hashes pays for Indie by itself.
Marcus C.
Full-stack Developer · indie SaaS
One request from now, you have prefix@devmailr.app catching email. It will be gone before your next standup.
No credit card · First inbox in under a minute · Deletes itself when you're done