The free, open list of disposable, temporary, and throwaway email domains — 205,000+ domains, updated daily. Maintained by Valid Email Checker.
Is user@mailinator.com a disposable / temporary / throwaway address? This repository is a canonical list to answer exactly that. It's the same data that powers disposable detection in Valid Email Checker's production email-verification engine.
- 205,000+ domains — one of the largest open disposable-email lists available.
- Live-backed & self-learning — synced daily from our production verifier, which continuously learns new disposable domains from real verification traffic. This is not a stale, abandoned snapshot.
- Curated, not just scraped — de-duplicated, domain-shape validated, with an allow-list so legitimate providers (
gmail.com,outlook.com, …) are never wrongly flagged. - MIT licensed — use it anywhere, commercial or not.
| Format | In this repo | Always-fresh from source |
|---|---|---|
| Plain text (one domain per line) | data/domains.txt |
https://www.validemailchecker.com/disposable-email-domains.txt |
JSON ({ count, updated, domains[] }) |
— | https://www.validemailchecker.com/disposable-email-domains.json |
The repo copy is refreshed daily by a GitHub Action; the URLs above are the live canonical source.
# Is a domain disposable?
grep -qxF "mailinator.com" data/domains.txt && echo "disposable"const res = await fetch('https://www.validemailchecker.com/disposable-email-domains.txt');
const domains = new Set((await res.text()).split('\n'));
const isDisposable = (email) => domains.has(email.split('@')[1]?.toLowerCase());
isDisposable('user@mailinator.com'); // trueimport requests
domains = set(requests.get('https://www.validemailchecker.com/disposable-email-domains.txt').text.splitlines())
def is_disposable(email: str) -> bool:
return email.split('@')[-1].lower() in domainspackage main
import (
"bufio"
"fmt"
"net/http"
"strings"
)
func main() {
resp, _ := http.Get("https://www.validemailchecker.com/disposable-email-domains.txt")
defer resp.Body.Close()
domains := map[string]struct{}{}
s := bufio.NewScanner(resp.Body)
s.Buffer(make([]byte, 1024*1024), 1024*1024)
for s.Scan() {
domains[strings.ToLower(s.Text())] = struct{}{}
}
_, disposable := domains["mailinator.com"]
fmt.Println(disposable) // true
}data/domains.txt— one lowercased domain per line, sorted, newline-delimited. No comments, no blank lines.- Domains are validated (
^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9-]+)*\.[a-z]{2,}$) and de-duplicated. - Legitimate mailbox providers are kept out via an internal allow-list, so common providers are never flagged.
- A daily GitHub Action (
.github/workflows/update.yml) syncsdata/domains.txtfrom the canonical source. - The canonical list grows three ways: hand curation, periodic merges from public community lists, and a nightly self-learning harvest that promotes domains our production verifier flags as disposable in real traffic.
- Spot a miss or a false positive? Open an issue or PR — see CONTRIBUTING.md.
A static list catches known disposables. It cannot tell you whether a specific mailbox actually exists, whether a domain is catch-all, or whether an address is a role account or spam trap. For that, run a real-time check:
Verify emails free with Valid Email Checker → — 200 free credits, no card. Live SMTP verification, catch-all + role + spam-trap detection, and an API. See the Email Verifier or the full disposable-domains page.
MIT © Valid Email Checker — see LICENSE. Community sources we draw from are credited in THIRD_PARTY_NOTICES.md.