
Someone just signed up for your free trial as qx7f2@mailinator.com, claimed the credit, and vanished — and by the time you noticed, fifty more had done the same thing overnight. Disposable addresses are the quietest tax on a growing product: they inflate your signup numbers, poison your funnel metrics, and hand abusers an infinite supply of "new" accounts. The good news is that you can catch nearly all of them with a single API call, and this guide shows you exactly how to detect disposable email addresses and wire that check into your signup flow.
By the end you'll have a working curl test, drop-in Node.js and Python clients, and a soft-block-versus-hard-block strategy you can ship today.
What Disposable Email Addresses Are — and Why They Cost You
A disposable email address (also called a temporary, throwaway, or burner email) is a self-destructing inbox from services like Mailinator, 10MinuteMail, Guerrilla Mail, or Temp-Mail. A user grabs one in two clicks, receives your confirmation link, and the address evaporates minutes later. There's no real person behind it and no inbox to follow up with.
That sounds harmless until you add up what it actually does to your business:
- Fake signups and trial abuse. Burner addresses let one person spin up unlimited "new" accounts to farm free credits, referral bonuses, or promo codes.
- Skewed metrics. Every throwaway signup pollutes your activation, retention, and conversion numbers. You optimize against ghosts.
- Dead deliverability. Mail you send to an expired temporary inbox bounces or vanishes, dragging down your sender reputation and inbox placement.
- A foothold for abuse. Spammers, scrapers, and fraud rings rely on disposable email because it's free and untraceable. Where you see one burner, there's usually a pattern.
If you want the full business case before diving into code, our breakdown of disposable email detection to prevent fake signups covers the downstream damage in detail.
Why Static Blocklists Fail
The instinct most teams reach for first is a hardcoded list of bad domains: grab a disposable-domains.txt off GitHub, check the part after the @, reject on a match. It works for about a week.
Here's why a static list quietly rots:
- New domains appear constantly. Disposable providers rotate through thousands of throwaway domains. A list that was current last month is already missing the ones spun up yesterday.
- Custom and vanity domains. Many temp-mail services let users receive on their own domain or on randomized subdomains that never appear on any public list.
- Subdomain and alias tricks.
user+tag@,user@sub.tempmail.example, and lookalike spellings slip past naive exact-match checks. - Maintenance burden. Keeping a blocklist fresh is a job nobody on your team actually owns, so it silently goes stale.
A managed email validation API solves this by maintaining the detection logic for you — its disposable signal is updated continuously from live data, MX records, and behavioral patterns rather than a frozen text file you have to babysit. You make one call; the freshness problem becomes someone else's job.
Detect Disposable Addresses with the API
The endpoint is POST /validate/email. Send a JSON body with a single email field and you get back a rich verdict that includes a dedicated disposable flag. Start with curl so you can see exactly what's on the wire:
curl -X POST https://api.1lookup.io/v1/validate/email \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"email":"qx7f2@mailinator.com"}'
A throwaway address comes back looking like this — note disposable: true:
{
"email": "qx7f2@mailinator.com",
"valid": true,
"deliverable": true,
"disposable": true,
"role_account": false,
"free_email": false,
"mx_found": true,
"smtp_check": true,
"did_you_mean": null,
"fraud_score": 82,
"reason": "disposable_email"
}
Two things are worth calling out. First, a disposable address can still be valid and even deliverable in the moment — that mailbox really does exist right now. The disposable flag is what tells you it won't exist for long. Second, notice the fraud_score is high (82) and the reason is explicit. You'll use both of those signals when you decide how aggressively to block.
For comparison, a legitimate signup returns disposable: false with a low fraud_score:
{
"email": "jordan@acme.com",
"valid": true,
"deliverable": true,
"disposable": false,
"role_account": false,
"free_email": false,
"mx_found": true,
"smtp_check": true,
"did_you_mean": null,
"fraud_score": 6,
"reason": "accepted_email"
}
The entire detection decision comes down to reading one boolean. The hard part — keeping up with thousands of rotating burner domains — happens server-side.
Wire It Into Your Signup Flow
Curl proves the concept; now put it where it counts. The highest-ROI place to run this check is the moment a user submits your signup form, before you ever write a row to the database. Here are two drop-in implementations.
Node.js (fetch)
Node 18+ ships fetch natively, so there are no dependencies to install:
const API_KEY = process.env.LOOKUP_API_KEY;
async function detectDisposable(email) {
const res = await fetch("https://api.1lookup.io/v1/validate/email", {
method: "POST",
headers: {
"Authorization": `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ email }),
});
if (!res.ok) {
throw new Error(`Validation failed: ${res.status}`);
}
return res.json();
}
const result = await detectDisposable("qx7f2@mailinator.com");
if (result.disposable) {
console.log(`Blocked throwaway address: ${result.email}`);
} else if (result.valid && result.deliverable) {
console.log(`Accepting ${result.email}`);
}
Python (requests)
The Python version uses the ubiquitous requests library (pip install requests):
import os
import requests
API_KEY = os.environ["LOOKUP_API_KEY"]
def detect_disposable(email):
response = requests.post(
"https://api.1lookup.io/v1/validate/email",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
},
json={"email": email},
timeout=10,
)
response.raise_for_status()
return response.json()
result = detect_disposable("qx7f2@mailinator.com")
if result["disposable"]:
print(f"Blocked throwaway address: {result['email']}")
elif result["valid"] and result["deliverable"]:
print(f"Accepting {result['email']}")
Both examples read result.disposable and branch on it. Notice the timeout on the Python call — always set one so a slow upstream never hangs your signup thread. And decide your failure mode deliberately: if the API is briefly unreachable, do you let the signup through (fail open) or block it (fail closed)? For most products, failing open keeps real users out of the cold; for fraud-sensitive flows, failing closed is safer.
Soft-Block vs Hard-Block: Choosing Your Policy
Detecting a disposable address is step one. What you do about it is where teams get it right or wrong. Blocking too hard frustrates legitimate users who happen to use a privacy-forward provider; blocking too soft lets abuse straight through. The answer is a tiered policy keyed off disposable and fraud_score.
Here's a sensible default:
- Hard-block when
disposableistrueon a high-stakes action — paid trials, referral payouts, anything with a financial incentive to abuse. Return a clear message: "Please use a permanent email address." - Soft-block (warn and allow retry) when
disposableistruebut the action is low-stakes, like a newsletter opt-in. Show an inline nudge — "Temporary email addresses can't receive your confirmation" — and let the user correct it. - Step up friction when
disposableisfalsebutfraud_scoreis elevated (say, above 70). The address isn't a known burner, but the risk profile is suspicious. Trigger email verification, a CAPTCHA, or manual review instead of an outright reject. - Accept cleanly when
disposableisfalse,deliverableistrue, andfraud_scoreis low.
Combining the two signals matters because they catch different things. The disposable flag catches known throwaway services; the fraud_score catches newer or custom burner domains that haven't been classified yet but behave suspiciously. Feeding that score into a broader fraud detection pipeline lets you correlate it with IP reputation, velocity, and device signals — turning a single email check into a real abuse-prevention layer. For the wider playbook, our guide on how to stop fake signups maps every defensive layer end to end.
A quick decision checklist for your signup handler:
-
disposable === trueon a paid or incentivized flow → reject -
disposable === trueon a low-stakes flow → warn, allow correction -
disposable === falsebutfraud_scorehigh → step-up verification -
valid && deliverable && !disposableand low score → accept - API error → fail open or closed per your risk tolerance
Monitoring and Tuning Over Time
Disposable detection isn't set-and-forget. Burner providers evolve, and so should your thresholds. Three habits keep your defense sharp:
- Log every verdict. Store
disposable,fraud_score, andreasonalongside each signup attempt. You can't tune what you don't measure, and these logs are gold when you investigate an abuse spike. - Watch your block rate. If disposable rejections suddenly jump from 2% to 15% of signups, you're either under attack or a new burner domain just went viral. Either way you want to know within hours, not weeks.
- Tune the fraud-score threshold. Start your step-up trigger around 70 and adjust. If legitimate users are getting friction, raise it; if junk is slipping through, lower it. Let your own conversion and chargeback data drive the number.
Caching helps too. Most validation APIs — 1Lookup included — bill per check, so re-validating the same address wastes credits. Cache verdicts for a day or so, keyed on a normalized (trimmed, lowercased) address, and you'll cut call volume meaningfully on repeat traffic. For high-volume signup flows, batching and queueing patterns matter even more; the advanced email validation API implementation guide covers throughput tuning, retries, and caching in depth.
One more refinement worth making: don't treat every non-personal address the same. A role_account like info@ or sales@ is fine for a B2B contact form but risky for a personal account, while a free_email provider like Gmail is perfectly legitimate for consumer signups. Reading these fields alongside disposable keeps your policy precise instead of blunt.
Next Steps
You now have everything you need to detect disposable email addresses via API: a curl test that surfaces the disposable flag, production Node.js and Python clients that branch on it, a tiered soft-block-versus-hard-block policy, and a monitoring loop to keep it tuned. The whole thing rides on a single endpoint and one boolean — the hard part of tracking thousands of rotating burner domains is handled for you.
From here you can:
- Drop the disposable check into your signup handler as a real-time gate today
- Feed
fraud_scoreinto your risk model for the addresses that aren't obvious burners - Schedule a recurring bulk pass to clean throwaway addresses out of your existing list
Ready to put it into production? Explore the full email validation API to see every field and rate tier, compare plans on our pricing page to size the right volume, and sign up for a free API key to block your first throwaway address in the next five minutes.
Meet the Expert Behind the Insights
Real-world experience from building and scaling B2B SaaS companies

Robby Frank
Head of Growth at 1Lookup
"Calm down, it's just life"
About Robby
Self-taught entrepreneur and technical leader with 12+ years building profitable B2B SaaS companies. Specializes in rapid product development and growth marketing with 1,000+ outreach campaigns executed across industries.
Author of "Evolution of a Maniac" and advocate for practical, results-driven business strategies that prioritize shipping over perfection.