Email validation API
Syntax, mail server, disposable, and role checks, typo suggestions, and a live mailbox check. One call tells you whether to accept the address, ask again, or block it.
1 credit per check · $4.95 per 1,000 on Starter, $2.00 on Volume. Billed, including addresses that fail the free checks. Free if the mailbox check couldn't run.
Request
{
"email": "maria@northwind.io"
}Response approve
{
"verdict": {
"status": "valid",
"reason": "mailbox_exists"
},
"risk": {
"score": 0,
"level": "low"
},
"details": {
"smtp_check": "deliverable",
"is_disposable": false,
"is_role": false,
"is_catch_all": false,
"did_you_mean": null,
"provider": "google"
},
"recommendation": {
"action": "approve"
}
}What you get back
Every response has a verdict, a risk score, and a recommended action. These are the fields specific to this check; the API reference lists them all.
- smtp_check
- deliverable, undeliverable, catch_all, unknown, skipped (you turned it off), or unavailable (couldn't run; not charged)
- is_disposable
- The domain hands out throwaway inboxes
- is_role
- A shared inbox like support@ rather than a person
- did_you_mean
- A corrected address when the domain looks like a typo
- provider
- Mailbox provider, from the domain or its mail servers
- domain_age_days
- How long ago the domain was registered
What it checks
- Mailbox exists (SMTP)
- Disposable and burner domains
- Role inboxes like info@ and sales@
- Typo fixes: gmial.com → gmail.com
- Catch-all detection
- SPF, DMARC, and domain age
Try it in a minute
curl https://api.validationcheck.net/v1/email \
-H "Authorization: Bearer $VC_KEY" \
-H "Content-Type: application/json" \
-d '{"email":"maria@northwind.io"}'const res = await fetch("https://api.validationcheck.net/v1/email", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VC_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"email": "maria@northwind.io"
}),
});
const { data } = await res.json();
console.log(data.recommendation.action);import os, requests
res = requests.post(
"https://api.validationcheck.net/v1/email",
headers={"Authorization": f"Bearer {os.environ['VC_KEY']}"},
json={
"email": "maria@northwind.io"
},
timeout=15,
)
print(res.json()["data"]["recommendation"]["action"])Use a free test key to get documented answers without spending credits.
Where teams use it
Signup forms
Block disposable addresses and fix typos before the welcome email bounces.
List cleaning
Remove dead inboxes before a campaign hurts your sender reputation.
Lead scoring
Flag free and role addresses on B2B forms.
Questions
Do you send an email to check the mailbox?
No. The mailbox check talks to the receiving mail server and stops before anything is sent.
What's a catch-all domain?
A domain that accepts mail for any address, so a single inbox can't be confirmed. We mark these risky rather than valid.
Is it charged when the syntax is wrong?
Yes, every email check costs 1 credit. Asking again within 7 days is free.
Pairs well with
{
"status": "valid",
"reason": "carrier_confirmed",
"e164": "+14155552671",
"line_type": "mobile",
"ported": false,
"action": "approve"
}Phone validation
Valid, reachable, and what kind of line it is.
- Valid and possible, in 240+ regions
- Mobile, landline, VoIP, toll-free
- Carrier and porting (US/CA)
- E.164, national, and international formats
{
"status": "risky",
"reason": "tor_exit",
"connection_type": "datacenter",
"action": "block"
}IP intelligence
Where a visitor is, and whether they're hiding it.
- Country, region, city, time zone
- ASN, network, and ISP
- VPN, proxy, and Tor detection
- AWS, Google Cloud, Cloudflare, Oracle ranges
{
"status": "registered",
"reason": "new",
"domain": "example-deals.com",
"age_days": 4,
"is_newly_registered": true,
"action": "review"
}Domain age
Brand-new domains are where phishing lives.
- Created, updated, and expiry dates
- Age in days and an age band
- Newly registered flag (under 30 days)
- Registrar, nameservers, DNSSEC
Get started in 60 seconds
50 free trial credits. Free test keys. No card needed.