Phone Number Validator avatar

Phone Number Validator

Pricing

$1.30 / 1,000 number validateds

Go to Apify Store
Phone Number Validator

Phone Number Validator

Validate and format phone numbers from any country. Check if numbers are valid, identify carrier and line type, determine geographic location, and normalize to E.164 international format.

Pricing

$1.30 / 1,000 number validateds

Rating

0.0

(0)

Developer

junipr

junipr

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Introduction

Phone Number Validator is a fast, reliable actor for validating, formatting, and enriching phone numbers from any country in the world. Provide a list of phone numbers in any format — E.164, international, national, with dashes, dots, parentheses, vanity letters, or extensions — and get back fully parsed results with validity status, standardized formats, line type classification, timezone, and geographic region.

Primary use cases include CRM data hygiene (standardizing phone fields before outreach), SMS campaign preparation (filtering to mobile-only numbers), fraud prevention (detecting VoIP numbers at signup), and lead list enrichment (adding country and line type data to scraped contacts). Processes individual numbers or batches of up to 100,000 in a single run.

Key differentiators: no external API dependencies (all validation is offline using Google's libphonenumber), zero configuration required (just provide your phone numbers), and support for messy real-world input formats including vanity numbers (1-800-FLOWERS), numbers with extensions, and Unicode digit characters.

Why Use This Actor

Most phone validation solutions either require expensive external API calls, process one number at a time, or break on real-world messy formatting. This actor solves all three problems.

FeatureThis ActorNumVerify APIAbstract APITwilio LookupSelf-hosted libphonenumber
Price per 1,000 checks$1.30$3.00$5.00$5.00Free (self-hosted)
Batch processingYes (100K+)1 at a time1 at a time1 at a timeCode-level
Line type detectionYesYesYesYesYes
Timezone detectionYesNoNoNoYes
Geographic regionYesYesYesYesYes
E.164 formattingYesYesYesYesYes
Vanity number supportYesNoNoNoPartial
Extension extractionYesNoNoNoPartial
Unicode digit supportYesNoNoNoPartial
Zero-configYesNeeds API keyNeeds API keyNeeds API keyNeeds setup
External API dependencyNoneNumVerifyAbstractTwilioNone

At $1.30 per 1,000 numbers, this actor costs 50–70% less than commercial API alternatives while offering more features. Phone numbers never leave Apify infrastructure — no third-party API sees your contact data.

How to Use

Zero-config: Simply provide an array of phone numbers and run. Default settings enable all enrichment (line type, timezone, region) and accept any input format.

{
"phoneNumbers": ["+14155552671", "(020) 7946 0958", "1-800-FLOWERS"]
}

Via Apify API:

const { ApifyClient } = require('apify-client');
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('junipr/phone-number-validator').call({
phoneNumbers: ['+14155552671', '+442079460958'],
defaultCountryCode: 'US',
onlyMobile: false,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

CRM cleanup workflow: Export your CRM phone column to a CSV, extract the phone column, feed it to this actor, then use the e164 output field to update your CRM with standardized E.164 numbers. Use isValid: false to flag records that need manual review.

SMS campaign prep: Set onlyMobile: true to filter your list to mobile numbers only. This ensures your SMS campaign only targets numbers that can receive text messages and helps avoid TCPA violations from texting landlines.

Input Configuration

ParameterTypeDefaultDescription
phoneNumbersarray<string>["+14155552671", "+442079460958", "+81312345678"]Phone numbers to validate. Accepts any format. Max 100,000.
defaultCountryCodestring"US"ISO 3166-1 alpha-2 code applied to numbers without a country prefix (e.g., "US", "GB", "JP").
detectCarrierbooleantrueAttempt carrier/operator detection.
detectLineTypebooleantrueDetect mobile, landline, VoIP, toll-free, etc.
includeTimezonebooleantrueReturn IANA timezone(s) for the number's country.
includeGeocodebooleantrueReturn geographic region (country name).
strictValidationbooleanfalseReject numbers that don't match the country's exact numbering plan.
outputFormatstring"all"Format output: "all" (E.164 + national + international + RFC3966), "e164", or "national".
onlyValidbooleanfalseOnly write valid numbers to the dataset.
onlyMobilebooleanfalseOnly write mobile numbers to the dataset.
maxConcurrencyinteger50Concurrent parsing operations (1–100).

Common configurations:

  • Quick validation (format + validity only): detectCarrier: false, includeTimezone: false, includeGeocode: false
  • Full enrichment (all metadata): use all defaults
  • Mobile filter for SMS: onlyMobile: true, onlyValid: true

Output Format

Each phone number produces one dataset item:

{
"input": "+1 (415) 555-2671",
"isValid": true,
"isPossible": true,
"e164": "+14155552671",
"nationalFormat": "(415) 555-2671",
"internationalFormat": "+1 415 555 2671",
"rfc3966": "tel:+14155552671",
"countryCode": "US",
"countryCallingCode": "1",
"nationalNumber": "4155552671",
"extension": null,
"lineType": "mobile",
"carrier": null,
"region": "United States",
"timezones": ["America/New_York", "America/Chicago", "America/Denver", "America/Los_Angeles"],
"validationErrors": ["CARRIER_UNAVAILABLE"],
"checkedAt": "2026-03-11T12:00:00.000Z"
}

Invalid number example:

{
"input": "+1415",
"isValid": false,
"isPossible": false,
"e164": null,
"nationalFormat": null,
"internationalFormat": null,
"rfc3966": null,
"countryCode": null,
"countryCallingCode": null,
"nationalNumber": null,
"extension": null,
"lineType": null,
"carrier": null,
"region": null,
"timezones": [],
"validationErrors": ["INVALID_LENGTH"],
"checkedAt": "2026-03-11T12:00:00.000Z"
}

A JSON run summary is saved to the Key-Value Store under the OUTPUT key with totals, line type breakdown, and country breakdown.

Tips and Advanced Usage

Setting defaultCountryCode: If your input list contains national-format numbers without country codes (e.g., (415) 555-2671 instead of +14155552671), set defaultCountryCode to the country of origin. Without it, numbers without a + prefix will have COUNTRY_ASSUMED added to validationErrors and will default to US format.

VoIP detection for fraud prevention: Set detectLineType: true (default) and filter results where lineType === "voip". VoIP numbers (Google Voice, Skype, TextNow) are commonly used in signup fraud. Flag these for manual review in your fraud prevention workflow.

SMS campaign targeting: Use onlyMobile: true to pre-filter your dataset. Combined with isValid: true, this gives you a clean list of deliverable mobile numbers ready for campaign upload. This also helps with TCPA compliance by ensuring you only text mobile numbers.

Large batch optimization: For 100K number batches, keep maxConcurrency at 50 (default). All processing is in-memory — concurrency primarily affects dataset write throughput, not parsing speed. Memory usage stays well under 256MB regardless of batch size.

Vanity number conversion: Input numbers like 1-800-FLOWERS or 1-800-CALL-ATT are automatically converted to digits before parsing. The output e164 will contain the digit-only E.164 form.

Extension handling: Numbers with extensions like +14155552671 ext. 123 or +14155552671 x123 have the extension extracted into the extension field. The main number is validated without the extension.

Pricing

This actor uses Pay-Per-Event pricing at $1.30 per 1,000 numbers validated ($0.0013 per number).

Pricing includes all platform compute costs — no hidden fees.

ScenarioNumbersEstimated Cost
Single validation1$0.0013
CRM cleanup (500 contacts)500$0.65
SMS campaign prep (5,000)5,000$6.50
Lead list enrichment (25,000)25,000$32.50
Enterprise database (100,000)100,000$130.00

Empty strings and whitespace-only inputs are not billed. Numbers that produce a result (valid or invalid) count as one billable event.

FAQ

Does this check if the number is currently active or connected?

No. All validation is done using offline metadata — no calls or pings are made to phone numbers. This is by design: it makes the actor fast, cheap, and compliant with telecom regulations. Validity means the number is structurally correct for the country, not that it is currently in service. Live reachability checks require carrier network access (available via Twilio Lookup or similar services at much higher cost).

How accurate is carrier detection?

Carrier detection is not currently available in the JavaScript port of libphonenumber. The carrier field will be null for most numbers and a CARRIER_UNAVAILABLE warning will appear in validationErrors. The Java version of libphonenumber includes carrier prefix databases, but these have not been ported to the JavaScript library. This is a known limitation documented transparently.

Can I validate numbers without a country code?

Yes. Set defaultCountryCode to the ISO 3166-1 alpha-2 code of the country your numbers come from (e.g., "GB" for UK numbers). Numbers without a + prefix will be parsed using that country's numbering plan. A COUNTRY_ASSUMED warning is added to validationErrors to indicate the assumption was made.

What is the difference between isValid and isPossible?

isPossible is a length-based check — it verifies the number has a plausible number of digits for the country. isValid is a stronger check that also validates the number against the country's numbering plan (valid area codes, subscriber number ranges, etc.). A number can be isPossible: true but isValid: false if it has the right length but uses an invalid area code. With strictValidation: false (default), isValid is set to true when isPossible is true.

Does it support all countries?

Yes. The actor uses libphonenumber-js/max which includes full metadata for 200+ countries and territories. This includes complex numbering plans for countries like Argentina, Mexico, Brazil, and India where mobile number formatting has changed over time.

Can I filter to only mobile numbers for SMS campaigns?

Yes. Set onlyMobile: true in your input. Only numbers where lineType === "mobile" will be written to the dataset. Numbers detected as FIXED_LINE_OR_MOBILE are also classified as mobile, since they can receive SMS. This filter is applied before dataset writes but after billing — non-mobile numbers are still counted for billing purposes.

How does VoIP detection help with fraud prevention?

VoIP numbers (Google Voice, Skype, TextNow, Vonage) are not tied to a physical location or carrier contract, making them common in signup fraud, bonus abuse, and fake account creation. When detectLineType: true, numbers with lineType === "voip" can be flagged for additional verification steps in your signup flow. This doesn't prove fraud, but VoIP at scale is a strong signal worth investigating.

What formats can I input?

The actor accepts virtually any phone number format: E.164 (+14155552671), international with spaces (+1 415 555 2671), national with parentheses ((415) 555-2671), dashes (415-555-2671), dots (415.555.2671), vanity letters (1-800-FLOWERS), numbers with extensions (+14155552671 ext. 123), trunk prefixes (0044... or 011...), and Unicode digit characters (Arabic-Indic, Devanagari, etc.). All are normalized before parsing.


Related actors: Email Validator & Verifier