Email testing API

Test the emails
your users depend on

Your test suite checks everything except the email that unlocks the account. Give each test a real inbox, wait for the message, and get the OTP code or verification link back as a field.

How it works

Three calls, no sleeps

  1. Create an inbox with POST /inboxes. You get a fresh address that can receive mail straight away.
  2. Trigger your flow: sign up, reset a password or send an invite with that address.
  3. Wait for the code with GET /inboxes/{id}/otp?timeout=30. It returns the moment the email lands, with otp and verificationLink filled in.
# 1. Create an inbox
curl -s -X POST "https://api.blinkinbox.club/api/v1/inboxes" \
  -H "Authorization: Bearer $BLINKINBOX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prefix": "signup", "ttlMinutes": 30}'
# → {"id":"…","address":"signup4k2j9x1a@blinkinbox.club", …}

# 2. Trigger your signup flow with that address, then wait for the code
curl -s "https://api.blinkinbox.club/api/v1/inboxes/signup4k2j9x1a@blinkinbox.club/otp?timeout=30" \
  -H "Authorization: Bearer $BLINKINBOX_API_KEY"
# → {"otp":"482913","verificationLink":null,"subject":"Your code", …}
Features

Built for test suites

Wait for the email, not the clock

GET /otp and /messages/wait hold the request open until a matching email arrives (up to 60 seconds), then return immediately. No sleep(), no polling loop.

Codes and links already parsed

One-time codes like 482913 or G-4F7K2Q and verification or magic links come back as otp and verificationLink. No regex over HTML in your tests.

One inbox per test

Every test creates its own address, so parallel runs never share state or read each other’s mail. Inboxes expire on their own.

Your own domain

Some apps block disposable domains. On Pro and Scale, receive at anything@test.yourcompany.com with one MX and one TXT record.

Webhooks

Prefer push? Every new email can fire a signed email.received webhook with the code already extracted.

OpenAPI 3.1

Generate a typed client in any language, or call the REST API from cURL, Node, Python, Playwright or Cypress.

Coverage

Email flows you can finally test

If your app sends it, a test can receive it and check the code, the link, the sender and the content.

Sign-up with an email code
Email confirmation links
Magic-link login
Password reset
Team and workspace invites
Email change confirmation
2FA codes sent by email
Welcome and onboarding emails
Compared

Mail catcher, shared Gmail, or an API?

Local catcher (Mailpit, MailHog)Shared Gmail accountBlinkInbox
Works against staging and productionNo, needs your SMTP settingsYesYes
Parallel testsYesMessy: one shared inboxYes, one inbox per test
Waiting for the emailPollingPolling, IMAP or Gmail APIOne long-poll request
Code and link extractionWrite it yourselfWrite it yourselfBuilt in
SetupRun a containerOAuth, app passwordsAn API key
FAQ

Email testing, answered

What is an email testing API?
An API that gives your tests real, disposable email addresses and lets them read what arrives. Your app sends email through its normal provider, and the test reads the message, the code and the links through HTTP.
How is this different from Mailpit or MailHog?
Local mail catchers are great when your app’s SMTP settings point at them, usually on a developer machine. BlinkInbox receives real email from the internet, so the same tests also run against staging and production, where your app sends through SendGrid, SES, Postmark or another provider.
Will it work in CI?
Yes. Tests only need outbound HTTPS to the API and an API key in your CI secrets. Each test creates its own inbox, so parallel jobs don’t interfere.
How long can a test wait?
Up to 60 seconds per request. If nothing arrives, the request returns a clear error (408 wait_timeout, or 404 otp_not_found for /otp) so the test fails with a reason instead of hanging.
How much does it cost?
The Developer plan is free with 3 inboxes in any 24 hours. Pro gives 10 in any 24 hours with custom domains and inboxes that live up to 7 days; Scale is unlimited.