Bulk Phone Number Validator & Formatter – E.164, Line Type avatar

Bulk Phone Number Validator & Formatter – E.164, Line Type

Pricing

from $0.72 / 1,000 phone number validateds

Go to Apify Store
Bulk Phone Number Validator & Formatter – E.164, Line Type

Bulk Phone Number Validator & Formatter – E.164, Line Type

Validate and normalize thousands of phone numbers in seconds: valid/possible, mobile or fixed line, country, E.164, international and national formats. Duplicates removed, invalid numbers free. Fully offline, no API keys.

Pricing

from $0.72 / 1,000 phone number validateds

Rating

0.0

(0)

Developer

Kestrelwick Studios

Kestrelwick Studios

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a month ago

Last modified

Categories

Security

Limited permissions

Share

Bulk Phone Number Validator & Formatter – E.164, Line Type, Country (Offline)

Paste a list of phone numbers in any format and get one clean row per unique number: whether it's valid, whether it's at least possible, the line type (mobile, fixed line, toll-free, VoIP...), the country, and ready-to-use E.164, international and national formats. We remove duplicates for you, so you only pay for unique valid numbers. Invalid numbers are free.

Everything runs offline on Google's libphonenumber numbering-plan metadata (the full "max" dataset). We don't need API keys, proxies or third-party lookups, and your numbers never leave the run. A list of 10,000 numbers is validated in about a second.

Built and maintained by Kestrelwick Studios.

Who it's for

  • Sales and CRM teams cleaning up phone fields before an import, a dialer campaign or a migration.
  • Lead-list buyers and agencies checking scraped or purchased lists before handing them over.
  • SMS and marketing ops separating mobile numbers from landlines, toll-free and premium-rate numbers.
  • Developers and data engineers normalizing numbers to E.164 for Twilio, Vonage, AWS SNS or a database key.

What we return

FieldExampleMeaning
input(415) 555-2671The number as you sent it
validtrueMatches a real, assignable range in the national numbering plan
possibletrueHas a plausible length for the country (looser check)
typemobilemobile, fixed_line, fixed_line_or_mobile, toll_free, premium_rate, shared_cost, voip, personal_number, pager, uan, voicemail or unknown (valid numbers only)
countryUSISO 3166-1 alpha-2 code (valid numbers only; null for non-geographic numbers such as +800)
callingCode+1Country calling code
e164+14155552671Canonical format for APIs and databases
international+1 415 555 2671Human-readable international format
national(415) 555-2671Local format
formatted+14155552671The number in your preferred output format (one column to map back into a CRM)
errornullWhy a number failed: NOT_A_NUMBER, INVALID_COUNTRY, TOO_SHORT, TOO_LONG, INVALID_LENGTH or INVALID_NUMBER (right length but not an assigned range)

Formats are filled for every number that is at least possible. Filter on valid = true for a strict list.

Input

  • Phone numbers: one per line, in any format (+44 20 7031 3000, 011 44 20 7031 3000, (650) 253-0000, 650.253.0000...). You can paste a whole spreadsheet column; we also split entries on commas and semicolons.
  • Default country: the two-letter country code used for numbers written without + (defaults to US). Numbers with + or an international dialing prefix are always detected automatically.
  • Preferred output format: E.164 (default), INTERNATIONAL, NATIONAL or RFC3966, used for the formatted column.
  • Max numbers: a cap on unique numbers per run, to control spend.
{ "phoneNumbers": ["+1 650-253-0000", "(415) 555-2671", "+44 20 7031 3000", "07400 123456", "12345"],
"defaultCountry": "US", "outputFormat": "E.164" }

Output example

{ "input": "+33 6 12 34 56 78", "valid": true, "possible": true, "type": "mobile", "country": "FR",
"callingCode": "+33", "e164": "+33612345678", "international": "+33 6 12 34 56 78",
"national": "06 12 34 56 78", "formatted": "+33612345678", "error": null }
{ "input": "12345", "valid": false, "possible": false, "type": null, "country": null,
"callingCode": "+1", "e164": null, "international": null, "national": null, "formatted": null, "error": "TOO_SHORT" }

A run summary (numbers received, duplicates removed, valid and invalid counts) is saved as SUMMARY in the run's key-value store. Export the dataset as CSV, Excel, JSON or XML, or call the actor from the Apify API, Make, Zapier or n8n.

Deduplication

We dedupe twice: first on the exact text, then on the normalized E.164 number. +1 650-253-0000, (650) 253-0000 and 16502530000 become one row (the first one you sent), and you're charged once.

Pricing

Pay per result: $0.97 per 1,000 valid numbers on the Free plan, going down to $0.72 per 1,000 on higher Apify plans. There's no start fee, duplicates are removed before billing, and invalid numbers are free. Platform usage is included.

Tips

  • Store the e164 column as your canonical phone key. It makes duplicate detection across systems reliable.
  • For SMS campaigns, keep type = mobile or fixed_line_or_mobile. In the US and Canada, the numbering plan doesn't separate mobile from landline, so most numbers there come back as fixed_line_or_mobile.
  • Set a maximum charge per run in Apify to cap spend.

FAQ

Does it check that a number is live or reachable? No. We check numbers against the official numbering plans, offline. We don't call or text numbers, query carriers or HLR, or verify ownership or consent. Use the results as data hygiene, not as a TCPA or do-not-call determination. Why is a real-looking number valid: false? It has the right length but falls in a range that isn't assigned (for example US area code 555), so error is INVALID_NUMBER. Why did a local number fail? Numbers without + are read using the default country. A UK number like 07400 123456 needs defaultCountry = GB, or write it as +44 7400 123456. Is there a carrier field? Not in this version. Carrier data in the open numbering plans goes stale when numbers are ported, so we leave it out rather than return misleading values. Support: open an issue on the actor's Issues tab and we'll respond.