api.email Test Email Flows Without Guesswork
Sign in Start free

Built For Real Product Teams

Ship email features with confidence before your users ever see a broken message

Catch sign-up links, password reset emails, OTP codes, and template regressions in one place. Use your current integration flow, then verify results through a clean inbox API and dashboard.

2 min to first inbox
0 rewrites for existing flows
Public + Private inbox options
CI-ready API assertions

Who It Helps

Made for the teams that ship email-dependent features

You do not need to be an email infrastructure expert. You need clear answers: “Did this message arrive?”, “Does this link work?”, “Is this the right code?”.

QA Engineers

Validate sign-up, reset, and notification flows with deterministic inbox checks in manual and automated tests.

Product Teams

Launch user journeys faster with confidence that onboarding and lifecycle emails behave as intended.

Developers

Keep existing SMTP or provider SDK integrations and add message assertions without rewriting app logic.

How It Works

From “send email” to “assert result” in three steps

Start with a public inbox for quick checks, then switch to private team workspaces when you need longer retention and access controls.

01

Create test inbox

Generate alias on `@free.api.email` or use your private workspace domain.

02

Run your normal flow

Send through your existing app logic: SMTP, Postmark, SendGrid, or Mailgun-style request.

03

Assert expected outcome

Check subject, links, OTP codes, and attachments directly from API or dashboard.

Quickstart Example

Wait up to 30 seconds for a message and validate it in the same test step.

alias="signup-smoke"

# 1) trigger your app flow with: [email protected]

# 2) fetch captured message
curl "https://v1.api.email/free/messages/signup-smoke?wait=30"

# response includes:
# - subject
# - links (magic links)
# - codes (OTP)
# - attachments

Provider-Compatible Endpoints

Keep official SDKs and switch only host/base URL plus API key when running tests against api.email.

Postmark (`postmark`)

import postmark from "postmark";

const client = new postmark.ServerClient(process.env.API_EMAIL_KEY, {
  requestHost: "v1.api.email",
  useHttps: true
});

await client.sendEmail({
  From: "QA <[email protected]>",
  To: "[email protected]",
  Subject: "Verify signup",
  HtmlBody: "<a href='https://app.test/verify?token=123456'>Verify</a>"
});

SendGrid (`@sendgrid/client`)

import sgClient from "@sendgrid/client";

sgClient.setApiKey(process.env.API_EMAIL_KEY);

await sgClient.request({
  method: "POST",
  url: "https://v1.api.email/v3/mail/send",
  body: {
    from: { email: "[email protected]" },
    personalizations: [{ to: [{ email: "[email protected]" }] }],
    subject: "Verify signup",
    content: [{ type: "text/plain", value: "OTP: 123456" }]
  }
});

Mailgun (`mailgun.js`)

import Mailgun from "mailgun.js";
import FormData from "form-data";

const mailgun = new Mailgun(FormData);
const mg = mailgun.client({
  username: "api",
  key: process.env.API_EMAIL_KEY,
  url: "https://v1.api.email"
});

await mg.messages.create("sandbox.api.email", {
  from: "QA <[email protected]>",
  to: ["[email protected]"],
  subject: "Verify signup",
  text: "OTP: 123456"
});

Works With Existing Integrations

Keep your current provider workflow and switch endpoint/base URL only when testing.

Scales With Team Needs

Start free for local QA, upgrade for private domains, API keys, and longer message history.

What You Get

Everything your team needs from each test email

Stop manually opening inboxes and parsing raw email bodies. Every captured message is returned in a format that is ready for QA checks and CI assertions.

Structured Message Data

Read sender, recipients, subject, text/html body, and attachments from one clean response. Your tests can assert business outcomes instead of parsing MIME.

Magic Links + OTP Extraction

Links are extracted automatically, and verification codes (4-8 digits) are available as separate fields for auth-flow automation.

Retention By Plan

Start with short-lived public inboxes for quick checks, then move to private workspaces with longer message history as your QA process grows.

Webhook Reliability + Logs

Webhooks respect retry timing and provide clear delivery logs in the dashboard, including success/error status and response payloads.

FAQ

What product teams usually ask first

Short answers to the practical questions that come up during setup and rollout.

Do we need to rewrite our email integration?

  • No. Keep your existing app logic and message templates.
  • For testing, switch SMTP host or API base URL only.
  • Use the same flow your users rely on in production.

Will it work with our current provider SDK?

  • Yes. Postmark, SendGrid, and Mailgun-style endpoints are supported.
  • Your developers can keep current SDK calls in tests.
  • Switching usually means changing credentials and base URL.

Can we start without creating a paid workspace?

  • Yes. Free public inboxes are available for fast local checks.
  • They are ideal for demos, spikes, and smoke tests.
  • Move to private workspaces when you need longer retention and team access control.

Can this fit into CI and release gates?

  • Yes. Poll inbox API with wait and assert links, OTPs, subjects, and attachments.
  • Webhook retries respect retry timing and reduce flaky notifications.
  • Dashboard logs help debug failed callbacks and test runs quickly.

Plans

Pick the setup that matches your release stage

Every plan supports the same core testing flow. Upgrade when your team needs privacy, retention, and higher collaboration limits.

Free

$0/mo

  • Public inboxes for local checks and quick demos
  • Magic links and OTP extraction for auth testing
  • Fast API reads with wait support
  • Short retention window
Start free

Pro

$39/mo

  • Longer retention for release audits and investigations
  • Custom domains for production-like test scenarios
  • Higher alias and webhook limits for larger teams
  • Billing and workspace controls for scale
Start Pro