Phone Number Validator & Cleaner (Dataset, CSV or Sheet)
Pricing
from $1.40 / 1,000 phone numbers
Phone Number Validator & Cleaner (Dataset, CSV or Sheet)
Validates phone numbers from an Apify dataset, CSV/Excel/JSON file or Google Sheet, returning every original row plus country, line type, mobile/landline, region, carrier, timezone and E.164. Inputs: datasetId or fileUrl, phoneField, defaultRegion. Charged per number. Agent-ready via x402 and MCP.
Pricing
from $1.40 / 1,000 phone numbers
Rating
0.0
(0)
Developer
Adam Pearce
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Half your phone list will never connect. Numbers typed without a country code, landlines sitting in a column you are about to text, premium-rate switchboards, the same person entered twice in two different formats, and rows where somebody wrote "call the office" instead of a number.
Point this Actor at the list you already have. It hands back every original column, untouched, with the verdict added alongside: is the number real, which country it belongs to, whether it is a mobile or a landline, where it is, which network it was issued on, its timezone, and its clean E.164 form ready for your dialler or SMS provider.
What it does not do, up front
This Actor checks numbers offline, against Google's own libphonenumber data. That means it can tell you a number is correctly formed and exists in its country's numbering plan. It cannot tell you:
- whether the line is currently connected, or whether anyone answers it
- which network the number sits on today, if it has been ported since it was issued
Both of those need a paid live network lookup (HLR or CNAM) against a third-party service, and this Actor does not perform one. So every row it returns carries lineChecked: false, and the summary repeats it. A number marked valid passed every check performed here. That is not the same as a guarantee it will ring.
Anything advertising "live" carrier or connection status is calling a paid service behind the scenes and charging you for it. That is a real product, it is just a different one, and it usually costs 25 to 50 times more per number.
What makes this different from the other phone validators
Every other phone validator on the Store takes a typed-in list of numbers and gives you back a bare list of results. If your numbers live in a scraped dataset, a CRM export or a Google Sheet, you have to pull the phone column out, paste it in, and then match the results back to your names and companies by hand.
This one takes the whole thing. An Apify dataset, a CSV, TSV, Excel or JSON file by URL, a Google Sheet, or rows pasted inline. Your columns come back with the verdict columns added, in the same order, ready to use.
Two other things worth knowing:
- Duplicates are matched on the real number, not the text.
020 7946 0123,+44 20 7946 0123and+442079460123are one number, and this Actor says so. Matching on the raw string, which is what the alternatives do, misses all three. - It says "I cannot tell" instead of guessing. See the mobile question in the FAQ.
What you get on every row
| Column | What it is |
|---|---|
phoneStatus | valid, risky, invalid or duplicate |
phoneReason | The single most important thing found, for example premium_rate or unknown_region |
phoneAllReasons | Everything that applied, so you can set your own bar |
phoneE164 | +442079460123, the format every SMS and telephony API wants |
phoneNational / phoneInternational | 020 7946 0123 and +44 20 7946 0123, for display |
phoneCountry | ISO country code, worked out from the number itself |
phoneType | mobile, fixed_line, fixed_line_or_mobile, toll_free, premium_rate, voip, shared_cost, uan, pager, voicemail |
isMobile | true, false, or null where the numbering plan genuinely cannot say |
phoneRegion | A place, where the plan carries one: London, New York, NY, Manchester |
phoneCarrier | The network the range was allocated to, for example Vodafone or Optus |
phoneTimezones | IANA timezones, so a dialling list can respect local hours |
phoneExtension | Kept separately when the input had one, for example ext 22 |
lineChecked | Always false. See above. |
Example
Input, eight rows of a lead list with Default region set to GB:
| name | company | phone |
|---|---|---|
| Ana Silva | Silva Ltd | +44 7825 123456 |
| Ben Okafor | Okafor & Co | 0161 496 0123 |
| Cara Lind | Lind Studio | +1 212 555 0123 |
| Dan Reeves | Reeves Ltd | +44 900 123 4567 |
| Eve Mbeki | Mbeki Group | +61 412 345 678 |
| Frank Ortiz | Ortiz SA | call the office |
| Gina Haas | Haas Studio | +44 56 0000 0000 |
| Ana Silva (again) | Silva Ltd | 07825 123456 |
What comes back:
| phone | phoneStatus | phoneReason | phoneE164 | phoneType | isMobile | phoneRegion | phoneCarrier |
|---|---|---|---|---|---|---|---|
| +44 7825 123456 | valid | ok | +447825123456 | mobile | true | Vodafone | |
| 0161 496 0123 | valid | ok | +441614960123 | fixed_line | false | Manchester | |
| +1 212 555 0123 | valid | ok | +12125550123 | fixed_line_or_mobile | null | New York, NY | |
| +44 900 123 4567 | risky | premium_rate | +449001234567 | premium_rate | false | ||
| +61 412 345 678 | valid | ok | +61412345678 | mobile | true | Optus | |
| call the office | invalid | not_a_number | unknown | null | |||
| +44 56 0000 0000 | risky | voip_number | +445600000000 | voip | false | ||
| 07825 123456 | duplicate | duplicate_in_list | +447825123456 | mobile | true | Vodafone |
Four valid, two risky, one invalid, one duplicate. Note the last row: written completely differently from the first, and correctly recognised as the same person's number.
Typical uses
- Before an SMS campaign. Set
Rows to keepto "Only confirmed mobile numbers" and you get a list you can actually text, with landlines, switchboards and repeats already gone. - Cleaning a scraped lead list. Run it straight on the dataset your scraper produced, no copying columns about.
- Keeping a CRM tidy on a schedule. Point it at a Google Sheet, set a webhook, and let it report in whenever something breaks.
- Working out what you actually have. The summary breaks the list down by country, line type and verdict before you spend anything on it.
Pricing
$2.00 per 1,000 numbers checked ($0.002 each), plus one cent per exported file and two cents per webhook delivery.
- A 1,000-row list: $2.00
- A 5,000-row list with a CSV and an Excel file: $10.02
- A nightly 300-row check with a webhook: $0.62 a night, about $19 a month
Every number that gets a verdict is charged, including ones you filter out of the output with Rows to keep, because the work is the same. Numbers are never charged twice for the same row, and a run that fails before any checking charges nothing but the run start.
Store discount tiers are on from day one, so Bronze, Silver and Gold plan customers pay 10, 20 and 30 percent less.
FAQ
Why does it say null for mobile on my US and Canadian numbers?
Because no offline database can answer that question for North America. The United States and Canada draw mobile and landline numbers from the same ranges, so there is no pattern to read. Reporting null is the honest answer, and it is the reason Rows to keep: mobile excludes them: it gives you numbers that are definitely mobile, not numbers that might be. Countries with separate mobile ranges (the UK, Australia, Germany, India, most of the world) come back as a clear true or false. The undeterminedMobileCount in the summary tells you how many rows this affected.
Is phoneCarrier the network the number is on now?
No, and this matters. It is the network the number's range was originally allocated to. Number portability means a number issued on one network can have been carried to another years ago, and no offline data can see that. Treat it as a strong hint, not a fact. It is also unavailable for the United States and Canada entirely.
My test number came back invalid, is it broken?
Probably not. Regulators reserve certain ranges for use in films and adverts, and some of them exclude those ranges from the real numbering plan. UK numbers starting 07700 900 are the common one: they are deliberately not assignable, so they validate as invalid, correctly. US 555-01xx numbers, by contrast, are still technically valid. If you want a realistic test, use a real number.
Why does a UK mobile sometimes come back as country GG or IM?
Guernsey, Jersey and the Isle of Man share the +44 country code with the UK but have their own ranges and their own ISO codes. A number reported as GG is genuinely a Guernsey number. It is not a mistake, and the number still works.
What happens to numbers with no country code?
Set Default region to the country they belong to (GB, US, AU) and they are read correctly. Without it, a number like 0161 496 0123 could belong to a dozen countries, so it is reported as unknown_region rather than guessed at. If your list mixes countries and the numbers have no country codes, there is no way for any tool to resolve that, and this one will tell you rather than pretend.
Does it work on a Google Sheet?
Yes. Set sharing to "Anyone with the link can view" and paste the normal sheet link into File URL. The export link is worked out for you.
Is my data sent anywhere?
No. Every check runs inside your own Actor run against bundled data. Nothing is sent to a third-party service. The only outbound request the Actor ever makes is downloading your file, if you gave it a File URL, and posting the summary to your own webhook, if you set one. The webhook payload carries counts and download links, never the numbers themselves.
Can an AI agent run this? Yes. It is pay-per-event with limited permissions and no standby mode, so it is payable through x402 and callable over MCP.
The rest of the toolkit
This Actor pairs with Email List Cleaner & Validator: one cleans the phone column, the other cleans the email column, both keeping every original row.
For the data itself, the Nero Labs dataset tools handle each step of a pipeline: Cleaner & Exporter, Filter & Transform, Join & Merge, Aggregate, Group By & Pivot, Diff & Change Detector, AI Enrich, Charts & Report, to Postgres, Supabase & MySQL, to REST API, and Actor Pipeline Runner to chain them in one call.
If this saved you a batch of failed texts or an afternoon of matching results back to spreadsheet rows, a review on the Store page helps a lot. If something looks wrong, open an issue on the Issues tab and I will answer personally.