Product Email Validation API
Endpoint GET /validate
Authentication X-Api-Key header
Response JSON · REST
Infrastructure Fully hosted
17k+
Disposable domains
Throwaway blocklist, refreshed every 24h
6
Validation checks
Format, MX, SMTP, catch-all, disposable, role
0–1
Confidence score
Weighted, clamped, adjustable threshold
REST
No SDK required
One GET request, JSON response
Hosted API · No infra required

Email validation
with real SMTP
proof.

One GET request returns format validity, MX records, a live SMTP probe, catch-all detection, disposable blocking, and a 0–1 confidence score. Sign up, grab a key, start validating in minutes.

Auth method
X-Api-Key header
SMTP probe
RCPT TO · port 25
Greylist retry
×2 · 2s delay
Fast mode
smtp=false · <100ms
Billing
Stripe · monthly quota
Free tier
100 lookups / month
API response example · GET /[email protected]
$ curl -s -H "X-Api-Key: lj_live_xKj4mN" \ "https://api.letterjudge.com/[email protected]" { "email": "[email protected]", "format_valid": true, "mx_found": true, "mx_records": ["mail.acme.io"], "smtp_reachable": true, "smtp_detail": "RCPT accepted", "catch_all": false, "disposable": false, "role_address": false, "score": 0.9, "did_you_mean": null }
FEATURES Six validation layers — nothing to configure
Format validation

Instant format check

Regex check on email structure. Fails fast before any I/O. Returns score 0.0 immediately on bad format.

RFC 5321 · max 254 chars
DNS resolution

MX record lookup

DNS resolution with 5s timeout. Returns all records sorted by priority. No MX = score stays at 0.2.

dnspython · 5s timeout
SMTP probe

Real mailbox verification

Real RCPT TO connection to the mail server. Handles greylisting with 2 automatic retries before reporting inconclusive.

RCPT TO · port 25 · retry ×2
Catch-all detection

Expose false positives

Second probe with a nonsense address exposes domains that accept any RCPT TO. A 250 response doesn't mean the mailbox exists.

zzz-no-such-mailbox probe
Disposable blocking

17,000+ blocked domains

Throwaway domain blocklist from the open-source disposable-email-domains registry. Auto-refreshed every 24 hours.

GitHub blocklist · 24h refresh
Role address flag

Identify team inboxes

Identifies generic inboxes (admin@, info@, noreply@, support@) that belong to teams, not people. Penalised −0.10.

admin, info, noreply, support…
PIPELINE Sequential validation — each step runs only if the previous passes
Step 01 · Format

Format check

Regex validates email structure before touching the network. Returns immediately with score 0.0 on failure.

RFC 5321 · max 254 chars · microseconds
Step 02 · MX Lookup

DNS resolution

DNS resolves MX records for the domain. Records returned sorted by priority with a 5s timeout.

dnspython · 5s timeout · sorted by priority
Step 03 · SMTP Ping

RCPT TO probe

Connects to the top-priority MX and issues a RCPT TO probe. 4xx greylisting retried twice before marking inconclusive.

RCPT TO · port 25 · greylist retry ×2
Step 04 · Catch-All

False positive check

A second probe to a guaranteed-nonexistent address detects domains that accept everything. Score penalised −0.10.

