Phone Number Validator & Formatter (Bulk, Offline)
Pricing
from $0.32 / 1,000 phone number checkeds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Security
Limited permissionsShare
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
00as 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
| Field | Example |
|---|---|
input | ٠٥١٢٣٤٥٦٧٨ |
isValid | true |
isPossible | true |
validationError | null, or TOO_SHORT, TOO_LONG, INVALID_LENGTH, INVALID_COUNTRY, INVALID_NUMBER, NOT_A_NUMBER |
e164 | +966512345678 |
international | +966 51 234 5678 |
national | 051 234 5678 |
rfc3966 | tel:+966512345678 |
countryCode / countryName | SA / Saudi Arabia |
callingCode | +966 |
numberType | MOBILE |
isDuplicate | false |
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
- Open the Actor and paste your numbers into Phone numbers, one per line.
- Set Default country (for example
US,GB,SAorAE) if your list has national numbers such as050 123 4567. - If each row has its own country, use Rows with their own country instead.
- Set Maximum numbers to
0to check the whole list. - 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.