Every test run gets its own inbox.
Your suite drives a real signup, your app sends a real code, and Ravenhook hands it back over an authenticated API. No shared mailbox, no polling loop, nothing to create in advance.
Why a shared inbox does not work
Ten tests running against one address cannot tell whose code is whose. The messages are genuinely indistinguishable, so no amount of filtering fixes it — the only answer is an address per run, and that has to cost nothing.
Every address under your namespace already exists. Make one up in your test and mail sent to it arrives:
mfa@ex4mple0ns.inbox.ravenhook.dev
run-8f3a@ex4mple0ns.inbox.ravenhook.dev
literally-anything@ex4mple0ns.inbox.ravenhook.dev- any name works
- your namespace
- fixed for everyone
Read whatever arrives at one of them, straight from your test:
import os, re, requests
TOKEN = os.environ["RAVENHOOK_TOKEN"]
inbox = "mfa@ex4mple0ns.inbox.ravenhook.dev"
sign_up(email=inbox) # your app emails a code
# waits for the mail to land instead of polling for it
reply = requests.get(
"https://api.ravenhook.dev/messages/latest",
params={"address": inbox},
headers={"Authorization": f"Bearer {TOKEN}"},
)
body = reply.json()["message"]["text_body"]
code = re.search(r"\d{6}", body).group()Running tests in parallel? Make the local part unique — run-{uuid.uuid4()}@ex4mple0ns.inbox.ravenhook.dev — and nothing else changes. That is the whole trick.
It waits, so you don't
Reads hold the connection open until mail lands — no polling loop, and no flag to remember. A timeout returns an empty result rather than an error, so a slow send never looks like an outage.
Onboarding is two strings
A domain and an API key. There is no dashboard to configure, no inbox to register, and nothing to clean up between runs.
The whole message
Full text and HTML bodies, headers, and attachment metadata. Assert on wording or pull out a link — we don't guess at which part you wanted. HTML arrives sanitized, with links intact.
Inbound only
Ravenhook receives mail and never sends any. It cannot be turned into a relay, which is what keeps the domain's reputation yours to rely on.
It forgets on purpose
Messages are deleted within 24 hours, automatically and unconditionally. There is no archive to leak and nothing for us to hand over — which is the answer your security review is looking for.
Pricing
Start here
- Unlimited addresses — nothing to create or register
- No monthly quota. 300 inbound messages a minute
- 200 concurrent long-poll reads for parallel CI
- Full bodies, headers and attachment metadata, HTML sanitized
- Newest 500 messages kept, deleted after 24 hours
A card is required to start, and nothing is charged during the trial.
Then
- Everything above, uninterrupted
- Billed monthly, no contract and no notice period
- Cancel any time; access runs to the period end
The subscription begins automatically when the trial ends. Cancel before day 31 and you are never charged.
Billed by Lemon Squeezy, who handle VAT and sales tax.
Coming next: your own domain. Receiving test mail at *@qa.yourcompany.com is on the roadmap and not built yet — if that is what you need, tell us and we will let you know when it ships.