Phone number validation API
Validate any number worldwide, format it in E.164, and get the line type and carrier. US and Canadian numbers get a live carrier record, including whether the number was ported.
1 credit per check · $4.95 per 1,000 on Starter, $2.00 on Volume. Billed for valid numbers only. Invalid numbers are free.
Request
{
"phone": "+1 415 555 2671"
}Response approve
{
"verdict": {
"status": "valid",
"reason": "carrier_confirmed"
},
"risk": {
"score": 0,
"level": "low"
},
"details": {
"e164": "+14155552671",
"line_type": "mobile",
"carrier": {
"name": "T-Mobile USA"
},
"ported": false,
"coverage": "live"
},
"recommendation": {
"action": "approve",
"sms_capable": true
}
}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.
- e164
- The number in international E.164 format
- line_type
- mobile, landline, voip, toll_free, premium, or unknown
- carrier
- Current carrier, with OCN for US/CA numbers
- ported
- Whether the number moved carriers
- coverage
- live (carrier record) or numbering_plan
- recommendation.sms_capable
- Whether texts can reach it
What it checks
- Valid and possible, in 240+ regions
- Mobile, landline, VoIP, toll-free
- Carrier and porting (US/CA)
- E.164, national, and international formats
- SMS-capable flag
- Free for invalid numbers
Try it in a minute
curl https://api.validationcheck.net/v1/phone \
-H "Authorization: Bearer $VC_KEY" \
-H "Content-Type: application/json" \
-d '{"phone":"+1 415 555 2671"}'const res = await fetch("https://api.validationcheck.net/v1/phone", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VC_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"phone": "+1 415 555 2671"
}),
});
const { data } = await res.json();
console.log(data.recommendation.action);import os, requests
res = requests.post(
"https://api.validationcheck.net/v1/phone",
headers={"Authorization": f"Bearer {os.environ['VC_KEY']}"},
json={
"phone": "+1 415 555 2671"
},
timeout=15,
)
print(res.json()["data"]["recommendation"]["action"])Use a free test key to get documented answers without spending credits.
Where teams use it
SMS verification
Skip landlines and send codes only to numbers that can receive them.
Fraud screening
VoIP numbers are cheap to create; add friction when you see one.
Lead routing
Send mobile numbers to SMS and landlines to your call team.
Questions
Which countries are covered?
Validation and formatting work for every country in the numbering plan. Live carrier records are for the US and Canada.
Why is an invalid number free?
You shouldn't pay to learn a number doesn't exist.
What does `coverage: numbering_plan` mean?
The answer comes from the country's numbering plan rather than a live carrier lookup.
Pairs well with
{
"status": "valid",
"reason": "mailbox_exists",
"smtp_check": "deliverable",
"is_disposable": false,
"is_role": false,
"action": "approve"
}Email validation
Know if an inbox is real before you send to it.
- Mailbox exists (SMTP)
- Disposable and burner domains
- Role inboxes like info@ and sales@
- Typo fixes: gmial.com → gmail.com
{
"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.