BetaLimited spots available for early access

Test email flows before your users do.

Turn transactional emails into part of your test suite. Capture real messages, extract values, click links, and assert results - all in CI.

No mocks. No Gmail hacks. Just real emails, tested end-to-end.

Sign-up verification
Password resets
Magic links
CI-ready SDK
Seamlessly integrates with
password-reset.spec.ts
$ npx cypress run --spec password-reset.cy.ts
────────────────────────────────────────────────────────────────────────────────
Running: password-reset.cy.ts (1 of 1)
🔐 Password Reset Flow
------------------------
📨 [otpdock] Creating temporary inbox... ✅ inbox: test-abc123@otpdock.com
📤 Navigating to /forgot-password ✅ page loaded
🖊️ Typing email and submitting form ✅ submitted test-abc123@otpdock.com
⏳ Waiting for OTP...
⏳ Waiting for OTP... ✅ received in 1.2s
🔍 Extracted OTP: 🔢 784219
🧪 Filling in OTP and new password ✅ input accepted
🚀 Submitting password reset ✅ success message visible
✔ All assertions passed! 🎉
────────────────────────────────────────────────────────────────────────────────
✔ 1 spec passed (3.42s)

Test Every Email Flow

From simple OTPs to complex multi-step verification flows, test it all with real emails.

otp.spec.ts
1import { test, expect } from '@playwright/test'
2import OtpDock from '@otpdock/client'
3
4test('verify email with OTP', async ({ page }) => {
5  const client = new OtpDock()
6  const inbox = await client.createInbox()
7
8  // Start verification flow
9  await page.goto('/verify-email')
10  await page.fill('input[type="email"]', inbox.email)
11  await page.click('button[type="submit"]')
12
13  // Wait for and extract OTP
14  const otp = await inbox.waitForOTP()
15  
16  // Use OTP to complete verification
17  await page.fill('input[name="code"]', otp)
18  await page.click('button[type="submit"]')
19
20  // Verify success
21  await expect(page.getByText('Email verified')).toBeVisible()
22})

How It Works

Test your complete email verification flow with the same reliability as your production environment

Write Your Test

Write your E2E tests as you normally would. No need to change your testing framework or setup mock servers.

password-reset.spec.ts
1import { test, expect } from '@playwright/test'
2import OtpDock from '@otpdock/client'
3
4const client = new OtpDock({
5  apiKey: 'your-api-key',
6})
7
8test('user can reset password', async ({ page }) => {
9  // Create a test inbox for capturing the reset email
10  const inbox = await client.createInbox()
11
12  // Start password reset flow
13  await page.goto('/forgot-password')
14  await page.fill('input[type="email"]', inbox.email)
15  await page.click('button[type="submit"]')
16
17  // Wait for and extract OTP from email
18  const otp = await inbox.waitForOTP()
19
20  // Use the OTP in your test
21  await page.fill('input[name="code"]', otp)
22  await page.click('button[type="submit"]')
23})

Run Your Test

Your test creates a temporary inbox and waits for the verification email to arrive.

test runner
$ npx playwright test password-reset.spec.ts Running 1 test using 1 worker password-reset.spec.ts: ⠋ user can reset password ├── Creating test inbox... ✓ test-123@otpdock.com ├── Navigating to /forgot-password ✓ ├── Submitting reset request ✓ └── Waiting for OTP...

Real Email Inbox

Each test gets a real, temporary inbox that can receive actual verification emails, magic links, and OTPs.

app.otpdock.com
OTPDock
Latest Emails
Live
test-123.acme.otpdock.comResetJust now
noreply@example.com
123456
0.8s
test-abc.acme.otpdock.comMagic Link2m ago
auth@company.io
Pattern not found
test-xyz.acme.otpdock.comReset5m ago
verify@service.net
987654
1.2s

Test Completes

The OTP is automatically extracted and used in your test, completing the end-to-end verification flow.

test runner
$ npx playwright test password-reset.spec.ts Running 1 test using 1 worker password-reset.spec.ts: ✓ user can reset password ├── Creating test inbox... ✓ ├── Navigating to /forgot-password ✓ ├── Submitting reset request ✓ ├── Waiting for OTP... ✓ received in 1.2s └── Verifying reset success ✓ 1 test passed (2.4s)

Simple, Transparent Pricing

Start for free, upgrade when you need more. No credit card required.

Lock in lifetime access with guaranteed spot in next wave
Early Bird Pricing

Lurker

$0/month

Free forever. Perfect for individual projects and trying out OTPDock.

Get StartedNo credit card required
100 email captures per month
Dynamic inboxes
24-hour email retention
Public documentation
Community support
Most Popular

Solo

$49one-time
First 100 spots
Regular price: $9/month
Guaranteed spot in next wave (5 days)

For developers working on multiple projects.

1,000 email captures per month
Reserved subdomain
Up to 5 static inboxes
7-day email retention
Email support

Startup

$99one-time
First 10 spots
Regular price: $49/month
Guaranteed spot in next wave (1 days)

For growing teams that need more control.

5,000 email captures per month
Custom domain support
Up to 25 static inboxes
Up to 5 team members
30-day email retention
Priority support

All prices exclude tax. Tax will be calculated at checkout.

Need higher limits? Contact us

Frequently Asked Questions

Everything you need to know about OTPDock and how it can help your testing workflow

The lifetime deal gives you permanent access to OTPDock at a one-time price, instead of a recurring subscription. You'll get all the features of your chosen plan (Solo or Startup) forever, including future updates and improvements. This is our way of rewarding early adopters.

When you purchase a lifetime deal, you're guaranteed a spot in the next wave of access. The waves open every 7 days for Solo and 10 days for Startup plans. Once your wave opens, you'll have immediate access to start using OTPDock.

Once all lifetime spots are filled (100 for Solo, 10 for Startup), the offer will be permanently closed and only regular subscription plans will be available. The spots are limited to ensure we can provide the best possible service to our early adopters.

OTPDock seamlessly integrates with your existing test framework through our SDK. Simply install our package, add a few lines of code, and you're ready to capture and verify OTPs in your tests.

We support all major testing frameworks including Playwright, Cypress, Selenium, and more. Our framework-agnostic approach means you can use OTPDock with any testing setup.

During the beta period, we offer generous limits that should cover most testing needs. We'll work with you to understand your requirements and ensure you have the capacity you need.

Security is our top priority. We use end-to-end encryption, temporary OTP storage with automatic expiration, and follow industry best practices to ensure your testing environment remains secure.

Yes! OTPDock is designed to work seamlessly in CI/CD environments. We provide dedicated CI/CD integration guides and tools to help you automate your OTP testing workflow.

Beta users get priority support with direct access to our engineering team. We're committed to helping you succeed and will work closely with you to resolve any issues and gather feedback.

Get Started Today

Choose the plan that works best for you. Start testing your OTP flows with confidence.

Instant Setup

Get started in minutes with our simple integration process

Framework Agnostic

Works with any testing framework and tech stack

Priority Support

Direct access to our engineering team during beta