Use case

An email testing API that fits in one line of your test

Every app that sends email needs to test it: did the signup confirmation arrive, does the OTP work, does the password-reset link point at the right environment. Running MailHog catches only your own SMTP; commercial inbox APIs want an account, an SDK, and a per-inbox price. mxu.io is the utility version: a real inbox at anything@mxu.io, created inside the test itself.

The pattern

Invent an inbox name per test run, trigger your flow, then either long-poll /wait or grab /latest. Every received message arrives with extracted.otp, extracted.links, and extracted.verify_link already parsed — deterministically, with parsers, not AI.

# 1. mint an inbox (or just use a fresh name — your account owns it)
curl -X POST https://api.musicsupplies.com/functions/v1/mxu-api/inboxes \
  -H "Authorization: Bearer mxu_live_KEY" -d '{"name": "run-8f3k2"}'

# 2. trigger your signup flow against run-8f3k2@mxu.io ...

# 3. block until the mail lands (up to 55s), read the code
curl "https://api.musicsupplies.com/functions/v1/mxu-api/wait?inbox=run-8f3k2&timeout=50" \
  -H "Authorization: Bearer mxu_live_KEY"
# → messages[0].extracted.otp = "482913"

Playwright

const MXU = "https://api.musicsupplies.com/functions/v1/mxu-api";
const KEY = process.env.MXU_KEY;

test("signup sends a working OTP", async ({ page }) => {
  const name = `run-${Date.now().toString(36)}`;
  await fetch(`${MXU}/inboxes`, { method: "POST",
    headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json" },
    body: JSON.stringify({ name }) });

  await page.goto("/signup");
  await page.fill("#email", `${name}@mxu.io`);
  await page.click("#submit");

  const res = await fetch(`${MXU}/wait?inbox=${name}&timeout=50`,
    { headers: { Authorization: `Bearer ${KEY}` } });
  const { messages } = await res.json();
  const otp = messages[0].extracted.otp;

  await page.fill("#otp", otp);
  await page.click("#verify");
  await expect(page).toHaveURL("/welcome");
});

Why it works well in CI

Pricing

The free plan (1 inbox, 200 inbound/month, receive-only) covers trying it out; builder at $9/month covers a busy test suite with 10 inboxes, 5,000 inbound messages, and 30-day retention. Flat pricing — no per-inbox metering. Full pricing →

Create a free inbox