Email — entry 003 of 19

Disify

Verified Jul 2026

A free, keyless REST API that checks an email's syntax, DNS/MX records, whether its domain is disposable or on an allow-list, and whether its mailbox is a role address, returning a single JSON verdict. No signup is required for the core lookup, with paid business accounts available for higher volume.

Disify is a free, keyless email/domain reputation lookup: pass a full address or a bare domain and get back a single JSON verdict covering syntax validity, DNS/MX presence, whether the domain is disposable or allow-listed, and whether the mailbox itself is a role address. A live GET this run against `/email/test@mailinator.com` returned `"disposable":true` with `"confidence":100`, and a separate live GET against `/domain/mailinator.com` returned a byte-identical body -- exactly one field in the response actually depends on the part before the `@`, which the gotchas below pin down.

email-validationdisposable-emaildns-checkfree
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSEnabledCallable directly from browser JavaScript.
PricingFreemiumA usable free tier exists, with paid plans for more volume.
FormatsJSONResponses can be requested as JSON.

GreatAPIs Score

Score71out of 100
Authentication25/25No authentication required
Pricing17/20Freemium tier available
Docs0/20No docs or spec available
Formats9/15Single response format
Freshness20/20Verified within 6 months

Embed this badge

Scored 71 on greatapis.com
<a href="https://greatapis.com/api/disify/"><img src="https://greatapis.com/badge/disify.svg" alt="Scored 71 on greatapis.com"></a>

Auth quickstart

  1. No API key, signup, or credit card required -- a live GET this run against `/email/test@mailinator.com` returned a genuine verdict with zero credentials, and `x-ratelimit-limit: 30` was present on every response, confirming the keyless tier's real ceiling.
Stored keyNo key stored

Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.

Check whether an email's domain is disposable

GEThttps://disify.com/api/email/test@mailinator.com

200 application/json

{"format":true,"domain":"mailinator.com","disposable":true,"dns":true,"whitelist":false,"confidence":100,"signals":["blacklist_exact","keyword_match","mx_blacklist_exact"],"domain_info":{"tld":"com","is_subdomain":false,"parent_domain":null},"role":false,"free":false}

A live GET this run against `/domain/mailinator.com` (no mailbox, just the bare domain) returned this exact same body -- but that holds because `test` isn't a role address; see the `role` gotcha below before treating the two routes as interchangeable.

Try it

Developer reference

Base URLhttps://disify.com/api
Key endpoints
  • GET/email/{email}
  • GET/domain/{domain}

Gotchas & limits

  • A syntactically invalid address is real **HTTP 200 with `{"format": false}`**, not a 4xx -- a live GET this run against `/email/notanemail` returned exactly that single-key body. Check `format` in the payload, not the HTTP status, to detect a parse failure.
  • The response shape is not fixed -- it depends on the domain's reputation, confirmed live this run. `/email/test@mailinator.com` (a blacklisted domain) returned a `signals` array (`["blacklist_exact","keyword_match","mx_blacklist_exact"]`) and no `mx_info` key, while `/email/test@gmail.com` (a whitelisted domain) returned an `mx_info` array (5 real Gmail MX hosts) and no `signals` key. Don't assume every field is always present.
  • **`role` is the only field derived from the mailbox part** -- every other field is decided by the domain alone, confirmed live this run. `/domain/mailinator.com` and `/email/test@mailinator.com` returned byte-identical JSON, character for character, but `/email/admin@mailinator.com` differed from that same domain lookup on exactly one line: `"role":true` instead of `"role":false`. Across five local parts on the one domain this run, `test` and `xyzzy9` returned `"role":false` while `admin`, `info`, and `postmaster` returned `"role":true`. So the two routes are interchangeable only when you don't care about `role`.
  • `x-ratelimit-limit: 30` is present on every keyless response along with a counting-down `x-ratelimit-remaining` -- confirmed across three consecutive live calls this run (29, 28, 27 remaining). There's no documented reset window in the headers themselves, so budget calls conservatively.