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.comreturned a genuine verdict with zero credentials, andx-ratelimit-limit: 30was 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.
Endpoints
Email2
Email address validation
POST/emailValidate email (POST)
application/x-www-form-urlencoded (required)
| Status | Description | Schema |
|---|---|---|
200 | Validation result (single or bulk) | — |
422 | Bulk limit exceeded | Error |
429 | — | — |
GET/email/{email}Validate email address
| Name | In | Required | Type |
|---|---|---|---|
email | path | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | Validation result | EmailValidationResult |
429 | — | — |
Domain2
Domain validation
POST/domainValidate domain (POST)
application/x-www-form-urlencoded (required)
| Status | Description | Schema |
|---|---|---|
200 | Validation result | EmailValidationResult |
429 | — | — |
GET/domain/{domain}Validate domain
| Name | In | Required | Type |
|---|---|---|---|
domain | path | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | Validation result | EmailValidationResult |
429 | — | — |
Bulk1
Bulk validation and results
GET/view/{session}View bulk validation results
| Name | In | Required | Type |
|---|---|---|---|
session | path | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | Bulk results | BulkResultsResponse |
404 | Session not found or expired | — |
Try it
Developer reference
https://disify.com/apiAnonymous: 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}
- 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/notanemailreturned exactly that single-key body. Checkformatin 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 asignalsarray (["blacklist_exact","keyword_match","mx_blacklist_exact"]) and nomx_infokey, while/email/test@gmail.com(a whitelisted domain) returned anmx_infoarray (5 real Gmail MX hosts) and nosignalskey. Don't assume every field is always present. roleis the only field derived from the mailbox part — every other field is decided by the domain alone, confirmed live this run./domain/mailinator.comand/email/test@mailinator.comreturned byte-identical JSON, character for character, but/email/admin@mailinator.comdiffered from that same domain lookup on exactly one line:"role":trueinstead of"role":false. Across five local parts on the one domain this run,testandxyzzy9returned"role":falsewhileadmin,info, andpostmasterreturned"role":true. So the two routes are interchangeable only when you don't care aboutrole.x-ratelimit-limit: 30is present on every keyless response along with a counting-downx-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
- gained an OpenAPI spec and a pricing page