وارد wārid — arriving; inbound.
Your tests send it.
Waridex catches it.
Disposable inboxes and authenticators for automated tests. The message lands, the code is pulled out, your assertion runs.
Arriving nowextracted
curl …/v1/inboxes/$INBOX_ID/wait -d extract=otpReceived in 1.9sWorks with the test stack you already runWorks with
- xUnit
- NUnit
- Playwright
- Cypress
- GitHub Actions
- Azure Pipelines
- any HTTP client
Three calls, one straight line from trigger to assert.
Create an inbox
One request returns an inbox with a domain of its own. Tag it with the run, so one call deletes it and its mail when the run ends.
POST /v1/inboxes → signup-k3f9x2.waridex.emailTrigger your flow
Sign up, request the reset, place the order, with any address under the domain. Your app sends mail like it always does.
user1@signup-k3f9x2.waridex.emailWait and assert
One call holds until the message lands, then returns the message's index fields with the code or link already extracted.
GET …/wait?extract=otp → 482913
Everything your app sends, inbound.
Email and authenticator codes come through one API and one dashboard, with the code already pulled out.
A fresh inbox per test. Wait for the message, get the code and every link.
- Codes and links extracted on arrival
- Search every inbox by subject and sender
- Upload .eml files to inspect saved mail
Authenticator
A virtual authenticator app for MFA flows. Paste the setup key, read the code.
- TOTP with SHA-1, SHA-256 or SHA-512
- Waits for a fresh window near expiry
- A log of every code served
Built for the assert, not the inbox.
- Wait, don't poll
- One call holds until the message arrives or your timeout passes, and returns it with the code or link already extracted.
- An inbox per test
- Parallel runs never collide. Tag a run's inboxes and delete them, with their mail, in one call when it ends.
- Extraction you can explain
- Codes come from patterns you pin per sender and from deterministic scoring. When nothing fits, the error lists every candidate and why it lost.
- Every layer of the message
- The text and HTML on request, and the raw message with its headers and attachments as a download.
- Keys scoped to the job
- Give CI exactly the permissions it needs, per workspace.
- Every error has a page
- A failure answers with a problem type that links to its own page here, such as wait.timeout.
Shared inboxes and SMTP catchers were never built for CI.
| Per month | Shared Gmail account | Self-hosted catcher | Waridex |
|---|---|---|---|
| Parallel test runs | Collide on one address | Work, if you filter by address | One inbox per run |
| Waiting for the message | Poll IMAP, hope | Poll its API | One long-poll call |
| Getting the code out | Regex the HTML | Regex the HTML | Already extracted |
| Runs from CI | App passwords, 2FA prompts | Expose a port, keep it patched | HTTPS and an API key |
| Who maintains it | Whoever set it up | Your team | Us |
Free to start. Priced by emails, not by seats.
Free
For side projects and trying it out.
$0 per workspace per month
- 100 emails per month
- 1 day of retention
- 2 pinned patterns
- Unlimited members and inboxes
Team
For teams running email tests in CI.
$29 per workspace per month
- 5,000 emails per month
- 30 days of retention
- Unlimited pinned patterns
- Unlimited members and inboxes
Business
For larger QA teams and longer retention.
$79 per workspace per month
- 25,000 emails per month
- 90 days of retention
- Unlimited pinned patterns
- Unlimited members and inboxes
Questions engineers ask first.
Something missing? Email us and a human who wrote the code will answer.
Does my app need any changes?
How fast do messages show up?
What do you do with the raw email?
Can I use my own domain for inboxes?
Is there a rate limit?
Your first inbox is one call away.
Create an account, copy your key, and receive a test email in the time it takes to read this sentence.