Ask ChatGPT Ask Claude

Disposable email check API

Bewary's email API tells you whether an address is disposable, a free provider or a shared role mailbox such as support@example.com, and whether its domain has a mail server, together with the domain's age and lookalike signals. It returns a verdict too: a throwaway address answers suspicious. It sends no email and does not probe the mailbox. A call costs 1 credit, a free key gets 1,000 credits a month, no card, and it answers in median 211 ms.

Endpoint
GEThttps://api.bewary.app/v1/email/{address}
Price
1 credit
Free key
1,000 credits a month, no card
Speed
Median 211 ms, measured
Returns
verdict, p_scam, entities with typed facts, reason codes
MCP tool
lookup_email

Try it

Free from this page: 10 lookups a day
GET/v1/email/{address}
Recorded answer, October 31, 2026
Suspiciousp_scam0.5000
Reason codes
High
Disposable emailEMAIL_DISPOSABLE
Entities
emailsignup@mailinator.comSuspicious
domainmailinator.comSafe

Call it

curl "https://api.bewary.app/v1/email/signup%40mailinator.com"

Act on the result

Copy-paste code that turns the answer into a decision. It runs with or without BEWARY_API_KEY. TypeScript uses bewary.d.ts.

import os, requests
from urllib.parse import quote

def accept_signup_email(address):
    key = os.environ["BEWARY_API_KEY"]          # a free key: bewary.app/account
    headers = {"Authorization": f"Bearer {key}"}
    try:
        r = requests.get("https://api.bewary.app/v1/email/" + quote(address, safe=""),
                         headers=headers, timeout=10)
        r.raise_for_status()
    except requests.RequestException:
        return True                        # never block a real customer on our outage
    result = r.json()
    facts = result["entities"][0]["facts"]
    if facts["disposable"] or facts["mx"] is False or result["verdict"] == "scam":
        return False
    return True

print(accept_signup_email("signup@mailinator.com"))   # False

Response

The fields you will use

entities[0].facts.disposable
A throwaway provider such as mailinator.com.
entities[0].facts.mx
The domain has a mail server.
entities[0].facts.free_provider
Gmail, Outlook, Yahoo and the like.
entities[0].facts.role_account
A shared role mailbox, such as support@example.com or billing@example.com.
entities[1].facts
The domain: age, lookalike, scam list.
{  "schema_version": "1.7.0",  "request_id": "req_01M69WHTR4Y1J09ZPHR73E5MR0",  "checked_at": "2026-10-31T21:06:21Z",  "engine": "bewary-engine/3.0.0",  "models": {    "calibration": "interim-band-v0"  },  "input": {    "kind": "lookup",    "channel": "unknown",    "language": null,    "region": null  },  "verdict": "suspicious",  "p_scam": 0.5,  "risk_score": 50,  "confidence": 1,  "classification": null,  "reason_codes": [    "EMAIL_DISPOSABLE"  ],  "entities": [    {      "id": "e1",      "type": "email",      "value": "signup@mailinator.com",      "normalized": "signup@mailinator.com",      "role": "mentioned",      "verdict": "suspicious",      "p_scam": 0.5,      "risk_score": 50,      "reason_codes": [        "EMAIL_DISPOSABLE"      ],      "facts": {        "domain": "e2",        "mx": true,        "disposable": true,        "free_provider": false,        "role_account": false,        "disposable_status": "unknown",        "disposable_checked_at": null      },      "related": [        "e2"      ],      "datasets": [        {          "dataset": "email_providers",          "coverage": "WW",          "in_coverage": true        },        {          "dataset": "dns",          "coverage": "WW",          "in_coverage": true        },        {          "dataset": "registration",          "coverage": "WW",          "in_coverage": true        },        {          "dataset": "breaches",          "coverage": "WW",          "in_coverage": true        },        {          "dataset": "community_reports",          "coverage": "WW",          "in_coverage": true        }      ]    },    {      "id": "e2",      "type": "domain",      "value": "mailinator.com",      "normalized": "mailinator.com",      "role": "mentioned",      "verdict": "safe",      "p_scam": 0.0013,      "risk_score": 0,      "reason_codes": [        "DOMAIN_AGE_GT_1Y"      ],      "facts": {        "registrable_domain": "mailinator.com",        "registered_domain": "mailinator.com",        "tld": "com",        "tld_abuse": "low",        "registered_at": "2003-07-02T13:50:53Z",        "expires_at": "2028-07-02T13:50:53Z",        "age_days": 8521,        "age_bucket": "gt_1y",        "registrar": "GoDaddy.com, LLC",        "dns": {          "resolves": true,          "a": [            "104.20.46.162",            "172.66.146.138"          ],          "mx": null,          "ns": [            "betty.ns.cloudflare.com",            "james.ns.cloudflare.com"          ]        },        "status": "live",        "cert_first_seen": null,        "lookalike": null,        "platform": "none",        "allowlisted": false,        "listed": false,        "seen_in_checks_7d": null,        "country": null,        "target_countries": null,        "list_count": null,        "site": null,        "platform_status": null,        "registry_status": [          "client_delete_prohibited",          "client_renew_prohibited",          "client_transfer_prohibited",          "client_update_prohibited"        ],        "hold": "none",        "registered": true,        "registration_checked_at": "2026-10-30T19:19:20Z",        "archive": {          "checked_at": "2026-10-30T19:20:44Z",          "captured": true,          "first_capture_at": "2003-07-24T11:42:16Z",          "last_capture_at": "2026-10-18T15:10:53Z",          "captured_before_registration": false,          "months_before_registration": null,          "last_capture_before_registration_at": null        },        "first_seen_by_bewary": null,        "first_listed_publicly": null      },      "related": [],      "datasets": [        {          "dataset": "registration",          "coverage": "WW",          "in_coverage": true        },        {          "dataset": "dns",          "coverage": "WW",          "in_coverage": true        },        {          "dataset": "certificates",          "coverage": "WW",          "in_coverage": true        },        {          "dataset": "web_archive",          "coverage": "WW",          "in_coverage": true        },        {          "dataset": "threat_feeds",          "coverage": "WW",          "in_coverage": true        },        {          "dataset": "threat_aggregates",          "coverage": "WW",          "in_coverage": true        },        {          "dataset": "brand_registry",          "coverage": "WW",          "in_coverage": true        },        {          "dataset": "platform_pages",          "coverage": "WW",          "in_coverage": true        },        {          "dataset": "community_reports",          "coverage": "WW",          "in_coverage": true        }      ]    }  ],  "signals": [    {      "code": "EMAIL_DISPOSABLE",      "entity": "e1",      "severity": "high",      "weight": 50,      "source_class": "heuristic",      "p": null,      "dataset": "email_providers",      "coverage": "WW",      "evidence": {        "domain": "mailinator.com"      }    },    {      "code": "DOMAIN_AGE_GT_1Y",      "entity": "e2",      "severity": "info",      "weight": -45,      "source_class": "first_party",      "p": null,      "dataset": "registration",      "coverage": "WW",      "evidence": {        "age_days": 8521      }    }  ],  "degraded": false,  "degraded_reasons": [],  "cached": false,  "explanation": null}

