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

Score91out of 100
Authentication25/25No authentication required
Pricing17/20Freemium tier available
Docs20/20Machine-readable spec file bundled
Formats9/15Single response format
Freshness20/20Verified within 6 months

Embed this badge

Scored 91 on greatapis.com
<a href="https://greatapis.com/api/disify/"><img src="https://greatapis.com/badge/disify.svg" alt="Scored 91 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.

Endpoints

Servers
https://disify.com/api
Email2

Email address validation

POST/emailValidate email (POST)
Request body

application/x-www-form-urlencoded (required)

Responses
StatusDescriptionSchema
200Validation result (single or bulk)
422Bulk limit exceededError
429
GET/email/{email}Validate email address
Parameters
NameInRequiredType
emailpathyesstring
Responses
StatusDescriptionSchema
200Validation resultEmailValidationResult
429
Domain2

Domain validation

POST/domainValidate domain (POST)
Request body

application/x-www-form-urlencoded (required)

Responses
StatusDescriptionSchema
200Validation resultEmailValidationResult
429
GET/domain/{domain}Validate domain
Parameters
NameInRequiredType
domainpathyesstring
Responses
StatusDescriptionSchema
200Validation resultEmailValidationResult
429
Bulk1

Bulk validation and results

GET/view/{session}View bulk validation results
Parameters
NameInRequiredType
sessionpathyesstring
Responses
StatusDescriptionSchema
200Bulk resultsBulkResultsResponse
404Session not found or expired

Try it

Developer reference

Base URLhttps://disify.com/api
Rate limit

Anonymous: 30 requests/minute, 1,000/day per IP. Free account: 60 requests/minute, 10,000/day, 30,000/month -- per docs.disify.com/guide/rate-limits.html, confirmed live via x-ratelimit-limit: 30 on disify.com/api/email/{address}

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.

Changelog

Spec version2.1.0
Tracked paths5
  • Aug 2026gained an OpenAPI spec and a pricing page

Tracking since Sep 2026. See every tracked change ↗ ·Subscribe with RSS ↗