zzz-no-such-mailbox@domain · −0.10 penalty
API One endpoint · stateless · no SDK required
Endpoint & parameters
GET /validate
ParameterTypeDescription
email string required Address to validate. Max 254 chars.
X-Api-Key header required Your API key (lj_live_…).
smtp boolean optional Run SMTP probe. Default true. Set false for fast MX-only.
# full check curl "https://api.letterjudge.com/[email protected]" \ -H "X-Api-Key: lj_live_xKj4mN" # skip SMTP for speed curl "https://api.letterjudge.com/[email protected]&smtp=false" \ -H "X-Api-Key: lj_live_xKj4mN"
import requests r = requests.get( "https://api.letterjudge.com/validate", headers={"X-Api-Key": "lj_live_xKj4mN"}, params={"email": "[email protected]"}, timeout=20, ) r.raise_for_status() data = r.json() if data["score"] >= 0.6: print("looks good")
// Laravel / vanilla PHP $response = Http::withHeaders([ 'X-Api-Key' => 'lj_live_xKj4mN', ])->get('https://api.letterjudge.com/validate', [ 'email' => '[email protected]', ]); $data = $response->json(); return $data['score'] >= 0.4 && !$data['disposable'] && $data['mx_found'];
const res = await fetch( `https://api.letterjudge.com/[email protected]`, { headers: { "X-Api-Key": "lj_live_xKj4mN" } } ); const data = await res.json(); const valid = data.score >= 0.6 && !data.disposable && data.mx_found;
Response schema
emailstringNormalised address as submitted.
format_validboolRegex check on email structure.
mx_foundboolDomain has at least one valid MX record.
mx_recordsstring[]MX hostnames sorted by priority.
smtp_reachablebool | nulltrue = accepted · false = rejected · null = inconclusive.
smtp_detailstring | nullHuman-readable SMTP outcome or error.
catch_allbool | nullDomain accepts mail to any address. Score −0.10.
disposableboolFound in 17k-entry throwaway blocklist.
free_providerboolGmail, Outlook, Yahoo, iCloud, etc.
role_addressboolGeneric prefix: admin, info, noreply…
scorefloatWeighted confidence 0.0 – 1.0.
did_you_meanstring | nullCorrected address for common typos.
Error responses
401Invalid or missing API key.
429Monthly quota exceeded. Upgrade to continue.
422Email exceeds 254 characters.
SCORING Weighted confidence score 0.0 – 1.0 · set your own acceptance threshold
Factor
Weight
Valid format Regex passed
+0.20
MX record found Domain has mail servers
+0.30
SMTP accepted 250 OK from server
+0.50
SMTP inconclusive MX found, no SMTP answer
+0.25
SMTP rejected 5xx permanent error
−0.10
Catch-all domain Accepts any RCPT TO
−0.10
Disposable domain Throwaway provider
−0.20
Role address admin@, info@, noreply@…
−0.10

Suggested thresholds

≥ 0.4Lenient
format + MX only
≥ 0.6Balanced
MX + inconclusive SMTP
≥ 0.7Strict
confirmed SMTP + not catch-all
≥ 0.9Very strict
SMTP + clean + not role
SMTP caveats

SMTP probing runs from our infrastructure. Pass smtp=false for sub-100ms format + MX checks.

Greylisting causes temporary 4xx — retried twice with a 2s delay before returning smtp_reachable: null.

PRICING Start free · upgrade via Stripe billing portal · cancel any time
Free
$0 /mo
100 lookups / month
  • Format validation
  • MX lookup
  • Disposable detection
  • Role address flag
  • SMTP probe
  • Catch-all detection
Get started
Pro
$29 /mo
50,000 lookups / month
  • Everything in Starter
  • Multiple API keys
Get Pro
Business
$99 /mo
Unlimited lookups
  • Everything in Pro
  • Unlimited validations
  • Priority email support
Get Business
QUICKSTART Validating emails in minutes — no servers, no config files
01

Create a free account

Sign up at letterjudge.com. Your API key is generated immediately and shown once in the onboarding screen. No credit card required on the free tier.

dashboard → onboarding
Your API key lj_live_xKj4mN8pQr3vL7wEs... Copy it now — it won't be shown in full again.
02

Copy your API key

Your key appears once at signup and is always visible in the dashboard. It starts with lj_live_. Store it securely — treat it like a password.

dashboard → API Keys
Your key lj_live_xKj4mNxxxxxxxx... Created May 23, 2026 · Last used just now
03

Make your first request

Pass the key in the X-Api-Key header. Add smtp=false for sub-100ms MX-only checks when latency matters.

bash
$ curl -s "https://api.letterjudge.com/[email protected]" \ -H "X-Api-Key: lj_live_xKj4mN" | jq .score 0.9
Free tier: 100 lookups/month, no card required. SMTP probing included on all paid plans. Pass smtp=false for faster format + MX-only checks.
complete walkthrough
1 · full validation (SMTP included)
$ curl -s "https://api.letterjudge.com/[email protected]" \ -H "X-Api-Key: lj_live_xKj4mN8pQr3vL7wEs..." | jq '{score,smtp_reachable,disposable}' { "score": 0.9, "smtp_reachable": true, "disposable": false }
2 · fast check (MX only, ~50ms)
$ curl -s "https://api.letterjudge.com/[email protected]&smtp=false" \ -H "X-Api-Key: lj_live_xKj4mN8pQr3vL7wEs..." | jq .score 0.5
3 · check usage
$ curl -s https://api.letterjudge.com/usage \ -H "X-Api-Key: lj_live_xKj4mN8pQr3vL7wEs..." | jq '{plan,requests_this_period,limit}' { "plan": "free", "requests_this_period": 3, "limit": 100 }