Catch broken emails before your users do.
1 mailbox + 5,000 emails/mo included. Fetch the latest message in one API call.
Unlimited tags included on every plan.
Try it
Email in → JSON out
Three steps to reliable inbox tests.
qa+signup@in.plop.emailGet it in Settings → API keys.
GET /v1/messages/latest?mailbox=qa&tag=signup
Authorization: Bearer $PLOP_API_KEY{
"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.
A user requests a code
Your app sends the real login email, just like production.
Plop catches it instantly
It lands in a dedicated test inbox with no setup.
Plop pulls the code
Codes, links, and key fields are pulled out for you.
Clean fields are ready
Structured data is ready to drop into your test.
Your test uses the code
No inbox hunting. No flaky waiting.
Flow verified
Stable auth tests. Confident releases.
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.
Messages API
Use the REST API to list inboxes, filter by mailbox + tag, and pull the latest message for E2E tests.
/v1/messagesList message summaries with filters.
/v1/messages/latestFetch the latest matching message with full content.
/v1/messages/:idRetrieve a specific message by id.
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.
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.
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.
Billed yearly ($468 / year)
or $49 billed monthly
- Unlimited email addresses
- Unlimited tags
- Unlimited emails
- Shared domain
Enterprise
Coming soonCustom domains and advanced routing.
- Custom subdomains
- Unlimited mailboxes
- Priority support
- Coming soon
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.