One endpoint. Bearer auth. JSON in, JSON out.
Base URL
https://api.checkdisposable.emailAuthentication
Pass your API key as a Bearer token. Get one for free at app.checkdisposable.email.
Authorization: Bearer cde_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxAnonymous use is also fine for low volume — the same endpoint will rate-limit by IP to 30/hour without a key. That's what powers the checker on the homepage.
Check a single email
GET /v1/check
curl 'https://api.checkdisposable.email/v1/check?email=test@mailinator.com' \
-H 'Authorization: Bearer cde_live_...'Response (200):
{
"email": "test@mailinator.com",
"domain": "mailinator.com",
"is_disposable": true,
"blocked": true,
"source_count": 8,
"sources": ["mailchecker", "disposable-email-domains", "amieiro", ...],
"reason": "Listed on 8 community lists.",
"duration_ms": 47
}Clean email response:
{
"email": "founder@stripe.com",
"domain": "stripe.com",
"is_disposable": false,
"blocked": false,
"source_count": 0,
"sources": [],
"reason": "Not on the disposable list.",
"duration_ms": 19
}Rate-limit headers
Every response includes:
X-RateLimit-Plan: free | unlimited | lifetime | anonymous
X-RateLimit-Limit: 500 | unlimited | 30
X-RateLimit-Remaining: <int>
X-RateLimit-Reset: <seconds until window resets> # anonymous onlyError codes
| Status | Error | Meaning |
|---|---|---|
| 400 | bad_request | Missing/malformed email parameter. |
| 401 | invalid_api_key | API key is wrong or revoked. |
| 429 | rate_limited / plan_limit | Anonymous IP limit hit, or monthly plan exhausted. |
| 502 | upstream_error | Blocklist provider is temporarily unreachable. Retry. |
Recipes
Node.js
const res = await fetch(
'https://api.checkdisposable.email/v1/check?email=' + encodeURIComponent(email),
{ headers: { Authorization: 'Bearer ' + process.env.CDE_KEY } }
);
const { is_disposable } = await res.json();
if (is_disposable) throw new Error('Disposable signup rejected');Python
import os, httpx
def is_disposable(email: str) -> bool:
r = httpx.get(
"https://api.checkdisposable.email/v1/check",
params={"email": email},
headers={"Authorization": f"Bearer {os.environ['CDE_KEY']}"},
timeout=5.0,
)
r.raise_for_status()
return r.json()["is_disposable"]