Introduction
The Phone Validation API is a REST service that verifies phone numbers in real time: format (E.164), country, region, line type (mobile / landline / VoIP / toll-free), carrier, and disposable / burner detection — all in a single HTTP call. No SMS sent, no PSTN ring, no charge to the number owner.
Why a phone validation API?
- Clean your signup forms — block invalid, misspelled, or burner numbers before they hit your database.
- Reduce fraud signals — flag VoIP / disposable carriers (Google Voice, TextNow, Hushed, Pinger, Burner…).
- Detect line type — distinguish mobile vs landline vs VoIP vs toll-free for routing decisions.
Base URL
https://phonevalidationapi.com/api/v1
What we check
- Format — E.164 parsing via Google's
libphonenumber(the reference library; same one Twilio, WhatsApp, Apple use). - Country & region — auto-detected from
+prefix, or resolved using thecountryparameter for national-format input. - Line type — mobile, fixed_line, voip, toll_free, premium_rate, shared_cost, personal_number, pager, uan, voicemail, unknown.
- Carrier — name where libphonenumber has data (varies by country).
- Disposable / VoIP — cross-checked against our maintained list of burner / VoIP carriers + known prefix ranges.
- Confidence — single label
verified | likely | uncertain | low | invalidsummarizing all signals.
First request
curl https://phonevalidationapi.com/api/v1/validate \
-H "Authorization: Bearer pvs_live_XXXX..." \
-H "Content-Type: application/json" \
-d '{"phone":"+33612345678"}'
Example response:
{
"valid": true,
"confidence": "verified",
"score": 0.95,
"reason": "valid",
"input": "+33612345678",
"formatted": {
"e164": "+33612345678",
"national": "06 12 34 56 78",
"international": "+33 6 12 34 56 78"
},
"country": { "iso2": "FR", "code": 33 },
"line_type": "mobile",
"carrier": "SFR",
"is_disposable": false,
"is_possible": true,
"level": "basic",
"checks": {
"format": "pass",
"disposable": "pass",
"hlr": "skipped"
},
"credits_remaining": 24
}
The confidence field
| Label | Meaning |
|---|---|
verified |
Mobile or fixed line in a well-regulated market with known carrier metadata. |
likely |
Valid format, plausible line type, but some ambiguity (e.g. fixed_or_mobile) |
uncertain |
Ambiguous line type (premium, shared cost, UAN…) or low-confidence country. |
low |
VoIP / disposable / burner carrier, or matched a flagged prefix. |
invalid |
Format/parse failed or number not possible. |
For high-trust signup, require confidence === "verified". For simple anti-burner filtering, reject confidence === "low".
Input formats
Two formats are accepted:
- E.164 with leading
+— country auto-detected.{"phone": "+33612345678"} - National format — requires the
countryparameter (ISO-3166 alpha-2:FR,US,GB, …).{"phone": "0612345678", "country": "FR"}
About latency
Format-only validation typically returns in 5–30ms since it runs entirely in-memory with no external network calls. For lists larger than ~200 numbers use the async batch endpoint to avoid HTTP timeouts.
OpenAPI spec & Postman collection
- 📄 OpenAPI 3.0 spec — import into Swagger UI, Stoplight, Redoc, or generate clients with
openapi-generator. - 📦 Postman collection — import directly into Postman, set the
apiKeycollection variable, and you're ready.