Catch broken emails before your users do.

1 mailbox + 5,000 emails/mo included. Fetch the latest message in one API call.

Starter includes 1 mailbox5,000 emails/moFrom $4.99/mo billed yearly

Unlimited tags included on every plan.

Try it

Email in → JSON out

Three steps to reliable inbox tests.

API-ready
1Create a user with this email
qa+signup@in.plop.email
2Latest message
Confirm your email
hello@acme.co · Verification code: 482913.
3Fetch with your API token

Get it in Settings → API keys.

Request
GET /v1/messages/latest?mailbox=qa&tag=signup Authorization: Bearer $PLOP_API_KEY
Response
{ "data": { "id": "7d19c3e2-5e2a-4c83-8e41-5201f97b7e5e", "from": "hello@acme.co", "to": "qa+signup@in.plop.email", "subject": "Confirm your email", "receivedAt": "2025-12-25T10:12:31Z" } }

How it works

From email to confidence in seconds.

01/06

A user requests a code

Your app sends the real login email, just like production.

02/06

Plop catches it instantly

It lands in a dedicated test inbox with no setup.

03/06

Plop pulls the code

Codes, links, and key fields are pulled out for you.

04/06

Clean fields are ready

Structured data is ready to drop into your test.

05/06

Your test uses the code

No inbox hunting. No flaky waiting.

06/06

Flow verified

Stable auth tests. Confident releases.

acme.com/loginLog inEmailalex@acme.comPassword••••••••••Send codeqa+login@in.plop.emaillistening...📬Plop InboxLIVEAno-reply@acme.comYour login codeHi Alex, your login code is: 483920...NEWjust nowsupport@stripe.comYour invoice is readynoreply@github.comSecurity alertqa+login@in.plop.email⚡ EMAIL CAPTUREDemail previewFrom: no-reply@acme.comSubject: Your login codeHi Alex,Your login code is:483920Expires in 10 minutes.Best,The Acme Teamextracted fields{"code":"483920","expires":"10 min","link":"acme.com/verify","recipient":"qa+login@in.plop.email"}⟳ EXTRACTING...structured fields12345678910111213{ "emailId":"email_0123", "from":"Acme", "subject":"Your login code", "received":"Just now", "inbox":"QA", "code":"483920", "link":"acme.com/verify", "expires":"10 min" "recipient":"qa+login@in.plop.email"}✓ READY TO USElogin-flow.ts1234567891011121314import { plop } from"plop.email"constinbox=plop.inbox("qa")flow("login flow",async() => {// trigger login emailawaitpage.login("test@plop.email")constcode=awaitinbox.latest("login")awaitpage.enterCode(code)// user lands on dashboard})↑ DROP CODE INTO TESTTerminal$ npm testRunning tests...verify login flow(1.2s)Test Suites: 1 passed, 1 totalTests: 1 passed, 1 totalDone in 2.3s✓ SHIP IT

Mailboxes + tags

Route flows with mailbox+tag addresses like qa+login@in.plop.email.

Messages API

List, filter, and fetch the latest message for E2E polling.

Scoped API keys

Use api.full, email.full, or mailbox-scoped keys.

Dashboard + filters

Manage mailboxes and browse inbox history in the app.

Docs at a glance

Messages API

Use the REST API to list inboxes, filter by mailbox + tag, and pull the latest message for E2E tests.

GET/v1/messages

List message summaries with filters.

GET/v1/messages/latest

Fetch the latest matching message with full content.

GET/v1/messages/:id

Retrieve a specific message by id.

Example request
curl -H "Authorization: Bearer <API_KEY>" \
  "https://api.plop.email/v1/messages/latest?mailbox=qa&tag=login"

Scopes

Choose the narrowest scope for each key. Mailbox-scoped keys must match the mailbox filter.

api.fullemail.fullemail.mailbox

Drop into your test suite.

Wait for an email, extract fields, assert results.

// Fetch the latest matching email
cy.request({
  method: 'GET',
  url: 'https://api.plop.email/v1/messages/latest?mailbox=qa&tag=login',
  headers: { Authorization: 'Bearer <API_KEY>' },
}).then(({ body }) => {
  const otp = body.data.textContent?.match(/\b\d{6}\b/)?.[0]
  expect(otp).to.match(/\b\d{6}\b/)
  cy.get('[data-testid="otp-input"]').type(otp)
})

Security

Secure by default.

Every mailbox is protected with explicit auth, scoped access, and predictable routing rules.

Private inboxes

Mailboxes live inside your team and require an API key.

Scoped API keys

Grant full access or lock a key to one mailbox.

Strict routing

Unknown mailboxes are rejected and never stored.

Pricing that scales with your inboxes.

Start lightweight, then unlock unlimited mailboxes as you grow.

Starter

One inbox with unlimited tags.

$4.99/mo

Billed yearly ($59.88 / year)

or $6.99 billed monthly

  • 1 email address
  • Unlimited tags
  • 5,000 emails / month
  • Shared domain

Pro

Unlimited mailboxes for busy teams.

$39/mo

Billed yearly ($468 / year)

or $49 billed monthly

  • Unlimited email addresses
  • Unlimited tags
  • Unlimited emails
  • Shared domain

Enterprise

Coming soon

Custom domains and advanced routing.

Contact us
  • Custom subdomains
  • Unlimited mailboxes
  • Priority support
  • Coming soon
All plans include unlimited tags and API access. Taxes may apply.

Stay in the loop

Product updates, inbox playbooks, and release notes.

One email per month. No spam. Unsubscribe whenever you want.

Join QA and product teams using plop.email.