"use_case": "For test suites"
Email testing in your CI/CD pipeline
Sign-up codes, password resets, magic links and receipts, asserted on real email in every run. A unique inbox per test keeps parallel runs apart, and long-polling replaces sleep().
Signup tests*-[email protected]
Emails
~/acme❯npx vitest run signup
✓creates an account212ms
receives the OTP847291
2 passedin 1.4s
Who it's for
- QA engineers automating sign-up, login and password reset flows
- Teams running Playwright, Cypress, Jest, Vitest or pytest in CI
- Developers who want to assert on transactional email before it ships
- Anyone replacing a shared Gmail account and a regex
The job
Your app sends a real email. The test has to receive it, pull out the code or link, and carry on, in seconds, in parallel, without flaky sleeps or shared inboxes.
- 01Create a project. You get an address suffix and an API key for CI.
- 02Mint an address per test. inboxes.create() returns a unique address and its createdAt.
- 03Trigger the email. Sign up, reset a password or check out with that address.
- 04Wait and assert. waitForOtp() or waitFor() returns as soon as the email lands.
A sign-up test
Waiting from inbox.createdAt means a code from an earlier run can never satisfy this one.
import { ReceiverClient } from "@receiverdotemail/sdk";
const receiver = new ReceiverClient(); // reads RECEIVER_API_KEY
test("sign-up sends a working code", async () => {
const inbox = await receiver.inboxes.create({ prefix: "signup" });
await app.signUp(inbox.address);
// Long-polls until the email lands (throws on timeout)
const otp = await receiver.emails.waitForOtp({
recipient: inbox.address,
since: inbox.createdAt,
timeout: 60,
});
await app.verify(otp.code); // "847291"
});Fast
Mail is parsed and queryable in under two seconds. Long-polling returns the moment it lands.
Parallel-safe
Every prefix is an inbox, so each test, worker or branch gets its own address with no setup.
Any runner
GitHub Actions, GitLab CI, CircleCI, Jenkins: set RECEIVER_API_KEY as a secret and go.