Email — entry 014 of 19
MailCheck.ai
MailCheck.ai has rebranded to UserCheck, but its original keyless lookup endpoint keeps working unchanged: pass an address and get back disposable, free-provider, MX, and domain-age signals in one JSON response, aimed at blocking throwaway signups. The rebranded product adds a free-to-start paid tier for higher-volume, authenticated use.
MailCheck.ai has rebranded to UserCheck, but its original keyless lookup keeps working unchanged: pass a domain or a full address and get back disposable, free-provider, MX, SPF/DMARC, and domain-age signals in one JSON response. A live GET this run against `/domain/mailinator.com` returned `"disposable":true` and `"spam":true` alongside a fully valid `"spf":"strict"` and `"dmarc":"reject"` -- a disposable-mail domain that still runs real, correctly configured mail infrastructure.
GreatAPIs Score
Auth quickstart
- No API key, signup, or credit card required -- a live GET this run against `/domain/mailinator.com` returned a genuine verdict with zero credentials. The keyless tier is real but tight: `x-ratelimit-limit: 5` was present on every successful response, and this run's own second call already left `x-ratelimit-remaining: 0` (see the gotcha below).
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
Look up a domain's disposable/deliverability signals
GEThttps://api.usercheck.com/domain/mailinator.com
{"status":200,"domain":"mailinator.com","domain_age_in_days":8430,"mx":true,"mx_records":[{"hostname":"mail.mailinator.com","priority":1},{"hostname":"mail2.mailinator.com","priority":1}],"mx_providers":[],"spf":"strict","dmarc":"reject","disposable":true,"public_domain":false,"relay_domain":false,"free_subdomain":false,"spam":true,"did_you_mean":null}The sibling `/email/{email}` route is keyless too and returns overlapping fields plus a few email-specific ones -- a live GET this run against `/email/test@mailinator.com` additionally returned `"normalized_email"`, `"alias":false`, and `"role_account":true`, on top of every field shown above.
Try it
Developer reference
https://api.usercheck.com- GET/domain/{domain}
- GET/email/{email}
Gotchas & limits
- The keyless tier's real ceiling is **`x-ratelimit-limit: 5`**, confirmed live this run -- two successful lookups (`/domain/mailinator.com`, then `/email/test@mailinator.com`) left `x-ratelimit-remaining` at 1 then 0, and a third call in the same run returned a genuine **HTTP 429** `{"status":429,"error":"Too many requests"}` with `retry-after: 3245` (roughly 54 minutes). Note the 429 carries **only** `retry-after` -- no `x-ratelimit-*` headers at all -- so the header you'd use to see remaining quota vanishes exactly when you've run out. Budget calls carefully; this quota resets far slower than Disify's.
- Even the rate-limit error's own JSON body carries a `status` key mirroring the HTTP status code (`"status":429`) -- confirmed live this run, the same envelope shape the entry's successful 200 responses use (`"status":200`). Check the body's `status`, not just the transport status code, when scripting around this API.
- `mailinator.com` is flagged both `"disposable":true` and `"spam":true` while still carrying fully valid `"spf":"strict"` and `"dmarc":"reject"` records and an 8430-day-old registration -- confirmed live this run. Don't assume a disposable-mail domain lacks real, correctly configured mail infrastructure.
- `/domain/{domain}` and `/email/{email}` overlap but aren't identical -- confirmed live this run: the domain route's response has no `email`, `normalized_email`, `alias`, or `role_account` keys, all of which the email route returns alongside the same `domain_age_in_days`/`mx`/`spf`/`dmarc`/`disposable` fields.