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.
Built for test automation
Every message is scanned the moment it arrives — codes, links, and auth verdicts come back as structured fields. Wait for mail instead of polling it, stream it without hosting a webhook, and filter it server-side.
Each email is scanned the moment it arrives. The verification code and the primary CTA link come back as fields — skip the body-parsing regex in your test.
Hold one request open until a matching email lands — up to 90s. Replaces thirty list-polls and the rate-limit cost that comes with them.
SES's auth verdicts ride along on every message, so you can assert your real send path passes — or catch why it landed in spam.
Pass your own pattern and get capture group one back in matches — for the one token the extractor can't guess. Runs in JS, ReDoS-guarded.
Server-Sent Events push each email the instant it lands. Realtime mail from CI behind a NAT — no public endpoint to host or verify.
Filter server-side by sender, subject, body text, time window, unread, or whether a code was found. The body is searched even though the list omits it.
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 agencies and teams running CI around the clock.
*Fair use policy — generous soft cap, raised on request. See Terms.
Prices in EUR · Cancel anytime · Free needs no credit card · Free & Indie inboxes expire; Pro keeps inboxes with 30-day email retention
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