Bulk Phone Number Validator & Formatter (libphonenumber) avatar

Bulk Phone Number Validator & Formatter (libphonenumber)

Pricing

$0.70 / 1,000 phone number checkeds

Go to Apify Store
Bulk Phone Number Validator & Formatter (libphonenumber)

Bulk Phone Number Validator & Formatter (libphonenumber)

Use this when you need to check, clean or format phone numbers. $0.0007/number ($0.70 per 1,000); non-numbers and duplicates free. Input: {"phone":"0412 345 678","defaultCountry":"AU"}. Output: valid, E.164, line type, original carrier, region, time zones. Offline check, not a live line test.

Pricing

$0.70 / 1,000 phone number checkeds

Rating

0.0

(0)

Developer

Isaac

Isaac

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 minutes ago

Last modified

Share

Bulk Phone Number Validator & Formatter API: E.164, Line Type, Carrier, Time Zone

Use this when you or your AI agent need to check, clean or format phone numbers. Paste numbers in any format, from any country, and get back clean JSON for each one:

  • ✅ Valid or not, with a plain-English reason ("too short", "number range not in use", "missing area code")
  • 🔢 Normalised formats: E.164 (+61412345678), international, national and tel: URI, plus extensions
  • 📱 Line type: mobile, landline, toll-free, premium-rate, VoIP, shared-cost, pager and more
  • 🌍 Country, region and city (for example "Mountain View, CA" or "London")
  • 📡 Original carrier for mobile numbers (for example Optus, Vodafone, T-Mobile)
  • 🕒 Time zones, so you know when it is polite to call
  • 🚩 Expected-country check: flag numbers that are not from the countries you expect
  • ♻️ De-duplication after normalising, so 0412 345 678 and +61 412 345 678 count once
  • 💸 $0.70 per 1,000 numbers. Text that is not a phone number and duplicates are free. No start fee

It runs fully offline on Google's open-source libphonenumber metadata (the library Android and Google use), so it is fast and private. 10,000 numbers take about a second.

What it does not do: it does not ring the number or query the mobile network (no HLR lookup), so it cannot tell you whether a line is currently connected, and the carrier shown is the original carrier of the number range, not the current one after porting. Live network lookups cost 10–50x more.

What can I use it for?

  • Cleaning CRM and lead lists before importing them into HubSpot, Salesforce or a dialler
  • Checking numbers before sending SMS: skip landlines, toll-free and invalid numbers
  • Normalising form input to E.164 for Twilio, WhatsApp or your database
  • Spotting fake or foreign sign-ups with the expected-country check
  • Call scheduling: get the time zone of every number
  • Pairing with the Bulk Email Verifier to clean whole contact lists

Input

FieldTypeDescription
phonestringOne number (shortcut for agents)
phonesarrayNumbers in any format, up to 1,000,000 per run
defaultCountrystringISO code for numbers written without +, e.g. AU, US, GB
expectedCountriesarrayOptional ISO codes; adds countryMatchesExpected
languagestringLanguage for carrier and location names (default en)
deduplicatebooleanSkip repeats after normalising (default true)
{
"phones": ["0412 345 678", "+44 20 7946 0958", "+1 650 253 0000 ext 12", "12345", "call me"],
"defaultCountry": "AU",
"expectedCountries": ["AU", "NZ"]
}

Output

One dataset item per number:

{
"input": "0412 345 678",
"valid": true,
"possible": true,
"e164": "+61412345678",
"international": "+61 412 345 678",
"national": "0412 345 678",
"rfc3966": "tel:+61-412-345-678",
"country": "AU",
"callingCode": 61,
"nationalNumber": "412345678",
"extension": null,
"lineType": "mobile",
"carrier": "Optus",
"location": null,
"timeZones": ["Australia/Adelaide", "Australia/Brisbane", "Australia/Perth", "Australia/Sydney", "..."],
"countryMatchesExpected": true,
"reason": "valid number"
}

An invalid number keeps the parsed parts and explains why:

{"input": "12345", "valid": false, "e164": null, "country": "AU", "reason": "right length but not a number range in use in this country (read as a AU number; add +country code if it is foreign)"}

lineType values: mobile, landline, landline_or_mobile (US/Canada numbers cannot be told apart from metadata), toll_free, premium_rate, shared_cost, voip, personal_number, pager, uan, voicemail, unknown.

Pricing

$0.0007 per phone number checked ($0.70 per 1,000). You pay only for text that could be read as a phone number, valid or invalid, because both answers are useful. Lines that are not phone numbers ("call me", empty cells) and duplicates are free. There is no start fee. Set Maximum cost per run and the Actor stops cleanly at your limit.

Use it from an AI agent

AI agents can call it through the Apify MCP server with https://mcp.apify.com/?tools=poised_beardlichen/phone-number-validator. A single number returns in a few seconds. It also works with Make, Zapier, n8n and Google Sheets through Apify integrations.

For large lists, start the run and fetch the results afterwards:

  1. POST https://api.apify.com/v2/acts/poised_beardlichen~phone-number-validator/runs with {"phones": [...], "defaultCountry": "US"}
  2. Poll GET https://api.apify.com/v2/actor-runs/<runId>?waitForFinish=60 until SUCCEEDED
  3. GET https://api.apify.com/v2/datasets/<defaultDatasetId>/items?clean=true

FAQ

Is a valid number guaranteed to be connected? No. Valid means the number has the right length and belongs to a range that is assigned in that country. It may still be disconnected or unused.

Why is the carrier sometimes empty? Carrier data exists only for mobile ranges in many countries, and some countries (for example the US) do not publish it. Ported numbers keep the original carrier.

Where does the data come from? From libphonenumber (Apache 2.0), via the phonenumbers Python port. Metadata is updated with each build.

Is my data shared? No. Numbers are processed inside your run and never sent to any third-party service.

Other tools by us

Support

Found a number that is classified wrongly? Open an issue on the Issues tab.