Email validation with zero dependencies.
Check syntax, MX records, disposable domains and aliases. Free, open source, and nothing leaves your servers.
npm i @isan3/checkemailNot using Node.js? Run it with Docker
How it works
Four quick steps, cheapest first. Bad addresses stop early.
Instant local checks
Format, 9,000+ disposable domains and role inboxes like
support@are checked with no network call.DNS and mail server
Confirms the domain exists and has MX records, so it can actually receive mail.
Provider and aliases
Spots Gmail, Outlook, Proton and more, and turns
john.doe+test@gmail.comintojohndoe@gmail.com.Confidence score
Every signal adds up to a 0 to 100 score with a clear status like
LIKELYorDISPOSABLE.
Zero dependencies. Zero monthly fees.
Paid email APIs see every address you send and bill per check. checkemail is a library you run yourself.
Private
Addresses never leave your servers. Only the domain is looked up in DNS, and nothing is tracked.
Free forever
MIT licensed. No API keys, no plans, no per-check fees.
No dependencies
Uses the DNS module built into Node.js. Nothing else to install or audit.
Always up to date
The disposable list is refreshed every Monday and Thursday by a GitHub Action.
Use it anywhere
Import it in JavaScript, call it over HTTP from any language, or host this page for free.
import { validateEmail } from '@isan3/checkemail';
const { confidence } = await validateEmail('john.doe+test@gmail.com');
console.log(confidence.status, confidence.canonical_email); // LIKELY johndoe@gmail.com
Node.js 18+ or Bun. TypeScript types included.
docker run -p 3000:3000 saiakashneela/checkemail
curl "http://localhost:3000/validate?email=john.doe%2Btest@gmail.com"
import requests
r = requests.get('http://localhost:3000/validate', params={'email': 'john@gmail.com'})
print(r.json()['confidence']['status'])
resp, err := http.Get("http://localhost:3000/validate?email=" + url.QueryEscape("john@gmail.com"))
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
var result map[string]any
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result["confidence"])
using System.Net.Http.Json;
using System.Text.Json;
using var http = new HttpClient();
var result = await http.GetFromJsonAsync<JsonElement>(
$"http://localhost:3000/validate?email={Uri.EscapeDataString("john@gmail.com")}");
Console.WriteLine(result.GetProperty("confidence").GetProperty("status"));
var email = URLEncoder.encode("john@gmail.com", StandardCharsets.UTF_8);
var request = HttpRequest.newBuilder()
.uri(URI.create("http://localhost:3000/validate?email=" + email))
.build();
var response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Endpoints: GET /validate?email= and GET /health. Port set by PORT (default 3000), CORS open for GET. Try it with this page: ?api=http://localhost:3000
git clone https://github.com/SaiAkashNeela/checkemail
cd checkemail
npx wrangler pages deploy website --project-name checkemail
The site is plain static files, so it runs free on Cloudflare Pages or any static host. The demo runs checkemail's checks in the visitor's browser and resolves DNS over HTTPS through 1.1.1.1. There is no server to run.
Questions
Does checkemail confirm that a mailbox exists?
No. checkemail never opens an SMTP connection or sends a RCPT probe. It verifies syntax, that the domain resolves in DNS, and that it publishes MX records, then scores the address. LIKELY means the domain can receive mail; it does not prove the individual mailbox exists.
How does checkemail detect disposable email addresses?
It matches the domain exactly against the community-maintained disposable-email-domains blocklist (9,000+ domains). The package republishes with a fresh copy every Monday and Thursday via GitHub Actions. A disposable match returns status DISPOSABLE with score 0 before any DNS lookup.
How does checkemail handle Gmail aliases like john.doe+test@gmail.com?
It strips the +tag, removes dots from the local part and folds googlemail.com into gmail.com. john.doe+test@gmail.com returns alias_status: ALIAS_CONFIRMED and canonical_email: johndoe@gmail.com, so you can detect repeat signups.
Which email providers can checkemail identify?
Gmail, Microsoft consumer (Outlook, Hotmail, Live, MSN), iCloud, Proton Mail, Yahoo, Fastmail, Zoho Mail, Yandex Mail and Google Groups from the domain. Custom domains hosted on Google Workspace or Microsoft 365 are detected from their MX and SPF records.
Can I use checkemail from Python, Go, Java, .NET or PHP?
Yes. Run the Docker image (docker run -p 3000:3000 saiakashneela/checkemail) and call GET /validate?email= from any HTTP client. The response is the same JSON the Node.js package returns.
Can checkemail run in the browser without a server?
Yes. The demo on checkemail.dev runs the same checks directly in the browser and resolves DNS over HTTPS through Cloudflare's 1.1.1.1. The whole site is one static HTML file you can host for free on Cloudflare Pages or GitHub Pages.
What does the checkemail confidence score mean?
Any status other than LIKELY scores 0. Otherwise points are summed: +20 domain resolves, +20 MX records, +20 not disposable, +20 no alias signals (+10 alias possible, -5 alias confirmed), +10 not a role inbox. A clean personal address scores 90.
Is checkemail free for commercial use?
Yes. checkemail is MIT licensed, has no API keys, no per-check pricing and no usage tiers.