Email — entry 003 of 19
Disify
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.
GreatAPIs Score
Auth quickstart
- 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.
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
{"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
https://disify.com/api- 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.