Bulk Phone Validator — Line Type, Carrier & Reverse Lookup
Pricing
from $5.20 / 1,000 number resolveds
Bulk Phone Validator — Line Type, Carrier & Reverse Lookup
Bulk phone number validator and reverse phone lookup. One rich row per number: valid/invalid verdict, line type (mobile, VoIP, toll-free, premium rate), country, carrier, region, time zone, 4 formats, SMS-capability, risk flags, plus a batch summary. Offline, no API keys.
Pricing
from $5.20 / 1,000 number resolveds
Rating
0.0
(0)
Developer
Daniel Carter
Maintained by CommunityActor stats
0
Bookmarked
17
Total users
4
Monthly active users
6 days ago
Last modified
Categories
Share
Bulk Phone Number Lookup — Phone Validator & Reverse Phone
Paste up to 20,000 phone numbers and get 1 row per number with 25 fields: valid or not, line type, country, carrier, time zone, all four standard formats, SMS capability and risk flags. This
bulk phone number lookup and phone validator turns a messy column of
numbers — (415) 555-2671, 001-415-555-2671, +82 10-1234-5678 — into clean,
decision-ready rows: valid or invalid, what kind of line it is, which country and
carrier range it belongs to, what time zone the owner is in, all four standard
formats, whether you can send it an SMS, and what to watch out for.
Powered by libphonenumber, the same numbering-plan library that ships inside Android — running fully offline on the Apify platform, with API access, scheduling, integrations and monitoring built in.
Unofficial. This Actor uses the open-source libphonenumber metadata (Apache-2.0, via the
phonenumbersPython port) and is not affiliated with, endorsed by, or sponsored by Google or any carrier. SeeLICENSE-NOTICE.md.
Free plan vs paid plan
| Free Apify plan | Paid Apify plan | |
|---|---|---|
| Full result rows | First 25 numbers | Every number (up to 20,000 per run) |
| The rest of your list | Analysed too, shown as counts only: valid / invalid, VoIP, premium-rate, SMS-capable, risk levels, line types | Full 25-field row per number |
Final free-plan-preview row | Exact counts of what is locked and what the paid run would cost | Not needed |
Paid plans also get store discounts: BRONZE -20%, SILVER -35%, GOLD and above -48%. The free-plan limit ends the run as SUCCEEDED with a status message; it is a plan limit, not an error.
Why use Bulk Phone Number Lookup?
- Bulk, not one-at-a-time — hand it a whole list; every number comes back as its own row, plus one batch summary row at the end.
- A verdict, not a boolean. Most validators answer
true/false. This one answers in a sentence you can paste into a ticket:+82 10-1234-5678 — valid South Korea mobile, Asia/Seoul, safe to SMS - Line type, so you know what you are calling — mobile, fixed line, VoIP, toll-free, premium rate, shared cost, pager, UAN, voicemail.
- Risk flags —
premium-rate,voip,shared-cost,toll-free,not-possible,invalid-for-region,country-mismatch,unparseable, rolled into a singleriskLevelof none / low / medium / high. Premium-rate numbers in a lead list are a cost trap; this is the field that catches them. - SMS-capability —
smsCapableistruefor mobile lines,falsefor fixed lines and service numbers, andnullwhen the plan genuinely cannot tell (VoIP, personal numbers). Filter your SMS campaign on one field. - Reverse phone data — country, country name, international dialling code,
geographic region (
San Francisco, CA,London), carrier range (Vodafone,T-Mobile) and IANA time zones, all from public numbering-plan metadata. - Four formats at once — E.164 (
+14155552671), international (+1 415-555-2671), national ((415) 555-2671) and RFC3966 (tel:+1-415-555-2671), so the output drops straight into your CRM, dialler or SMS gateway. - Duplicate collapsing —
415-555-2671and+1 415 555 2671are the same line; withdedupeon (the default) you get one row, not two. - Offline and private — no API keys, no third-party service, no lookup request leaves the run. Your list is never sent anywhere.
How to use Bulk Phone Number Lookup
- Paste your numbers into Phone numbers.
- Set a Default region (e.g.
US,GB,KR) if some numbers have no country code. - Click Start and read the results in the Output tab, or pull them through the Apify API.
Input
| Field | Type | Description |
|---|---|---|
phoneNumbers | array | The numbers to check. Any format. |
phoneNumber | string | Single-number alternative. |
defaultRegion | string | ISO 3166-1 alpha-2 code used for numbers with no country code (e.g. US). |
dedupe | boolean | Collapse numbers that normalise to the same E.164 value. Default true. |
{"phoneNumbers": ["+1 415-555-2671","+82 10-1234-5678","+44 20 7183 8750","+49 1522 3433333","+1 900 555 0199"],"defaultRegion": "US","dedupe": true}
Output
One dataset item per phone number. Rows that carry a noticeCode are status
rows, not results (summary, no-input, targets-truncated,
parsing programmatically.
Invalid input ends the run as SUCCEEDED with a notice row.
{"input": "+49 1522 3433333","valid": true,"possible": true,"e164": "+4915223433333","international": "+49 1522 3433333","national": "01522 3433333","rfc3966": "tel:+49-1522-3433333","numberType": "MOBILE","numberTypeLabel": "mobile","country": "DE","countryName": "Germany","countryCallingCode": "+49","region": "Germany","carrier": "Vodafone","timezones": ["Europe/Berlin"],"smsCapable": true,"riskFlags": [],"riskLevel": "none","invalidReason": null,"normalization": {"changed": true,"strippedCharacters": ["+", " "],"inputLength": 16},"headline": "+49 1522 3433333 — valid Germany mobile (Vodafone), Europe/Berlin, safe to SMS","scannedAt": "2026-08-26T00:00:00.000Z"}
The batch also gets one unbilled summary row with numbersReceived,
numbersAnalysed, duplicatesRemoved, validCount, invalidCount,
smsCapableCount, and the full countryDistribution, typeDistribution and
riskFlagDistribution. If Apify restarts the run and it returns more numbers
after the restart, a new summary row replaces the earlier one: read the summary
with the highest summaryVersion (it is also the last summary in the dataset).
You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.
Data table
| Field | Description |
|---|---|
input | The number exactly as you supplied it |
headline | One-line verdict for this number |
valid | Whether the number is valid under its country's numbering plan |
possible | Whether the length is plausible for that plan |
e164 / international / national / rfc3966 | The four standard formats |
numberType / numberTypeLabel | Line type code and human label |
country / countryName / countryCallingCode | ISO code, country name, dialling code |
region | Geographic area the number range belongs to |
carrier | Carrier that holds the number range, where the plan records one |
timezones | IANA time zones for the number range |
smsCapable | true / false / null when the plan cannot tell |
riskFlags / riskLevel | What to watch out for, and how serious |
invalidReason | Why a number failed, in plain English |
normalization | What changed between your input and E.164 |
scannedAt | UTC timestamp of the check |
Pricing
Pay-per-event: $0.005 per run plus $0.01 per number resolved. A list of
100 numbers costs $1.005 for that run (FREE-tier prices; BRONZE -20%, SILVER -35%, GOLD and above -48%). Every number written to the dataset is
charged, whether the verdict is valid or invalid — an "invalid" verdict is the
answer you asked for, and it is the one that saves you a wasted SMS. Batch
summary and status rows (summary, free-plan-preview, charge-limit-reached,
billing-unavailable) are not charged. The $0.005 per-run charge applies to every
run, including one started with no phone number: it ends SUCCEEDED with a
no-input row, and that per-run charge is all it costs. If your run's maximum charge is reached,
the run stops before the next row and ends SUCCEEDED; every row already
delivered was paid for. If Apify restarts or migrates a run, the per-run charge and
the numbers already returned are not charged or returned again. A row handed over just before the restart but not yet charged is charged once after it. If the Apify charging API fails, the run retries the charge of the row it just returned (up to three times in a row, when the Apify SDK can retry it without charging twice; otherwise not at all) and then stops before the next row (billing-unavailable). Apify platform compute is billed separately per your plan.
**
Tips
- Set
defaultRegionto the country your list mostly comes from — numbers without a country code are unparseable otherwise. - Filter on
smsCapable == truebefore an SMS campaign, and onriskLevel in ("medium", "high")before a dialler campaign. country-mismatchcatches numbers that claim one country but belong to another — a common signal in fraud screening.- Schedule a recurring run against an exported CRM segment to keep contact data clean over time.
FAQ, disclaimers, and support
Does it tell me who owns the number? No. This Actor returns numbering-plan facts — validity, line type, country, region, carrier range, time zone — not subscriber identity. No personal data is looked up or returned.
Does it tell me whether the number is currently in service? No. Offline validation says the number is well-formed and issuable under the public numbering plan. Live line-status checks require a paid HLR lookup, which this Actor deliberately does not perform.
Why is carrier empty for some numbers? Carrier data exists only for
mobile ranges in countries that publish it, and number portability means the
range holder is not always the current carrier. Treat it as a strong hint, not
a guarantee.
Privacy & data responsibility. You are the data controller for every number you submit; ntriqpro is a data processor acting solely on your instructions. Validation runs offline inside your own run and we do not store your results — output is written only to your own run's dataset. You are responsible for a lawful basis and for complying with GDPR, PIPA, CCPA, TCPA and other applicable laws.
Open-source licence. Built on libphonenumber (Apache-2.0) by Google, via
the phonenumbers Python port by David Drysdale. It is an independent
integration, not an official distribution. See LICENSE-NOTICE.md.
Found a bug or want a feature? Use the Issues tab. Custom solutions available.
Used this Actor? A sentence in the Reviews tab about what you used it for helps the next person decide.
Works well with
- phoneinfoga-osint — Take any number that passed validation into a deep OSINT lookup.
- theharvester-osint — Harvest more numbers and emails from a company domain to feed this validator.
Every run of this Actor also returns these suggestions in the nextSteps field of its summary row.