Real responses, captured from the live API on 2026-10-31. Every response has this shape: see Response format.

Email address facts

Every key is in every response, null when unknown. A key marked Coming stays null until its source ships, so you can code against it now.

KeyTypeMeaning
domain entity id or null The domain entity, with its own facts.
mx boolean or null The domain has a mail server.
disposable boolean or null A throwaway email provider.
free_provider boolean or null Gmail, Outlook, Yahoo and the like.
role_account boolean or null A shared role mailbox, such as support@example.com or billing@example.com.
disposable_status receiving | dead | unknown or null For a throwaway provider: whether it still takes mail.
disposable_checked_at timestamp or null When the throwaway domain was last re-checked.

Parameters

NameTypeDescription
addresspath, required string The email address, URL-encoded.

Questions

How do I detect disposable email addresses with an API?

GET /v1/email/{address}. facts.disposable is true for throwaway providers such as mailinator.com. The same answer says whether the address is a free provider or a role mailbox and whether the domain has a mail server.

Does it check that the mailbox exists?

No. It checks the domain's mail server, not the mailbox. It sends no email and makes no SMTP probe.

What verdict does a Gmail or Outlook address get?

unknown: Bewary cannot vouch for a personal address at a free provider, and nothing about it is suspicious either. For a sign-up form, decide on the facts (disposable, mx), not the verdict. A throwaway address answers suspicious.

Does a role address like support@example.com count against it?

role_account is a fact for your own rules. It does not change the verdict.

How fast is it?

Measured median 211 ms for an address seen for the first time.

Used for

Reason codes it can return

CodeMeaningSeverity
LISTED_BLOCKLISTOn scam blocklistCritical
DOMAIN_ALLOWLISTEDEstablished domain (allowlist)Info
DOMAIN_AGE_GT_1YEstablished domainInfo
DOMAIN_AGE_90D_1YEstablished domain (<1y)Info
DOMAIN_AGE_30_90DRecently-registered domainMedium
DOMAIN_AGE_LT_30DBrand-new domainMedium
DOMAIN_MULTITENANT_PLATFORMHosted on a public platformInfo
DOMAIN_AGE_UNKNOWNDomain age unknownInfo
DOMAIN_LOOKALIKE_BRAND_WORDLookalike domainMedium
DOMAIN_MIXED_SCRIPTFake domain (mixed alphabets)High
DOMAIN_HOMOGLYPH_BRANDFake domain (homoglyph)High
DOMAIN_BRAND_ON_ABUSED_TLDFake domain (brand + suspicious TLD)High
DOMAIN_TYPO_BRANDPossible fake domain (typo)Medium
DOMAIN_BRAND_SCAM_WORDPossible fake domain (brand + scam word)Medium
TLD_HIGH_ABUSERisky domainMedium
EMAIL_DISPOSABLEDisposable emailHigh
EMAIL_SENDER_DOMAIN_FORGEDForged sender domainHigh
EMAIL_DOMAIN_NO_MXDomain can't receive emailMedium
EMAIL_FREE_PROVIDERFree email addressMedium
EMAIL_HIGH_RISKHigh-risk senderHigh
EMAIL_RISKYRisky senderMedium
DOMAIN_DECEPTIVE_STRUCTUREA brand name placed before an @ so the real host hides after itHigh
DOMAIN_CERT_LT_48HFirst TLS certificate issued in the last 48 hoursMedium
LISTED_CAUTIONOn a broad threat list that also holds spam and malware hostsMedium
PROTECTIVE_DNS_BLOCKEDBlocked by public protective DNS resolversMedium
PLATFORM_TAKEDOWNThe hosting platform took it downHigh
PLATFORM_WARNINGThe platform shows a phishing or malware warning in front of itHigh
DOMAIN_REGISTRY_HOLDThe registry holds the domain out of the DNSHigh
DOMAIN_REGISTRAR_HOLDThe registrar suspended the domainMedium

Reserved codes are in the contract, not emitted yet. All reason codes

Updated · This page as Markdown · Changelog