Phone Number Validator & Formatter (Bulk, Offline) avatar

Phone Number Validator & Formatter (Bulk, Offline)

Pricing

from $0.32 / 1,000 phone number checkeds

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

Phone Number Validator & Formatter (Bulk, Offline)

Bulk phone number validator and formatter for all countries. Returns valid and possible flags, E.164, international and national formats, country and line type (mobile, fixed line, toll-free, VoIP). Offline libphonenumber checks. Arabic digits, per-row country and duplicate removal.

Pricing

from $0.32 / 1,000 phone number checkeds

Rating

0.0

(0)

Developer

Malik Said

Malik Said

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Security

Limited permissions

Share

This phone number validator checks and formats phone numbers from any country in bulk. Paste a list of numbers. For each number you get a valid flag, a possible flag, the E.164 format, the international and national formats, the country and the line type (mobile, fixed line, toll-free, VoIP and more). The checks run offline with the open-source libphonenumber metadata. The Actor never calls a carrier, an HLR service or any other lookup.

What the phone number validator does

  • Validates each number against the numbering plan of its country.
  • Formats valid numbers as E.164 (+447400123456), international (+44 7400 123456) and national (07400 123456).
  • Finds the country, the country calling code and the line type.
  • Reads national numbers with a default country, or with a country per row.
  • Reads Arabic-Indic (٠١٢٣) and Persian (۰۱۲۳) digits.
  • Reads a leading 00 as an international prefix.
  • Keeps extensions such as ext. 7.
  • Removes duplicates, even when the same number is written in two ways.
  • Keeps your own row ID (ref), so you can join the results back to your CRM.

Phone number data you get

FieldExample
input٠٥١٢٣٤٥٦٧٨
isValidtrue
isPossibletrue
validationErrornull, or TOO_SHORT, TOO_LONG, INVALID_LENGTH, INVALID_COUNTRY, INVALID_NUMBER, NOT_A_NUMBER
e164+966512345678
international+966 51 234 5678
national051 234 5678
rfc3966tel:+966512345678
countryCode / countryNameSA / Saudi Arabia
callingCode+966
numberTypeMOBILE
isDuplicatefalse

numberType comes from the numbering plan. The values are MOBILE, FIXED_LINE, FIXED_LINE_OR_MOBILE, TOLL_FREE, PREMIUM_RATE, SHARED_COST, VOIP, PERSONAL_NUMBER, PAGER, UAN, VOICEMAIL and UNKNOWN. Some countries, such as the US and Canada, use the same ranges for mobile and fixed lines. Those numbers show FIXED_LINE_OR_MOBILE.

The offline metadata has no carrier, city or time zone data. So the Actor does not return a carrier, a region inside the country or a time zone. It also cannot tell whether a number is switched on or in use today. For that you need a live HLR or carrier lookup, which this Actor does not do.

How to validate phone numbers in bulk

  1. Open the Actor and paste your numbers into Phone numbers, one per line.
  2. Set Default country (for example US, GB, SA or AE) if your list has national numbers such as 050 123 4567.
  3. If each row has its own country, use Rows with their own country instead.
  4. Set Maximum numbers to 0 to check the whole list.
  5. Click Start. Download the results as CSV, Excel or JSON.

Input example

{
"phoneNumbers": ["+44 7400 123456", "12345"],
"rows": [
{ "phone": "050 123 4567", "country": "AE", "ref": "crm-1001" },
{ "phone": "٠٥١٢٣٤٥٦٧٨", "country": "SA", "ref": "crm-1002" }
],
"defaultCountry": "US",
"removeDuplicates": true,
"onlyValid": false,
"maxItems": 0
}

Output example

This record came from the input above.

{
"id": "row-4",
"inputIndex": 4,
"input": "٠٥١٢٣٤٥٦٧٨",
"ref": "crm-1002",
"defaultCountry": "SA",
"checkedAt": "2026-10-22T08:03:47.520Z",
"isValid": true,
"isPossible": true,
"validationError": null,
"e164": "+966512345678",
"international": "+966 51 234 5678",
"national": "051 234 5678",
"rfc3966": "tel:+966512345678",
"extension": null,
"countryCode": "SA",
"countryName": "Saudi Arabia",
"callingCode": "+966",
"nationalNumber": "512345678",
"numberType": "MOBILE",
"isDuplicate": false
}

The number 12345 with default country US came back with isValid: false and validationError: "TOO_SHORT".

Phone number validator pricing

You pay per event.

  • $0.02 when the run starts.
  • $0.0004 per number saved to the dataset ($0.40 per 1,000 numbers).

A run of 2,000 numbers costs $0.82. Duplicates that the Actor removes are not charged. With Only valid numbers on, invalid numbers are not saved and not charged. Apify's free plan credit covers small lists.

Privacy and lawful use

Phone numbers are personal data under the GDPR, Saudi PDPL, UAE PDPL and similar laws. You must have a lawful basis to process every number you upload, such as consent or a contract. This Actor only checks the numbers you supply. It never adds names, addresses or any other personal data. It sends the numbers nowhere outside your Apify run. The log and status message show counts only. The results stay in your own Apify dataset until you delete them.

FAQ

Does it check whether a number is active?

No. It checks the number against the official numbering plan. A valid number can still be unassigned or switched off.

How many numbers can I check in one run?

We tested 100,000 numbers in one local run. It took about 20 seconds. For larger lists, split them across runs.

Why is my national number marked INVALID_COUNTRY?

A number without a + country code needs a country. Set Default country, or give each row a country.

Which library does it use?

It uses libphonenumber-js (MIT licence) with the "max" metadata, which comes from Google's libphonenumber (Apache 2.0 licence).

Other Actors by the same developer

Support

Found a number that the Actor reads wrongly? Open an issue on the Actor's Issues tab. Include the number format (with the digits changed) and the country.