How to Detect Disposable Email Addresses
in Real Time
Disposable email addresses—also called temporary, throwaway, or burner emails—are one of the strongest fraud signals you can detect. If someone signs up with randomstring@mailinator.com or test@guerrillamail.com, they're not planning to stick around.
Let's break down what disposable emails are, why they matter, and how to detect them reliably at scale.
What Are Disposable Email Addresses?
Disposable email services provide temporary inboxes that self-destruct after 10 minutes to 24 hours. Popular services include:
- Mailinator: Public inboxes, no signup required
- Guerrillamail: Random addresses that expire in 60 minutes
- 10MinuteMail: Exactly what it sounds like
- TempMail / Temp-Mail.org: Random addresses with custom domains
- YOPmail: Popular in Europe for avoiding spam
Many services allow users to create unlimited addresses on demand. Some even offer APIs for automation.
Why Disposable Emails Are a Fraud Signal
Legitimate users rarely use throwaway emails for real accounts. When you see one, it usually means:
- Fake account creation: Bypassing email verification to spam, scrape, or abuse your platform
- Free trial abuse: Creating multiple accounts to extend trials indefinitely
- Affiliate fraud: Generating fake referrals or sign-ups for commission
- Competitor research: Accessing gated content without revealing their identity
- Credential testing: Bots testing stolen passwords across platforms
Real-World Example:
A SaaS company offering a 14-day free trial found that 78% of disposable email signups never converted to paid, compared to 18% for legitimate emails. Blocking disposable domains cut support costs by 40%.
Detection Approaches
There are several ways to detect disposable emails, each with trade-offs:
1. Static Domain Blacklists
The simplest approach: maintain a list of known disposable domains and reject them.
Pros:
- Easy to implement (just a HashSet lookup)
- Zero latency (local check)
- Works offline
Cons:
- Stale data: New services launch daily; your list is outdated within weeks
- Maintenance burden: You need to manually update the list
- Incomplete coverage: Open-source lists cover 5,000-20,000 domains; there are 150,000+
- False positives: Some legitimate privacy-focused providers get flagged
// Static list approach (not recommended)
const disposableDomains = new Set([
'mailinator.com',
'guerrillamail.com',
'10minutemail.com',
// ... 5,000 more entries you need to maintain
]);
function isDisposable(email) {
const domain = email.split('@')[1].toLowerCase();
return disposableDomains.has(domain);
}
// Problem: New service "super-temp-mail.xyz" launches tomorrow
// Your list doesn't include it → bypass2. MX Record Analysis
Check the email's MX (Mail Exchange) records for patterns common to disposable services.
Indicators:
- MX points to known temp-mail infrastructure
- No MX records (invalid email)
- MX points to suspicious hosting providers
Pros:
- Can catch new services not in your list
- Validates email deliverability at the same time
Cons:
- Latency: DNS lookups add 100-500ms per validation
- False positives: Small businesses on shared hosting get flagged
- Rate limits: DNS providers may throttle bulk lookups
3. Pattern Matching
Disposable services often use predictable formats:
- Random strings:
xk92jf@tempmail.com - Sequential numbers:
user12345@yopmail.com - Obvious keywords:
throwaway@domain.com
Pros:
- Catches some undocumented services
- Fast (regex-based)
Cons:
- High false positive rate: Legitimate users sometimes have random-looking emails
- Easily bypassed: Users can pick normal-looking addresses on temp services
4. Real-Time API Validation (Recommended)
Use a specialized service that maintains a continuously updated database of disposable domains and validates in real-time.
Why APIs Are Better:
- Always up-to-date: Database refreshed hourly/daily with new services
- Comprehensive coverage: IPASIS tracks 120,000+ disposable domains
- Combined checks: Disposable detection + MX validation + typo checking in one call
- Low latency: <20ms for most queries (cached globally)
Implementation: IPASIS Email Validation
Here's how to implement real-time disposable email detection:
// Server-side email validation
async function validateEmail(email) {
const response = await fetch(
`https://api.ipasis.com/email?address=${encodeURIComponent(email)}`,
{
headers: {
'Authorization': `Bearer ${process.env.IPASIS_API_KEY}`
}
}
);
const data = await response.json();
return data;
}
// Example usage in signup flow
export async function POST(request) {
const { email, password } = await request.json();
const validation = await validateEmail(email);
if (validation.is_disposable) {
return NextResponse.json(
{ error: 'Disposable email addresses are not allowed' },
{ status: 400 }
);
}
if (!validation.mx_valid) {
return NextResponse.json(
{ error: 'Email address cannot receive mail' },
{ status: 400 }
);
}
if (validation.is_role_based) {
// Optional: warn about info@, support@ emails
console.warn('Role-based email detected:', email);
}
// Proceed with signup
await createUser({ email, password });
return NextResponse.json({ success: true });
}
// Sample IPASIS response
{
"email": "test@mailinator.com",
"is_disposable": true,
"is_role_based": false,
"is_free_provider": false,
"mx_valid": true,
"mx_records": ["mail.mailinator.com"],
"domain": "mailinator.com",
"suggested_correction": null // e.g., "Did you mean @gmail.com?"
}Why Static Lists Aren't Enough
The disposable email ecosystem is constantly evolving:
- New services daily: Over 500 new temp-mail domains launch each month
- Domain hopping: Services rotate domains to evade blacklists
- Wildcard domains: Some services accept any subdomain (*.tempmail.net)
- Legitimate privacy tools: Services like Apple Hide My Email need whitelisting
IPASIS maintains this complexity for you, updating the database in real-time as new services emerge and old ones shut down.
Handling Edge Cases
Not all disposable email detections should result in a hard block:
- Privacy-focused users: Some people legitimately use services like ProtonMail or SimpleLogin for privacy—these aren't disposable
- Regional differences: Some countries have different email habits (e.g., QQ.com is legitimate in China)
- Corporate policies: Large companies sometimes use temporary addresses for vendor trials
Best Practice:
- Block obvious throwaway services (Mailinator, Guerrillamail)
- Warn users about questionable domains and let them confirm
- Allow privacy-focused providers (ProtonMail, Tutanota) but flag for review
Combining Email + IP Validation
For maximum accuracy, combine disposable email detection with IP reputation scoring:
// Combined validation for signup abuse detection
async function validateSignup(email, ip) {
const [emailCheck, ipCheck] = await Promise.all([
fetch(`https://api.ipasis.com/email?address=${email}`, {
headers: { 'Authorization': `Bearer ${API_KEY}` }
}).then(r => r.json()),
fetch(`https://api.ipasis.com/check?ip=${ip}`, {
headers: { 'Authorization': `Bearer ${API_KEY}` }
}).then(r => r.json())
]);
let riskScore = 0;
// Email risk factors
if (emailCheck.is_disposable) riskScore += 50;
if (!emailCheck.mx_valid) riskScore += 40;
if (emailCheck.is_role_based) riskScore += 10;
// IP risk factors
if (ipCheck.is_vpn) riskScore += 20;
if (ipCheck.is_datacenter) riskScore += 30;
if (ipCheck.is_tor) riskScore += 50;
return {
allowed: riskScore < 50,
requiresVerification: riskScore >= 50 && riskScore < 80,
blocked: riskScore >= 80,
riskScore
};
}Pro Tip:
Track which disposable services are most commonly used on your platform. This helps you understand if you're dealing with casual free-trial abusers (10MinuteMail) or sophisticated fraud rings (custom domains).
The Bottom Line
Disposable email detection is table stakes for fraud prevention. Whether you're protecting free trials, preventing spam signups, or filtering lead quality, catching throwaway addresses is one of the highest-signal checks you can implement.
With IPASIS tracking 120,000+ disposable domains and updating in real-time, you don't need to maintain your own lists or worry about new services bypassing your filters. Just call the API and get a definitive answer in <20ms.