Phone Number Validator: Bulk E.164 Format, Line Type, Carrier
Pricing
from $2.00 / 1,000 phone number checkeds
Phone Number Validator: Bulk E.164 Format, Line Type, Carrier
Validate, clean and format phone numbers offline with Google's libphonenumber: valid/possible, E.164, international and national format, country, line type (mobile, landline, VoIP, toll-free), time zone, carrier and duplicates. Lists, CSV or datasets.
Pricing
from $2.00 / 1,000 phone number checkeds
Rating
0.0
(0)
Developer
Julian Genuario
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Validate, clean and format thousands of phone numbers in seconds. Paste a list, point it at a CSV file or at the dataset of another Actor (Google Maps, contact or lead scrapers), and get one clean row per number:
- Valid / possible / invalid, with the reason (too short, too long, unknown country code, not an assigned range…)
- E.164 (
+16502530000), international (+1 650-253-0000), national ((650) 253-0000) andtel:URI format - Country (ISO code and name), calling code and national number, plus the extension if there is one
- Line type: mobile, fixed line, fixed line or mobile, VoIP, toll-free, premium rate, shared cost, personal number, pager, UAN, voicemail
- Time zones of the number (great for call scheduling)
- Location: city or region of the number range (e.g. "Mountain View, CA", "Berlin", "Buenos Aires")
- Carrier: the network the number range was originally assigned to, where available
- Duplicate detection: "(650) 253-0000" and "+1 650 253 0000" are the same number. Flag duplicates or remove them
It runs 100% offline with Google's libphonenumber metadata (the same library used by Android and many CRMs). No external API, no HLR lookup, no calls, no SMS: your contact list never leaves the run. That is also why it is fast and cheap.
What does Phone Number Validator do?
Phone Number Validator checks and formats phone numbers in bulk with Google's libphonenumber, offline: valid / possible / invalid with a reason, E.164, international and national format, country, line type (mobile, landline, VoIP, toll-free), time zone, original carrier and duplicates. Use it to clean CRM and lead lists before calling, SMS or WhatsApp campaigns.
What it does NOT do
This Actor checks that a number is correctly written and belongs to a real numbering plan (right length, assigned prefix, right country). It does not check whether the line is active, who owns it, or whether it has WhatsApp. A valid number can still be disconnected. The carrier is the original network of the number range: if the user ported the number to another operator, that is not reflected.
Use cases
- Clean CRM lists before importing them into HubSpot, Salesforce, Pipedrive or Zoho: one E.164 format, no duplicates, broken numbers flagged
- Normalise web form and checkout submissions that arrive as "011 15 2345-6789", "(212) 555 0123" or "+44 (0) 20…"
- Prepare SMS, WhatsApp or call-center campaigns: keep only valid mobile numbers, group them by country and time zone, avoid paying for messages to invalid numbers
- Enrich scraped leads: run it on the output of a Google Maps or business directory scraper and keep the
title,websiteetc. next to the clean number - Data quality checks in ETL pipelines through the Apify API, Make, Zapier or n8n
How to use it
- Paste numbers (one per line, any format), or enter the dataset ID of another run, or a CSV URL (Google Sheets links work if the sheet is shared as "Anyone with the link").
- Set the default country for numbers written without
+(e.g.US,GB,DE,BR,MX). Numbers that start with+,00or011keep their own country. If your data has a country column, put its name in Country field and it is used per record. - For datasets and CSV files, set Phone field to the column with the number (
phone,phoneNumber,Phone,contact.phone…). Lists of numbers or numbers separated by;or|in one cell give one row each. - Run. Export as CSV, Excel, JSON or use the API.
Input examples
A pasted list:
{"phoneNumbers": ["+1 650-253-0000", "(212) 555-0123", "+44 7400 123456", "12345"],"defaultCountry": "US"}
The output of another Actor, keeping the business name and website, without duplicates and only valid numbers:
{"datasetId": "aBcDeFgHiJkLmNoPq","phoneField": "phone","countryField": "countryCode","defaultCountry": "US","keepFields": ["title", "website"],"duplicates": "skip","includeInvalid": false}
A CSV file or Google Sheet:
{"csvUrl": "https://docs.google.com/spreadsheets/d/<sheet-id>/edit#gid=0","phoneField": "Phone","defaultCountry": "GB"}
Output example
{"position": 3,"input": "+44 7400 123456","status": "valid","isValid": true,"isPossible": true,"possibleReason": "IS_POSSIBLE","e164": "+447400123456","international": "+44 7400 123456","national": "07400 123456","rfc3966": "tel:+44-7400-123456","countryCode": "GB","countryName": "United Kingdom","countryCallingCode": 44,"nationalNumber": "7400123456","extension": null,"numberType": "MOBILE","location": "United Kingdom","timeZones": ["Europe/Guernsey", "Europe/Isle_of_Man", "Europe/Jersey", "Europe/London"],"carrier": "Three","defaultCountryUsed": "US","isDuplicate": false,"duplicateOf": null,"error": null,"source": null}
Every row has exactly the same keys, so CSV and Excel exports have stable columns.
status | Meaning |
|---|---|
valid | Right length and an assigned range for that country. Formats, type, time zone, location and carrier are filled |
possible | Right length, but the prefix is not an assigned range (often a typo or a fictional number). Formats are filled, type is not |
invalid | Wrong length or unknown country code. error says why |
unparseable | Not a phone number, no country could be found, or the value was mangled by a spreadsheet (e.g. 5.49E+12) |
The dataset has three views: Validated numbers, Clean list (E.164 only) and Problems. The RUN_SUMMARY record in the key-value store gives totals: valid, possible, invalid, unparseable, duplicates, numbers by country and by line type, and speed.
Pricing
Pay per event: USD 2 per 1,000 numbers (USD 0.002 per number in the results). Numbers you choose to leave out (duplicates with "Remove duplicates", invalid ones with "Include invalid numbers" off) and empty cells are not charged. The run respects your max charge per run. Platform usage is included.
Speed and limits
- Thousands of numbers per second in memory; a list of 100,000 numbers finishes in a few minutes, most of it writing the results.
- Default memory 256 MB is enough for large lists. Up to 1,000,000 numbers per run (
maxNumbers). - CSV files up to 50 MB with a header row;
,;tab or|separators are detected automatically. - Location and carrier names can be returned in other languages where libphonenumber has them (
language: es, pt, de, fr, zh, ja…); English otherwise. - If no row is produced (empty input, wrong field name, wrong dataset ID), the run is marked as failed with a clear message, never a silent empty success.
Why use Phone Number Validator
- Offline and private. Validation runs inside the Actor with Google's libphonenumber metadata; numbers are not sent to any third-party API.
- CRM-ready output: E.164 (
+14155550123), international and national formats,tel:URI, country, line type (mobile, landline, VoIP, toll-free), time zone, and carrier where the numbering plan has it. - Works on messy columns: paste a list, point to a CSV or a Google Sheets link, or read a dataset from another Actor; keep your other columns with
keepFields; per-row country withcountryField. - Duplicates and invalid rows can be flagged, removed (not charged) or left out (not charged).
Cost examples
Prices at the current pay-per-event rates (see Pricing). You can set a maximum charge per run in the run options.
| Job | Approximate cost |
|---|---|
| 1,000 numbers | about $2 |
| 10,000 numbers | about $20 |
| A 500-row CSV export from your CRM | about $1 |
Use it from your code, an integration or an AI agent
Python (pip install apify-client):
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("latamdatatools/phone-number-validator").call(run_input={"phoneNumbers": ["+1 650-253-0000","(212) 555-0123","+44 7400 123456","+49 30 901820"],"defaultCountry": "US"})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
JavaScript / Node.js (npm install apify-client):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('latamdatatools/phone-number-validator').call({"phoneNumbers": ["+1 650-253-0000","(212) 555-0123","+44 7400 123456","+49 30 901820"],"defaultCountry": "US"});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
No code:
- Schedules: run it daily or weekly from Apify Console (Schedules), with the same input saved as a Task.
- Integrations: send results to Google Sheets, Slack, email, Make, Zapier, n8n or Airbyte from the Integrations tab, or call your own webhook when a run finishes.
- AI agents: add it as a tool in Claude, Cursor, VS Code and other MCP clients through the Apify MCP server (
https://mcp.apify.com), so the agent can run Phone Number Validator and read the results.
FAQ
Is my data sent anywhere? No. Validation runs inside the Actor with libphonenumber's built-in metadata. The only network access is reading the CSV URL or dataset you give it.
Why is a real number marked possible or invalid? Usually the default country is wrong (a UK number without +44 read as US), a digit is missing, or the number belongs to a range that was assigned after the library's last update. Check defaultCountryUsed and error.
Why is carrier empty? libphonenumber only ships carrier data for mobile ranges in some countries, and never for fixed lines.
Can it tell me if the number is on WhatsApp or still connected? No, that needs live network lookups, which this Actor deliberately does not do.
How is this different from a phone lookup API? Lookup APIs query telecom networks live (HLR, current carrier, porting), which costs more per number. This Actor checks numbering-plan validity and formats numbers. Use it to clean a list first, and send only the valid mobiles to a paid lookup if you need live status.
Can I read a Google Sheet? Yes. Paste the sheet link in csvUrl; it must be shared as "Anyone with the link".
Questions or a missing field? Open an issue in the Issues tab.