Stopping Disposable Email Signups: A Developer's Guide

Stopping Disposable Email Signups: A Developer's Guide

Disposable email addresses—temporary inboxes that self-destruct after minutes or hours—are a persistent headache for platforms managing user signups. They inflate your user count with phantom accounts, boost metrics artificially, and make genuine user acquisition impossible to measure. If you're building an app that requires email verification, you've probably watched users sign up with user@tempmail.com and then vanish.

The good news: detecting disposable emails at signup is straightforward, and the tradeoff between coverage and false positives is manageable once you know what you're doing.

Why Disposable Emails Matter

Disposable email services exist for legitimate reasons—privacy, spam avoidance, testing. But they're also exploited for:

  • Fake signups: Bots and competitors inflating your user numbers
  • Fraud: Creating throwaway accounts to abuse free trials or promotional credits
  • Low-quality user data: Accounts created for one action, then abandoned
  • Skewed analytics: Your retention metrics and cohort analysis become noise

Unlike spam filtering (which happens after signup), blocking disposable addresses at signup prevents the account creation entirely—saving storage, email quota, and database clutter.

The Detection Approach

There are two practical ways to identify disposable emails:

1. Domain Blocklists (Quick, High Precision)

Maintain or subscribe to a list of known disposable domains: tempmail.com, 10minutemail.com, guerrillamail.com, etc. Check the domain part of the email against this list.

Pros: Fast, zero API cost, no latency. Cons: Lists go stale; new disposable services emerge constantly. You'll miss 20–30% of active disposable providers.

2. API-Based Detection (Comprehensive, Higher Confidence)

The Disposable Email Checker API queries a live, curated database of disposable email providers, updated daily. It returns a boolean verdict plus metadata (risk level, provider category) that lets you make nuanced decisions.

Pros: Catches new disposable services as they launch, minimal false positives (~0.5%), integrates in milliseconds. Cons: Adds one HTTP call per signup; costs $0.01 per credit (where most checks consume 1 credit).

Implementing with the Disposable Email Checker API

Here's how to integrate it into your signup flow:

Node.js Example

const checkDisposableEmail = async (email) => {
  const domain = email.split('@')[1];
  
  try {
    const response = await fetch('https://api.theglitchstore.com/email/disposable', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${process.env.GLITCH_STORE_API_KEY}`
      },
      body: JSON.stringify({ email })
    });
    
    const data = await response.json();
    
    if (data.is_disposable) {
      return { allowed: false, reason: 'Disposable email detected' };
    }
    
    return { allowed: true };
  } catch (error) {
    // On API timeout/failure, allow signup to proceed
    // (fail open, don't block legitimate users)
    console.warn('Email check failed:', error);
    return { allowed: true };
  }
};

// In your signup endpoint
app.post('/signup', async (req, res) => {
  const { email, password } = req.body;
  
  const emailCheck = await checkDisposableEmail(email);
  if (!emailCheck.allowed) {
    return res.status(400).json({ error: emailCheck.reason });
  }
  
  // Continue with user creation...
});

Python Example

import requests

def check_disposable_email(email):
    headers = {
        'Authorization': f'Bearer {os.getenv("GLITCH_STORE_API_KEY")}'
    }
    
    try:
        response = requests.post(
            'https://api.theglitchstore.com/email/disposable',
            json={'email': email},
            headers=headers,
            timeout=2
        )
        response.raise_for_status()
        data = response.json()
        
        return not data.get('is_disposable', False)
    except requests.RequestException as e:
        # Log and allow on failure
        logger.warning(f'Email check failed: {e}')
        return True

# In your signup view
@app.post('/api/signup')
def signup():
    email = request.json.get('email')
    
    if not check_disposable_email(email):
        return {'error': 'Disposable email addresses are not allowed'}, 400
    
    # Create user...

Navigating False Positives

No blocklist is perfect. Corporate domains, free email providers (Gmail, Yahoo, ProtonMail), and niche services occasionally get flagged as disposable. The Disposable Email Checker API keeps false positives below 0.5%, but here's how to handle edge cases:

Option 1: Log and Alert If a legitimate business signals a false positive, flag it internally and reach out to Glitch Store to whitelist it.

Option 2: Allow with Friction Let users proceed with flagged addresses but require SMS verification in addition to email confirmation.

Option 3: Risk-Based Tiers The API returns a risk_level field. Treat high-risk as hard blocks; treat medium-risk as requiring 2FA.

if (data.risk_level === 'high') {
  return { allowed: false }; // Block
} else if (data.risk_level === 'medium') {
  return { allowed: true, require_2fa: true }; // Allow but require 2FA
}

Cost and Scale

The Disposable Email Checker API charges $0.01 per credit, with most email checks consuming 1 credit. No subscription required—pay only for what you use. At 10,000 signups per month, you're spending $100 for comprehensive disposable email detection. That's typically 10–50x cheaper than the fraud and fake-user cleanup that would otherwise be required.

Best Practices

  1. Fail open: If the API times out, allow the signup. A 100ms delay is acceptable; blocking legitimate users is not.
  2. Cache aggressively: Store results for 24 hours. Disposable domains don't change hourly.
  3. Monitor: Log blocked signups and monitor trends. A spike in blocks might signal a targeted attack.
  4. Pair with other checks: Use this alongside password strength, rate limiting, and CAPTCHA for defense in depth.

Conclusion

Disposable emails are a low-lift win: one API call, minimal latency, and immediate reduction in fake accounts. The Disposable Email Checker API makes it a five-minute integration. At $0.01 per check, the ROI is nearly always positive.