How temporary email services work
A disposable provider owns a pool of domains and runs a catch-all mail server on each. Visit the site, and it shows you a random address and a live inbox for it. Anyone can read that inbox during its lifetime, nothing requires a password, and the address stops receiving after a fixed window. The domains rotate constantly because providers know they get blocklisted.
From a verification standpoint these addresses are technically deliverable at the moment of signup, which is exactly why a plain SMTP check is not enough to catch them.
What they cost a product
The direct cost is wasted resources: free trial credits, onboarding emails, and support time spent on accounts with no real person behind them. The indirect cost is worse. Those addresses expire, so every later message hard bounces, and a steady stream of bounces drags down the reputation of your sending domain for everyone else.
- Repeated free trials from the same person using fresh addresses.
- Inflated signup metrics that never convert.
- Bounces on every lifecycle email after the inbox expires.
- Referral and voting systems gamed with throwaway accounts.
How detection works
The core technique is a maintained list of disposable domains, matched against the domain part of each address. The hard part is maintenance: new domains appear daily, so a static list copied from a repository last year misses most of today's traffic. Better detectors add behavioral signals such as domains whose MX records point at a known disposable provider, domains registered days ago, and local parts that look machine generated.
A verification API bundles this with the rest of the checks. VeriDock returns status risky with reason disposable and sets checks.disposable to true, so you can branch on it without maintaining your own list.
const res = await fetch(
"https://api.veridock.io/v1/verify?email=" + encodeURIComponent(email),
{ headers: { Authorization: "Bearer " + process.env.VERIDOCK_KEY } }
);
const result = await res.json();
if (result.status === "undeliverable") return reject("Please check the address.");
if (result.reason === "disposable") return reject("Temporary addresses are not accepted.");
return accept();Blocking without losing real users
No list is perfect. Privacy-focused forwarding services and small independent mail hosts occasionally get flagged, so a hard block with no recourse will turn away some legitimate people. The friendlier pattern is to block at the point of entry with a clear message and an easy way to try a different address, rather than silently failing or rejecting after the account exists.
For higher value flows, consider a softer response: accept the signup, withhold trial credits until a confirmation link is clicked, and route flagged accounts to review. Rate limiting by IP catches the same abuse from a different angle and does not depend on the address at all.
Tell the user why the address was rejected. A vague error is the fastest way to lose someone who was actually trying to sign up.
Key takeaways
0/4Try it on a real address
Run syntax, DNS, MX, disposable, and role checks on any address. No signup needed.
Enter an address and press Check.
Runs real syntax, DNS and mail-server checks.
This demo checks syntax, domain, mail server, disposable and role-address rules. Sign up free for live mailbox checks.
Frequently asked questions
Verify addresses with one API call.
250 free checks every month, recurring. Unknown results are never billed.