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
An email-receiving API
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
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/[email protected] { "address": "[email protected]", "count": 1, "emails": [ { "id": "01hf5k9x2e...", "sender": "[email protected]", "subject": "Confirm your account", "received_at": 1716729384213, "expires_at": 1716732984213 } ] }
01
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
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
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
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.
import os, time, requests API = "https://api.mailfade.dev" INBOX = "[email protected]" 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
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
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
0Dev
One developer, regular CI runs.
Monthly
$19
≈ 20,000 sats
Team
Shared test environments and agent fleets.
Monthly
$49
≈ 50,000 sats
Scale
Production agent traffic and white-label.
Monthly
Custom
Built and operated by one person, on a budget that scales with the bill, not with the round.