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 the country parameter 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 | invalid summarizing 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:

  1. E.164 with leading + — country auto-detected. {"phone": "+33612345678"}
  2. National format — requires the country parameter (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 apiKey collection variable, and you're ready.