LinkedIn Phone Number Scraper By Region & City Targeting
Pricing
Pay per usage
LinkedIn Phone Number Scraper By Region & City Targeting
LinkedIn Phone Number Scraper collects phone contact data to support workforce research and outreach. Analyze roles, sectors, or regions while identifying direct contact points efficiently.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
0
Bookmarked
13
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
LinkedIn Phone Scraper — City and Region Targeting
LinkedIn Phone Region Targeter finds publicly indexed phone numbers tied to LinkedIn content for a keyword, country, and — uniquely — a specific list of cities or regions within that country, tagging every result with exactly where it was geo-targeted from. It's built for local sales teams who need leads scoped to a specific metro area rather than an entire country, franchise and multi-location businesses researching phone contacts city by city, and lead-generation teams who want a per-city breakdown of how many leads and distinct numbers a search actually surfaced. No LinkedIn login is required — every number comes from Google's own indexed search snippets. Every section below documents an input, an output field, or exactly how the city targeting and deduplication work.
What is LinkedIn Phone Region Targeter?
This Actor is a superset of a country-wide LinkedIn phone-number scraper: it still runs the same keyword-plus-country Google dork search, and adds a cities list that repeats each keyword's search once per named city, tagging every resulting row with the city it was found under and emitting a real aggregated summary row per city once the run finishes.
Key capabilities, read from the source:
- Per-city search + tagging.
process_keyword()insrc/main.pybuilds a separate Google query per city in yourcitieslist (viabuild_queries()), and every phone row it finds is tagged with thatcity— leavingcitiesempty preserves the original country-wide, city-less behavior exactly. - Cross-city deduplication with cross-reference, not silent dropping. The same phone number found under a second city isn't duplicated or discarded —
alsoFoundInCitieson the original lead row gets that second city appended, so you can see a number surfaced under more than one city search without inflating your lead count. - Real, aggregated per-city summary rows.
build_city_summary()computesleadCountandphoneCountfrom the actualpairs/phonessets collected for that city during the run — not an estimate — and pushes one summary row per requested city after all keyword/city combinations have been scanned. - GOOGLE_SERP-only proxying.
create_proxy_configuration()always routes through theGOOGLE_SERPApify proxy group specifically, because the module's own comment notes theRESIDENTIALgroup serves Google's JS-gated shell with no real results over plain HTTP —GOOGLE_SERPis the only group that reliably returns a real results page. - Genuine block detection, not a status-code guess.
fetch_html()classifies a response viais_block_page(), which inspects the actual response body rather than trusting the HTTP status alone, and retries with jitter before giving up on a query.
What data can I extract with LinkedIn Phone Region Targeter?
Every field below is read directly from parse_serp(), process_keyword(), and build_city_summary() in the source — the dataset's default view surfaces all 13 as table columns.
Lead rows (recordType: "lead")
| Field | Example Value | Use Case |
|---|---|---|
phone_number | +44 20 7946 0958 | The extracted, dial-code-matched number |
platform | Linkedin.com | Source platform label |
keyword | marketing | Which of your search keywords surfaced this row |
city | London | The city this lead was tagged under; null for a country-wide (no-city) search |
title | Google result title | The indexed page's title |
description | Google result snippet | The text the phone number was extracted from |
url | LinkedIn profile/page URL | Where the number was published |
country / dial_code | United Kingdom / +44 | Search scope, echoed onto every row |
alsoFoundInCities | ["Manchester"] | Other cities where the same phone number also turned up |
recordType | "lead" | Row-type discriminator |
City summary rows (recordType: "city_summary")
| Field | Example Value | Notes |
|---|---|---|
title | "City summary — London" | |
description | "14 lead row(s) / 12 distinct phone number(s) surfaced under city 'London' for keyword(s): marketing." | Human-readable rollup |
leadCount | 14 | Real count of (url, phone) pairs collected for this city before cross-city collapse |
phoneCount | 12 | Real count of distinct phone numbers for this city |
phone_number / url | null / "" | Summary rows carry no single phone or URL |
Why not build this yourself?
LinkedIn does not expose phone numbers through any public API, and the only path to a public phone number tied to LinkedIn content is whatever Google has indexed in a page's visible snippet text — which means building and tuning a Google-dork query strategy, handling Google's own anti-automation detection (a "blocked" response often still returns HTTP 200 with a CAPTCHA-shaped body, not a clean error status), and routing through the specific proxy pool that actually returns real results rather than a JS-gated shell. This Actor already handles the correct proxy group selection, genuine body-based block detection with retry, and a query pattern that reliably surfaces LinkedIn-hosted content specifically — building that query and block-detection logic from scratch is most of the actual work.
How to use data extracted from LinkedIn Phone Region Targeter?
Local and regional sales teams
Set cities to your specific target metros within a country rather than running one broad country-wide search, and use the per-city summary rows to immediately see which cities produced the most leads before doing any manual review.
Franchise and multi-location businesses
Search a role or industry keyword across each of your franchise territories' cities in one run, and use alsoFoundInCities to spot numbers that show up in more than one territory's search — a signal worth a closer look before assigning a lead to a single territory.
Lead-generation and enrichment pipelines
Because every lead row already carries city and every summary row carries real aggregated counts, a pipeline can route leads to city-specific campaigns without any additional geocoding step.
Market coverage research
Compare leadCount/phoneCount across your requested cities to see where a given keyword (e.g. an industry or job title) has denser public LinkedIn-linked phone-number coverage, without manually re-running separate country-wide searches.
🔼 Input sample
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
keywords | Yes | array | Keywords, LinkedIn usernames, or profile URLs to search for. | ["plumber", "electrician"] |
country | Yes | string enum | Country to scope the search and dial-code matching to (full list of ~150 countries with dial codes). | "United Kingdom (+44)" |
cities | No | array | City/region names to geo-target within the selected country. Each keyword is searched once per city. Leave empty for a country-wide search. | ["London", "Manchester"] |
platform | No | string enum | Currently only "Linkedin". Default "Linkedin". | "Linkedin" |
maxPhoneNumbers | No | integer (1–10000) | Max phone numbers to collect per keyword. Default 20. | 50 |
useApifyProxy | No | boolean | Route through Apify Proxy (GOOGLE_SERP group). Default true. | true |
{"keywords": ["marketing"],"country": "United Kingdom (+44)","cities": ["London", "Manchester"],"maxPhoneNumbers": 30}
Common pitfall: maxPhoneNumbers caps new phone numbers per keyword, not per city — with multiple cities set, the cap is checked as leads accumulate across all cities for that keyword, so a keyword may reach its cap on an earlier city and collect nothing further from the remaining cities in that pass. Split a broad multi-city sweep into multiple keyword variants if you want a guaranteed minimum per city.
🔽 Output sample
Output is one JSON row per unique phone-number lead, plus one summary row per requested city, all pushed to the run's default dataset and charged as one row_result event per row.
{"recordType": "lead","platform": "Linkedin.com","keyword": "marketing","city": "London","title": "Jane Doe — Marketing Director | LinkedIn","description": "...contact me at +44 20 7946 0958 for marketing inquiries...","url": "https://www.linkedin.com/in/janedoe/","phone_number": "+44 20 7946 0958","country": "United Kingdom","dial_code": "+44","alsoFoundInCities": []}
A city summary row:
{"recordType": "city_summary","platform": "Linkedin.com","keyword": null,"title": "City summary — London","description": "14 lead row(s) / 12 distinct phone number(s) surfaced under city 'London' for keyword(s): marketing.","url": "","phone_number": null,"country": "United Kingdom","dial_code": "+44","city": "London","leadCount": 14,"phoneCount": 12}
How do you target specific cities and regions?
City list drives the search itself, not a post-hoc filter. Each city in cities becomes its own Google query (via build_queries()), not a filter applied after a single broad search — so the results for "marketing" in "London" and "marketing" in "Manchester" come from two genuinely separate, city-scoped searches, not one national result set split by address.
Leaving cities empty is intentional, not a smaller version of city targeting. An empty cities list runs the original country-wide, city-less search pass — it is not equivalent to targeting "the whole country" as a single city entry, since no city term is added to the query at all.
Use alsoFoundInCities as a cross-territory signal. A phone number appearing under more than one city (visible in alsoFoundInCities on its lead row) often indicates a business or individual with a presence spanning multiple named territories — useful context before assigning the lead to a single regional campaign.
Three real examples:
{ "keywords": ["real estate agent"], "country": "United States (+1)", "cities": ["Austin", "Dallas", "Houston"], "maxPhoneNumbers": 50 }
Three-city Texas metro sweep for one keyword.
{ "keywords": ["dentist", "orthodontist"], "country": "Canada (+1)", "cities": ["Toronto"], "maxPhoneNumbers": 100 }
Single-city, multi-keyword local healthcare-provider search.
{ "keywords": ["consultant"], "country": "United Kingdom (+44)", "maxPhoneNumbers": 200 }
Country-wide search with no city targeting — the base behavior.
▶️ Want to try other LinkedIn scrapers?
| Scraper | What it extracts |
|---|---|
| LinkedIn Profile Contact Extractor | Contact details parsed from a profile |
| LinkedIn Company URL Mass Profile Finder | Bulk company URL discovery with executive contacts |
| LinkedIn Jobs Scraper — Employer & Company Details | Job postings with employer profile data |
| LinkedIn Comments and Reactions Scraper | Post comments, replies and reaction breakdown |
How to extract phone-number leads programmatically
This Actor runs as a standard Apify Actor call — one API call in, structured JSON dataset out, using your Apify API token.
Python example
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("<YOUR_USERNAME>/linkedin-phone-region-targeter").call(run_input={"keywords": ["marketing"],"country": "United Kingdom (+44)","cities": ["London", "Manchester"],})for item in client.dataset(run["defaultDatasetId"]).iterate_items():if item.get("recordType") == "lead":print(item["phone_number"], item["city"], item["url"])
Export to spreadsheets or CRM
Every dataset supports one-click CSV/Excel export from the Apify Console. Filter on recordType to separate lead rows from per-city summary rows before loading into a CRM.
Is it legal to scrape LinkedIn-linked phone numbers?
This Actor only surfaces phone numbers already published in Google's own publicly indexed search results — it does not access LinkedIn directly or bypass any LinkedIn login. Phone numbers tied to an identifiable individual are personal data under GDPR/CCPA, so treat storage and outreach accordingly, and be aware that unsolicited phone or SMS outreach is separately regulated in most jurisdictions (TCPA in the US, PECR in the UK, and equivalents elsewhere). Consult legal counsel before using this data for outbound calling or messaging campaigns.
❓ FAQ
Does maxPhoneNumbers apply per city or per keyword overall?
Per keyword, across all its cities combined — not per city individually. If a keyword's cap is reached on an early city in your list, later cities for that same keyword may return no new leads even if more numbers exist there.
What happens to a phone number found in more than one city?
It isn't duplicated as a second lead — the original lead row keeps its first-found city, and the additional city is appended to that row's alsoFoundInCities array so the cross-city signal isn't lost.
Are the city summary counts estimated?
No — leadCount and phoneCount on each summary row are computed from the actual (url, phone) pairs and distinct phone numbers collected for that city during the run, before cross-city deduplication collapses any repeats.
What if I don't set any cities?
The Actor runs its original country-wide, city-less search exactly as it did before city targeting existed — one pass per keyword, no city tag on any row, and no summary rows are produced.
Do I need a LinkedIn account to use this?
No — every phone number comes from Google's own publicly indexed search snippets, not from a LinkedIn login session.
Why did a search return no phone numbers at all?
Public phone numbers tied to your keyword may simply not be present in Google's indexed snippets for that search — try a broader keyword (a job title or industry term) rather than a single narrow profile URL, which is far less likely to have an indexed phone number nearby.
How does this compare to other LinkedIn phone-number scrapers?
As observed on the Apify Store on 2026-07-26, scraper-mind/linkedin-phone-number-scraper and api-empire/linkedin-profile-phone-number-scraper both extract phone numbers by keyword and country, but neither documents city/region-level targeting or a per-city aggregated summary row — that geo-targeting layer is unique to this Actor.
Does this work with AI agent frameworks?
Yes — call it as a standard HTTP endpoint via the Apify API from any agent framework capable of making an API call; there's no MCP-specific integration for this Actor.
Conclusion
LinkedIn Phone Region Targeter turns a keyword-and-country phone-number search into a city-scoped one — every lead tagged with where it was found, cross-city repeats tracked rather than duplicated or dropped, and a real aggregated summary per city. It fits local sales, franchise, and territory-based lead-generation work that needs geography built into the search itself. Start a run from the Apify Console or the Apify API with your target keywords, country, and cities to get your first geo-tagged lead export.