Skip to content

An email-receiving API

Throwaway inboxes
that speak HTTP.

MailFade gives test harnesses, CI pipelines, and software agents a real catch-all inbox they can read over HTTP. Send mail to any address at mailfade.dev; read it back with one request. There is nothing to install and no account to make.

A · request

One GET, one inbox.

No key is needed for the free tier. Pick any local-part — it becomes a live inbox the instant the first mail arrives.

$ curl https://api.mailfade.dev/inbox/anything@mailfade.dev
{
  "address": "anything@mailfade.dev",
  "count": 1,
  "emails": [
    {
      "id": "01hf5k9x2e...",
      "sender": "verify@acme.com",
      "subject": "Confirm your account",
      "received_at": 1716729384213,
      "expires_at": 1716732984213
    }
  ]
}

01

What it is

MailFade is a catch-all inbox at mailfade.dev with an HTTP API in front of it. Anything sent to any address at the domain is stored for a short while, indexed by the full address, and made readable with a single GET. There is no UI to log into, no SMTP server to run, and no SDK to learn — the API surface is five endpoints.

02

What it is for

Signup and password-reset tests that need to receive real mail. Snapshot tests against the HTML of transactional templates. Software agents that need a private mailbox they can poll and a way to replay any message into a harness later. Anything where the alternative today is shelling out for a heavy QA suite, or hand-rolling the same polling helper one more time.

03

What it isn't

It is not a permanent mailbox you read in a UI. Bodies are deleted on a short clock by design. It is not a way to sign up to unrelated services — most signup forms block disposable domains, including this one, and rightly so.

B · poll

Wait for a message.
Assert on it.

Five endpoints, no SDK: list an inbox, fetch a message, download an attachment, stream the raw RFC822, mint a key. You will spend more time naming the test than wiring the HTTP.

API reference →

import os, time, requests

API   = "https://api.mailfade.dev"
INBOX = "signup-99@mailfade.dev"
KEY   = os.environ.get("MAILFADE_KEY")
HEAD  = {"Authorization": f"Bearer {KEY}"} if KEY else {}

def wait_for_email(timeout=30):
    deadline = time.time() + timeout
    while time.time() < deadline:
        r = requests.get(f"{API}/inbox/{INBOX}", headers=HEAD).json()
        if r["count"]:
            return r["emails"][0]
        time.sleep(1)
    raise AssertionError("no mail")

msg = wait_for_email()
full = requests.get(f"{API}/message/{msg['id']}", headers=HEAD).json()
assert "Confirm" in full["subject"]
import { test, expect, request as pwRequest } from "@playwright/test";

test("user can verify their email", async ({ page }) => {
  const inbox = `pw-${Date.now()}@mailfade.dev`;
  const api = await pwRequest.newContext({ baseURL: "https://api.mailfade.dev" });

  await page.goto("/signup");
  await page.getByLabel("Email").fill(inbox);
  await page.getByRole("button", { name: "Sign up" }).click();

  await expect.poll(async () => {
    const r = await api.get(`/inbox/${inbox}`);
    return (await r.json()).count;
  }, { timeout: 30_000 }).toBeGreaterThan(0);
});

C · in a real test

Fits whatever runner you already have.

Plain HTTP slots into Playwright, Cypress, pytest, Jest, RSpec — any runner that can call fetch. Drop-in recipes for the common ones are in the docs.

D · price

A small monthly cost.
No seats.

Pay monthly by card, or one-time over Lightning. Either rail issues the same key. There is no per-user fee, no annual contract, no quote-only plan for the first three tiers.

Free

For one-off scripts and a single CI job.

Monthly

Free

0
  • · 100 requests per day, per IP
  • · Any address at mailfade.dev
  • · One-hour retention
  • · Plain-text body only
  • · No key required

Dev

One developer, regular CI runs.

Monthly

$19

≈ 20,000 sats

  • · 50,000 requests per month
  • · Seven-day retention
  • · HTML body and attachments
  • · Raw RFC822 download
  • · Card or Lightning

Team

Shared test environments and agent fleets.

Monthly

$49

≈ 50,000 sats

  • · 500,000 requests per month
  • · Thirty-day retention
  • · Three custom domains
  • · Webhook callback on delivery
  • · Priority email support

Scale

Production agent traffic and white-label.

Monthly

Custom

  • · Five million requests per month and up
  • · Ninety-day retention
  • · Unlimited verified domains
  • · Dedicated subdomain, signed SLA
  • · Annual and volume pricing

Built and operated by one person, on a budget that scales with the bill, not with the round.

Read the quickstart / Write to support