Detect disposable emails in Python. One function call.
Open-source disposable email detection with 160,000+ domains.
Offline-first. Zero dependencies. Fully typed.
Website · Docs · API Reference
pip install isdisposablefrom isdisposable import is_disposable
is_disposable("test@mailinator.com") # True
is_disposable("user@gmail.com") # FalseSynchronous. Offline. Zero config.
from isdisposable import is_disposable_bulk
results = is_disposable_bulk([
"a@tempmail.com",
"b@gmail.com",
"c@guerrillamail.com",
])
# [True, False, True]from isdisposable import is_domain_disposable
is_domain_disposable("mailinator.com") # True
is_domain_disposable("gmail.com") # FalseFor DNS/MX validation, risk scoring, and domain age analysis:
from isdisposable import create_client
client = create_client(api_key="isd_live_xxxxx")
result = client.check("test@suspicious-domain.com")
print(result.disposable) # True
print(result.score) # 95
print(result.reason) # "blocklist_match"
print(result.mx_valid) # True
print(result.domain_age_days) # 3The API client automatically falls back to offline detection on network errors.
from isdisposable import create_client
from isdisposable.client import AuthenticationError, RateLimitError
client = create_client(api_key="wrong_key")
try:
result = client.check("test@example.com")
except AuthenticationError:
print("Invalid API key")
except RateLimitError:
print("Too many requests")results = client.check_bulk([
"a@tempmail.com",
"b@gmail.com",
])
for r in results:
print(f"{r.email}: {r.disposable} (score: {r.score})")Django — Form Validation
from django import forms
from isdisposable import is_disposable
class SignupForm(forms.Form):
email = forms.EmailField()
def clean_email(self):
email = self.cleaned_data["email"]
if is_disposable(email):
raise forms.ValidationError("Disposable emails are not allowed.")
return emailFastAPI — Dependency
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from isdisposable import is_disposable
app = FastAPI()
class SignupRequest(BaseModel):
email: str
password: str
@app.post("/signup")
def signup(req: SignupRequest):
if is_disposable(req.email):
raise HTTPException(400, "Disposable emails are not allowed")
return {"ok": True}Flask — Before Request
from flask import Flask, request, jsonify
from isdisposable import is_disposable
app = Flask(__name__)
@app.route("/signup", methods=["POST"])
def signup():
email = request.json.get("email", "")
if is_disposable(email):
return jsonify(error="Disposable emails are not allowed"), 400
return jsonify(ok=True)Pydantic — Field Validator
from pydantic import BaseModel, field_validator
from isdisposable import is_disposable
class User(BaseModel):
email: str
@field_validator("email")
@classmethod
def check_disposable(cls, v: str) -> str:
if is_disposable(v):
raise ValueError("Disposable emails are not allowed")
return vReturns True if the email is from a disposable provider.
Bulk check. Returns list of booleans matching input order.
Check a domain directly.
Extract the domain from an email address.
Create an API client with .check(), .check_bulk(), and .clear_cache().
| Language | Package | Status |
|---|---|---|
| JavaScript/TypeScript | @isdisposable/js |
Stable |
| Python | isdisposable |
Stable |
| Go | isdisposable-go |
Coming soon |
MIT
Built by Junaid Shaukat
Dashboard & API at isdisposable.com
