SFOLN

Catalogue / Company & lead intelligence

Phone Number Validator

sfoln/phone-validator · Lead generation, Developer tools, Automation On request

Validate and format phone numbers in bulk with Google's libphonenumber: valid or possible, E.164, international and national formats, country, calling code and number type (mobile, landline, VoIP). $0.80 per 1,000 numbers; non-numbers are free. Optional live carrier lookup.

About

What it does

Phone Number Validator validates, normalizes and classifies phone numbers in bulk. For each number you get valid / possible, the E.164, international and national formats, the country, the calling code and the number type (mobile, fixed line, toll-free, VoIP…). Validation runs offline on Google's libphonenumber metadata, so it is fast and cheap: ideal for cleaning CRM exports, sign-up forms and lead lists, and for AI agents that need a normalized number before calling or texting. An optional carrier lookup adds the carrier name and line type from a live carrier database.

Price

Price per delivered record

EventPricePer 1,000Charged for
Validated phone number
phone-validated
$0.0008$0.80 / 1,000Charged once per phone number that could be parsed and validated (valid or invalid verdict, formats, country, type).
Carrier lookup
phone-carrier-lookup
$0.005$5 / 1,000Charged once per valid number for which the optional live carrier lookup succeeded (carrier name, line type, region).

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~phone-validator/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"phones":["+1 650-253-0000","+44 20 7946 0958","030 901820"],"defaultCountry":"DE"}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/phone-validator"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~phone-validator/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Validate these phone numbers and give me each one in E.164 format with its country and number type: +1 650-253-0000, +44 20 7946 0958 and the German number 030 901820.

Input

Input fields

Paste phone numbers (one per line) in any common format. Each number produces one dataset record with validity, formats, country and number type.

FieldTypeDefaultMeaning
phones *arrayrequiredPhone numbers
Phone numbers in international (+44 20 7946 0958) or national format (national numbers need a default country), one per line; commas and semicolons stay part of the number (e.g. ;ext=123). The same number written in different formats is processed once. Objects with a `phone` field are accepted too. Accounts on the Apify free plan can process up to 10 phone numbers per run.
defaultCountrystring—Default country
ISO 3166-1 alpha-2 code (e.g. US, GB, DE) used for numbers written without a +country prefix.
carrierLookupbooleanfalseCarrier lookup (extra charge)
Also look up the carrier name, line type and region for each valid number via a live carrier database. Charged as a separate event per successful lookup. Paid add-on: turned off on the Apify free plan (records carry a warning).
maxNumbersinteger10000Max numbers
Safety cap on the number of phone numbers processed in this run. Range 1–100000.
concurrencyinteger10Concurrency
Parallel workers (matters only with carrier lookup). Range 1–10.
includeRawbooleanfalseInclude raw upstream response
Attach the raw carrier-lookup payload (only with carrier lookup).
Example input
{
  "phones": [
    "+1 650-253-0000",
    "+44 20 7946 0958",
    "030 901820"
  ],
  "defaultCountry": "DE"
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstringInput
The phone number as submitted.
isValidbooleanValid
Number matches an assigned numbering range for its country.
isPossiblebooleanPossible
Length is plausible for the country (weaker than valid).
e164stringE.164 e.g. "+442079460958"
internationalstringInternational format e.g. "+44 20 7946 0958"
nationalstringNational format e.g. "020 7946 0958"
rfc3966stringtel: URI
countryCodestringCalling code e.g. "44"
countrystring | nullCountry (ISO2) e.g. "GB"
nationalNumberstringNational number
extensionstring | nullExtension
numberTypestring | nullNumber type
MOBILE, FIXED_LINE, FIXED_LINE_OR_MOBILE, TOLL_FREE, PREMIUM_RATE, SHARED_COST, VOIP, PERSONAL_NUMBER, PAGER, UAN, VOICEMAIL or null.
carrierHintnullCarrier hint
Always null: offline validation does not include the carrier. Use carrierLookup.
carrierstring | nullCarrier
Only with carrierLookup (paid plans); null when the lookup was skipped, failed or could not be charged.
carrierLineTypestring | nullCarrier line type
Only with carrierLookup (paid plans); null when the lookup was skipped, failed or could not be charged.
carrierRegionstring | nullCarrier region
Only with carrierLookup (paid plans); null when the lookup was skipped, failed or could not be charged.
carrierLookupChargedbooleanCarrier lookup charged
True when the phone-carrier-lookup event was charged for this number.
statusstringStatus
ok | error | skipped_invalid | skipped_budget | skipped_free_plan e.g. "ok"
chargedbooleanCharged
sourcestringSource
fetchedAtstringFetched at
Example record
{
  "input": "+44 20 7946 0958",
  "isValid": true,
  "isPossible": true,
  "e164": "+442079460958",
  "international": "+44 20 7946 0958",
  "national": "020 7946 0958",
  "rfc3966": "tel:+442079460958",
  "countryCode": "44",
  "country": "GB",
  "nationalNumber": "2079460958",
  "extension": null,
  "numberType": "FIXED_LINE",
  "carrierHint": null,
  "status": "ok",
  "charged": true,
  "chargedEvent": "phone-validated",
  "source": "libphonenumber",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

Machine-readable

This page for agents