Signup fraud check API
Send the email, IP, and phone from a signup or checkout and get one verdict. Cross-signals catch what single checks miss, like a disposable email behind a VPN or a phone from another country.
Sum of parts per check. Costs the sum of the parts that are billed.
Request
{
"email": "jdoe@mailinator.com",
"ip": "203.0.113.66",
"phone": "+44 7700 900123",
"context": "signup"
}Response block
{
"verdict": {
"status": "fail",
"reason": "email:disposable"
},
"risk": {
"score": 90,
"level": "critical",
"factors": [
"email:disposable",
"ip:vpn",
"disposable_and_vpn"
]
},
"details": {
"signals": {
"phone_ip_country_match": false,
"disposable_and_vpn": true
}
},
"recommendation": {
"action": "block"
}
}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.
- details.email / ip / phone
- The full result of each part, with its own verdict and risk
- details.signals
- Cross-checks between the parts
- risk.factors
- Every signal, prefixed with the part it came from
- recommendation.action
- approve, verify, review, or block
What it checks
- Runs email, IP, and phone together
- One risk score and action
- Email vs IP country
- Phone vs IP country
- Disposable + VPN combination
- Per-part details included
Try it in a minute
curl https://api.validationcheck.net/v1/check \
-H "Authorization: Bearer $VC_KEY" \
-H "Content-Type: application/json" \
-d '{"email":"jdoe@mailinator.com","ip":"203.0.113.66","phone":"+44 7700 900123","context":"signup"}'const res = await fetch("https://api.validationcheck.net/v1/check", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VC_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"email": "jdoe@mailinator.com",
"ip": "203.0.113.66",
"phone": "+44 7700 900123",
"context": "signup"
}),
});
const { data } = await res.json();
console.log(data.recommendation.action);import os, requests
res = requests.post(
"https://api.validationcheck.net/v1/check",
headers={"Authorization": f"Bearer {os.environ['VC_KEY']}"},
json={
"email": "jdoe@mailinator.com",
"ip": "203.0.113.66",
"phone": "+44 7700 900123",
"context": "signup"
},
timeout=15,
)
print(res.json()["data"]["recommendation"]["action"])Use a free test key to get documented answers without spending credits.
Where teams use it
Signups
One call in your signup handler instead of three.
Checkout
Hold orders whose email, phone, and IP don't agree.
Lead forms
Score inbound leads before they reach sales.
Questions
Do I need to send all three?
No. Send any combination of email, ip, and phone; you're billed for the parts you send.
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": "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
Get started in 60 seconds
50 free trial credits. Free test keys. No card needed.