Your signup form looks healthy. Hundreds of new users every week. But conversion to paid is flat. Support tickets reference accounts that never respond. Your onboarding emails bounce or vanish into the void.

The culprit is usually disposable email addresses — temporary inboxes from services like Guerrilla Mail, Temp Mail, and Mailinator that let anyone create a throwaway address in seconds. These addresses work long enough to get past your email confirmation step, then self-destruct.

A disposable email API catches these addresses at the point of entry — during signup, before the fake account ever touches your database. This guide shows you how to integrate one in under five minutes.

Why Use a Disposable Email API

Maintaining your own blocklist of disposable email domains is a losing battle. New temp mail services launch weekly, existing ones rotate domains, and the list of known disposable domains now exceeds 200,000. Hardcoding a few hundred domains into your validation logic catches maybe 10% of them.

A dedicated disposable email checker API gives you:

Quick Start: 3 Steps to Detect Disposable Emails

Step 1: Get your API key

Sign up at app.emailprobe.dev/signup.html. You get 2,500 free validations per month. No credit card required.

Your API key will look like ep_live_abc123.... Keep it in an environment variable — never commit it to source control.

Step 2: Make a request

Send a POST to /v1/validate with the email in the request body:

cURL
curl -X POST https://api.emailprobe.dev/v1/validate \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "test@tempmail.com"}'

Step 3: Handle the response

The API returns a JSON object. The field you care about most is is_disposable:

JSON Response
{
  "email": "test@tempmail.com",
  "domain": "tempmail.com",
  "verdict": "disposable",
  "score": 95,
  "is_disposable": true,
  "is_free_provider": false,
  "syntax_valid": true,
  "has_mx": true,
  "request_id": "req_abc123"
}

If is_disposable is true, reject the signup or flag it for review. That's it — three steps.

API Endpoints

EmailProbe exposes four endpoints. All authenticated endpoints require the Authorization: Bearer YOUR_API_KEY header.

Method Endpoint Description
POST /v1/validate Full email validation. Accepts {"email": "..."} in the request body. Returns verdict, score, disposable flag, MX status, and more.
GET /v1/domain/:domain Domain-only check. Faster if you already extracted the domain. Returns the same disposable detection without local-part analysis.
GET /v1/usage Returns your current billing period usage: requests made, quota remaining, plan tier.
GET /open/v1/disposable/:domain Free open API. No auth required. CORS-enabled. Returns a simple boolean. Great for client-side checks and testing.

Code Examples

cURL

Bash
curl -X POST https://api.emailprobe.dev/v1/validate \
  -H "Authorization: Bearer $EMAILPROBE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "someone@guerrillamail.com"}'

JavaScript (Node.js / Browser)

JavaScript
const response = await fetch("https://api.emailprobe.dev/v1/validate", {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ email: "someone@guerrillamail.com" }),
});

const result = await response.json();

if (result.is_disposable) {
  // Block signup or show warning
  console.log("Disposable email detected:", result.domain);
} else {
  // Proceed with registration
  console.log("Email looks good. Verdict:", result.verdict);
}

Python

Python
import requests
import os

response = requests.post(
    "https://api.emailprobe.dev/v1/validate",
    headers={
        "Authorization": f"Bearer {os.environ['EMAILPROBE_API_KEY']}",
        "Content-Type": "application/json",
    },
    json={"email": "someone@guerrillamail.com"},
)

result = response.json()

if result["is_disposable"]:
    print(f"Blocked: {result['domain']} is disposable (score: {result['score']})")
else:
    print(f"Allowed: {result['verdict']}")

Understanding the Response

Here is what each field in the validation response means:

Free Open API

If you want to test the API without signing up, or you need a client-side disposable domain check, use the open endpoint:

cURL
curl https://api.emailprobe.dev/open/v1/disposable/tempmail.com

Response:

JSON
{
  "domain": "tempmail.com",
  "is_disposable": true
}
No auth required

The open API is CORS-enabled and requires no API key. It is rate-limited to 10 requests per day per IP. For production use with higher limits, grab a free API key.

This endpoint only does a domain-level check. For full email validation (syntax, local-part analysis, risk scoring), use POST /v1/validate with authentication.

Rate Limits and Pricing

The free tier is built for real usage, not a crippled trial:

When you exceed your limit, the API returns HTTP 429 with a Retry-After header indicating when you can resume. No data is lost and no charges are incurred.

Paid plans are coming soon with higher quotas (10K to 250K validations/month), batch validation, webhooks, and team access. See the pricing page for details.

Error Handling

Every error response follows a consistent structure. Your integration code can always expect this shape:

JSON Error Response
{
  "error": "Rate limit exceeded",
  "code": "RATE_LIMITED",
  "request_id": "req_xyz789"
}

Common error codes you should handle:

Always check the HTTP status code before parsing the response body. A well-behaved integration handles every status code above:

JavaScript
const response = await fetch("https://api.emailprobe.dev/v1/validate", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.EMAILPROBE_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ email }),
});

if (!response.ok) {
  const err = await response.json();
  if (response.status === 429) {
    const retryAfter = response.headers.get("Retry-After");
    // Wait and retry
  }
  throw new Error(`EmailProbe error: ${err.code} - ${err.error}`);
}

const result = await response.json();

Next Steps

You now have everything you need to block disposable emails from your signup flow. Here is where to go from here:

If you run into any issues, include the request_id from the API response when you contact support. It links directly to the request logs and lets us diagnose problems fast.

Related Articles

Email Validation API: The Developer's Guide to Cleaner Signups → Disposable Email Checker: How to Check If an Email Is Disposable → Disposable Email Domains List: 202,686 Domains (Updated 2026) →

Start blocking disposable emails today

Free API key. 2,500 validations per month. Set up in under 5 minutes.

Get Your Free API Key

No credit card required.