Phone Number Validation & Lookup: Format, Carrier, Line Type avatar

Phone Number Validation & Lookup: Format, Carrier, Line Type

Pricing

from $0.68 / 1,000 numbers

Go to Apify Store
Phone Number Validation & Lookup: Format, Carrier, Line Type

Phone Number Validation & Lookup: Format, Carrier, Line Type

Phone number validation API and phone number validator: validate phone numbers in bulk. Phone number lookup and carrier lookup with country, city, time zones and line type (mobile, landline, VoIP, toll free), plus E.164, international, national and RFC3966 formats. Offline, no API key.

Pricing

from $0.68 / 1,000 numbers

Rating

0.0

(0)

Developer

Data Done Right

Data Done Right

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

This phone number validation Actor checks a list of phone numbers and tells you, for each one, whether it is valid, how to write it (E.164, international, national, RFC 3966), which country it belongs to, what kind of line it is (mobile, fixed line, VoIP, toll free, premium rate...), which carrier originally got the number range, and where the area code is (city or region and time zones). Use it as a phone number validator and phone number lookup for lead lists, CRM cleanup, sign-up forms, SMS campaigns and data pipelines. It runs offline: no API key, no third-party service, no calls to the numbers. It uses the phonenumbers library, a Python port of Google's libphonenumber, so large lists run in minutes.

What can you do with a phone number validator

  • Validate phone numbers in bulk. Paste numbers in any common format (+1 (201) 555-0123, 415.555.2671, 0044 20 7946 0958, tel:+49-30-901820). Each number becomes one row.
  • Normalize to E.164 and other formats. Get E.164, international, national and RFC 3966 (tel:) versions of every number, ready for a CRM, an SMS provider or a database key.
  • Carrier lookup. The carrier column shows the carrier that originally received the number range (mobile numbers, in countries where this data exists).
  • Country, city and time zones. ISO country code, country name, city or region of the area code, and the IANA time zones of the number's area.
  • Line type. mobile, fixed_line, fixed_line_or_mobile, toll_free, premium_rate, shared_cost, voip, personal_number, pager, uan, voicemail or unknown.
  • Possible vs valid. isPossible is a quick length check (a local number without an area code does not count), isValid checks the full numbering plan of the country. A reason column says why a number failed.
  • Clean lists. Turn on De-duplicate to check each distinct number once (two writings of one number count as one), or Only return valid numbers to get a clean list back.

Phone number lookup and carrier lookup: what the results mean

Please read this before you rely on the results.

  • Valid means the number fits the numbering plan: the country code exists, the length is right and the digits match a pattern the country assigns. It does not mean the line is active, connected, reachable or owned by a real person. A number that passes can still be disconnected, and a freshly assigned number can still be flagged as invalid until the library's data is updated.
  • Carrier is the original carrier of the number range. It comes from the prefix, so it does not reflect number portability: a number moved to another carrier still shows the first one. Carrier data exists mostly for mobile numbers and only in some countries; many rows have none.
  • Line type is also a numbering-plan answer. In several countries (the US and Canada, for example) mobile and landline numbers share the same ranges, so you get fixed_line_or_mobile. VoIP is only detected where the numbering plan sets VoIP ranges aside; a VoIP service that rents ordinary mobile or landline numbers looks like an ordinary number.
  • Location is the area code's region, not where the person is. Mobile and toll-free numbers usually have no location, and location is empty when only the country is known.
  • For an invalid number, regionCode and country are filled only when the country code belongs to a single country. Toll-free numbers can list many time zones.
  • No SMS, voice call or network lookup is made. If you need to know whether a line is live, you need a live HLR or SMS verification service. This Actor is the fast, cheap first filter in front of one.

How to validate phone numbers

  1. Paste your numbers into Phone numbers, one per line.
  2. Pick Default country for numbers written without a + country code (national format). Numbers that start with + ignore it. A leading 00 is read as + when that makes the number valid.
  3. Choose the output formats and which extra columns you want (line type, carrier, location, time zones).
  4. Run it and download the rows as JSON, CSV or Excel, or read them through the Apify API.

Input example

{
"phoneNumbers": [
"+1 (201) 555-0123",
"415.555.2671",
"0044 20 7946 0958",
"+44 7400 123456",
"+1-800-555-0199",
"12345"
],
"defaultCountry": "US",
"outputFormats": ["e164", "international", "national", "rfc3966"],
"includeNumberType": true,
"includeCarrier": true,
"includeLocation": true,
"includeTimeZones": true,
"onlyValid": false,
"dedupe": true,
"maxNumbers": 100000
}

All of these except phoneNumbers are optional. The numbers above are libphonenumber's own example numbers and fictional 555 numbers.

Output

One row per number:

