Trial
For the first spec or the first send, on the shared domain.
Pricing to be announced
- Inboxes on mail.mailwurf.io
- Short message retention
- One API key
TestingTransactionalAgentic
Give every test its own inbox. Send receipts from your domain and read the replies. Let agents sign in over MCP. One inbox model, one API, one key.
$npm i @mailwurf/e2e @mailwurf/transactional
Your app keeps sending through Resend or SES. The test creates an address, waits for the message and opens the link. Only the recipient changes, so provider, template and DNS are covered too.
const inbox = await mailwurf.createInbox();
await page.fill("[name=email]", inbox.address);
await page.click("text=Sign up");
const mail = await inbox.waitFor({
subject: "Confirm your email",
timeout: 15_000,
});
expect(mail.otp).toMatch(/^\d{6}$/);
await page.goto(mail.links[0]);Tests, apps and agents all work with the same object. Learn it once and use it three ways, with the same key, the same dashboard and the same raw MIME.
Tests create inboxes that expire. Apps and agents register permanent addresses on your domain.
The same endpoints for reading, waiting and sending. A bearer key, nothing else.
The same mailbox, exposed as tools. OAuth for people, not keys in prompts.
STARTTLS on our MX, your DNS for sending. Unknown recipients get a clean 550.
Every call under /v1 takes your key as a bearer token. The TypeScript clients are thin fetch wrappers, so anything that speaks HTTP works the same way.
import { createMailwurf } from "@mailwurf/e2e";
const mailwurf = createMailwurf(process.env.MAILWURF_API_KEY!);
const inbox = await mailwurf.createInbox();
const mail = await inbox.waitFor({ subject: "Confirm" });
console.log(mail.otp, mail.links[0]);Mailwurf is in private access while we finish billing. Tell us what you want to test, send or automate and we’ll tell you which plan fits.
For the first spec or the first send, on the shared domain.
Pricing to be announced
For suites on every pull request and apps that send daily.
Pricing to be announced
For teams that need their own MX name and isolation.
Pricing to be announced
Those are SMTP sinks you point your app at, so the test never exercises Resend, SES, your templates or your DNS. Mailwurf receives on real MX, so only the recipient changes and the rest of the path stays production.
No. The app keeps its provider, credentials and templates. The test sets the recipient to an inbox address it created a moment earlier.
Yes. Add it as a sending domain in the dashboard and publish its DNS records. Your existing mail provider keeps receiving for that domain.
Every sending address is a Mailwurf inbox. Replies arrive there and can be read through the API, the dashboard or an agent.
Over OAuth, as a user of your organization. Access tokens last an hour and are scoped to mailbox tools. API keys never go into a prompt.
Pricing isn’t public yet. Write to us with what you want to test, send or automate and we’ll tell you which plan fits.
Tell us what you’re building and we set up an organization and a key. One call later, mail is the boring part again.
