SiteVerdict — Phone Number Validator & Formatter (Bulk) avatar

SiteVerdict — Phone Number Validator & Formatter (Bulk)

Pricing

$0.50 / 1,000 number validateds

Go to Apify Store
SiteVerdict — Phone Number Validator & Formatter (Bulk)

SiteVerdict — Phone Number Validator & Formatter (Bulk)

Validate and format phone numbers in bulk for 240+ countries: valid/possible, E.164, international and national formats, mobile/landline/VoIP/toll-free type, country, duplicates and fiction/test ranges. Offline metadata, no lookups of people.

Pricing

$0.50 / 1,000 number validateds

Rating

0.0

(0)

Developer

Aman Thakran

Aman Thakran

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Phone Number Validator & Formatter: clean 100,000 numbers in one run

Check, standardise and de-duplicate phone numbers from 240+ countries in bulk. You get a valid/invalid verdict with the reason, the E.164, international and national formats, the number type (mobile, landline, VoIP, toll-free, premium rate...) and the country. Numbers in the drama/test ranges reserved by Ofcom, NANPA and ACMA are flagged too.

Everything runs offline on Google's libphonenumber numbering-plan metadata. We never call a carrier, an HLR service or any "who owns this number" database, and we never send your numbers to a third party.

Who it is for

  • CRM and marketing ops: normalise a messy contact export to E.164 before an SMS or WhatsApp campaign, and drop invalid and duplicate rows first.
  • Developers and data teams: validate sign-up form numbers in batch, or as one step in an Apify pipeline that reads another Actor's dataset.
  • Agents (MCP): a fast, deterministic validate_phone_numbers tool that returns structured JSON.

What you get per number

FieldExample
status / valid / possiblevalid / true / true
e164+447700900123
international / national+44 7700 900123 / 07700 900123
rfc3966 / telUritel:+447700900123
type / typeLabel / isMobileMOBILE / Mobile / true
country / countryName / countryCallingCodeGB / United Kingdom / 44
possibleCountries["GB"] (shared calling codes such as +1 list every candidate)
extension123 (from "ext. 123")
fictionalOrTestOfcom drama/fiction range (mobile 07700 900xxx)
duplicateOfindex of the first occurrence (same E.164 + extension)
error / lengthCheckToo short to be a phone number. / TOO_SHORT
sha256 (optional)salted hash of the E.164, for privacy-preserving matching

The format examples use the Ofcom drama number 07700 900123, which this Actor itself reports as invalid (reserved for fiction, never assigned); a real, assigned mobile gets valid and MOBILE as shown in the other rows.

You also get NUMBERS.csv (safe against spreadsheet formula injection) and an OUTPUT summary with counts by status, type and country.

Before and after

Input (default country GB):

07700 900123 | +44 7700 900123 | 020 7946 0018 | 12345 | not a phone

Output (abridged):

inputstatuse164typenote
07700 900123invalid+447700900123Reserved for drama/fiction or testing
+44 7700 900123(duplicate, removed)duplicateOf 0, not charged
020 7946 0018valid+442079460018FIXED_LINEOfcom drama/fiction range
12345invalid+4412345Too short to be a phone number
not a phoneparse_errorDoes not look like a phone number

Inputs

  • Phone numbers: a list in any common format (spaces, brackets, dashes, 00 or + prefixes, ext.).
  • Default country: used for numbers written without +. Leave it empty to accept international numbers only.
  • Paste numbers or text: one number per line. Turn on Find numbers inside text to pull numbers out of e-mails or notes.
  • Records (JSON): {phone, country, label} objects. The label is echoed back so you can join the results to your data.
  • Dataset: read numbers from another Apify dataset (datasetId, datasetField, optional datasetCountryField).
  • Privacy options: maskNumbers (output shows only the first 2 and last 3 digits) and includeHash with a secret hashSalt.

Pricing

Pay per event: $0.0005 per number validated ($0.50 per 1,000).

  • 1,000 numbers ≈ $0.50
  • 10,000 numbers ≈ $5
  • 100,000 numbers ≈ $50

Duplicates (when Remove duplicates is on), empty lines and over-long inputs are never charged. The run stops cleanly at your maximum total charge.

FAQ

Does "valid" mean the line is active or reachable? No. "Valid" means the number fits an assigned range in the national numbering plan. Checking whether a line is live needs a carrier/HLR lookup, which we deliberately don't do.

Do you return the carrier name? No. The open libphonenumber metadata does not include carrier or owner data. You get the number type (mobile, landline, VoIP...). Number portability also makes carrier-by-prefix unreliable.

Why is 07700 900123 invalid? Ofcom reserves that range for TV and radio drama, so it is never assigned to anyone. We flag these ranges so test data doesn't end up in your CRM.

Which countries? Every region in libphonenumber, 240+ countries and territories, plus non-geographic codes such as +800 and +870.

How fast is it? Thousands of numbers per second. A 100,000-number run is usually limited by dataset writes, not validation.

Run time, aborts and partial results

  • Run time: all numbers are validated first (in memory, offline), then saved to the dataset in batches of 500. Small lists finish in seconds; a 100,000-number run is mostly dataset writing. Memory above the default does not make it faster.
  • Charged per saved batch: each batch is charged right after it is saved, and only for valid, invalid and unparseable numbers (duplicates removed by "Remove duplicates", which is on by default, too-long inputs and numbers dropped by "Only output valid numbers" are free). If you abort the run or it times out, the batches already saved stay in the dataset and were charged; nothing else is charged.
  • Saved only at the end: NUMBERS.csv and the OUTPUT summary are written when the run finishes, so an aborted run has neither. If the run's maximum charge is reached, the remaining numbers are not output and the log says how many were skipped.
  • Input errors fail fast: a field of the wrong type (for example a single string instead of a list) stops the run before any work with an "Input problem" message, and nothing is charged.

Limits

  • Up to 100,000 numbers per run and 64 characters per number (longer inputs are reported as too_long_input and not charged).
  • Validation reflects the bundled metadata release (libphonenumber-js 1.13.14). Ranges opened after that release may show as invalid until we update.
  • There is no reachability, carrier, porting, owner or spam-score data, by design.

Sources & compliance

  • Data: libphonenumber-js (MIT), built on Google libphonenumber metadata (Apache-2.0). Bundled with the Actor; no network calls. Checked 11 Oct 2026.
  • Fiction/test ranges: Ofcom "Telephone numbers for drama purposes", NANPA 555-0100 to 555-0199, and ACMA "Phone numbers for use in creative works". The ACMA mobile block is flagged as a block; only the specific listed numbers are reserved.
  • Personal data (UK GDPR / PECR): a phone number can be personal data. This Actor only processes the numbers you supply and enriches nothing about individuals. Use maskNumbers or includeHash to limit what is stored. You need a lawful basis to hold the numbers, and under PECR consent before sending marketing texts or making marketing calls (check TPS/CTPS for UK calls). This is not legal advice.
  • The hash salt is a secret input. It is never logged or written to the output. Without a salt (or with a short one) the sha256 column is a plain SHA-256 of the E.164 number, the form some ad platforms use for matching; phone numbers are easy to guess, so a plain hash is not anonymisation, and the run log warns about it.
  • Retention: results are written only to storages in your own Apify account (the run's dataset and key-value store) and follow your Apify plan's data-retention period. Nothing is sent anywhere else: validation is offline.

Built by SiteVerdict (BharatFare Travel and Technologies Ltd, UK). Contact: Use the Issues tab on this Actor's Store page.