{
"index": 3,
"original": "+44 7400 123456",
"e164": "+447400123456",
"international": "+44 7400 123456",
"national": "07400 123456",
"rfc3966": "tel:+44-7400-123456",
"countryCode": 44,
"regionCode": "GB",
"country": "United Kingdom",
"isPossible": true,
"isValid": true,
"numberType": "mobile",
"carrier": "Three",
"location": null,
"timeZones": ["Europe/Guernsey", "Europe/Isle_of_Man", "Europe/Jersey", "Europe/London"],
"extension": null,
"reason": null
}
  • index is the position of the number in your input list (0-based, blank lines ignored), so you can join the results back to your data.
  • An invalid number gets isValid: false and a reason such as "Too short for this country", "Too long to be a phone number", "Not a phone number" or "No usable country code: write the number with +
  • Formats (e164, international, national, rfc3966) are filled whenever the length is possible, even if the number is not valid. They are null for text that cannot be read as a number.
  • Switching an option off removes that column from the rows.
  • Extensions in the input (x123, ext. 5) are kept in extension and in the national, international and RFC 3966 formats, not in E.164.
  • A SUMMARY record in the key-value store counts valid and invalid numbers, numbers by type and country, duplicates skipped, and the version of the phone metadata used. A NOTES record lists anything skipped.

Phone number validation API

Call this Actor from the Apify API, Python, JavaScript, Make, Zapier or n8n as a phone number validation API with no key of your own to manage. Example with the Apify Python client:

from apify_client import ApifyClient
run = ApifyClient("<APIFY_TOKEN>").actor("data-done-right/phone-number-validation").call(run_input={
"phoneNumbers": ["+1 (201) 555-0123", "415.555.2671", "+44 20 7946 0958"],
"defaultCountry": "US", "outputFormats": ["e164"], "onlyValid": True})
for row in ApifyClient("<APIFY_TOKEN>").dataset(run["defaultDatasetId"]).iterate_items():
print(row["original"], "->", row["e164"], row["numberType"], row["carrier"])

Runs take seconds because nothing leaves the Actor: the numbers are checked against the libphonenumber data built into it.

Use it in Claude, ChatGPT and Cursor

Connect Apify's MCP server (mcp.apify.com) and your AI assistant can validate phone numbers itself. For example: "validate these 200 numbers from my CRM export, assume they are UK numbers, and list the mobile ones in E.164." The only required input is phoneNumbers; set defaultCountry for numbers without a +.

Use cases

  • CRM and lead-list cleanup: one E.164 format for every contact, invalid and duplicate numbers flagged before you import.
  • SMS and WhatsApp campaigns: keep mobile numbers and drop landlines and toll-free numbers before you send.
  • Sign-up and checkout forms: validate on the server with a single API call.
  • Call routing and time-zone-aware dialing: use country, location and time zones to decide when and where to call.
  • Data pipelines and enrichment: add country, line type and carrier columns to a contact table.

How much does it cost

Pay per event: $0.00085 per phone number (number), charged once for every number checked, valid or not, because "this number is invalid" is the answer you asked for. 1,000 numbers cost about $0.85, and 100,000 about $85. Paid Apify plans get 10% (Silver) to 20% (Gold and up) off. Duplicates skipped by De-duplicate, blank lines and numbers beyond Max numbers are not charged. Only return valid numbers hides invalid rows from the results but they are still checked and charged. If you set a maximum spend per run, the Actor stops cleanly when it is reached and keeps the rows already delivered. A run with no phone numbers fails with a clear message and charges nothing.

FAQ

How do I validate phone numbers in bulk?

Paste them into Phone numbers, set Default country, and run. You get one row per number with isValid, the formats and the details. Lists of 100,000 numbers or more are fine; raise Max numbers if you need more than the default cap.

Does it call or text the numbers?

No. Nothing is dialed and no message is sent. The Actor never contacts the people behind the numbers, and it makes no network request to look anything up. The result comes from the numbering-plan data in the library.

Does a valid number mean the phone is active?

No. Valid means the number is correctly formed for its country. It can still be unassigned, disconnected or unreachable. Use a live HLR or SMS check if you need to know that.

Is the carrier the current carrier of the number?

No. It is the carrier the number range was originally assigned to. Because of number portability, the number may now be with a different carrier.

Why is the line type fixed_line_or_mobile for US numbers?

In the US and Canada, mobile and landline numbers come from the same ranges, so the numbering plan cannot tell them apart. The Actor reports that honestly instead of guessing.

What if my numbers have no country code?

Set Default country. Numbers without a + are read as national numbers of that country. Numbers that start with + always keep their own country code. If you leave the default empty, national numbers come back invalid with a reason that says so.

Does it remove duplicates?

Yes, by default. Different writings of the same number (+1 201 555 0123, (201) 555-0123, 201.555.0123) count as one, and the same number with a different extension counts as a different number. Turn off De-duplicate to get one row per input line.

Which countries does it support?

All 245 regions that libphonenumber covers, plus non-geographic numbers such as +800. Carrier and city data is richer for some countries than others.

Is it OK to process phone numbers under GDPR?

Phone numbers are personal data when they can identify a person. The Actor processes the numbers you give it only to validate them, writes the results to your run's storage in your Apify account, and makes no outside calls. You remain responsible for having a lawful basis to process the numbers, for what you do with the results, and for deleting the run's data when you no longer need it. Never use the output to contact people who have not agreed to be contacted.

How current is the data?

The numbering-plan data is that of the pinned phonenumbers version, shown in the libphonenumberVersion field of the SUMMARY record. New number ranges are added when the library is updated, so a very recently assigned range can show as invalid until then.

  • Google Sheets Import & Export: Apify Data, No Login sends the validated results to a Google Sheet.
  • HTTP Request Runner: Bulk API Calls, Retries, Proxies calls your own API for each valid number.
  • Company Enrichment API: Domain to Tech, Jobs & Socials enriches the companies behind your cleaned leads from their domains.