LinkedIn Phone Number Scraper By Region & City Targeting avatar

LinkedIn Phone Number Scraper By Region & City Targeting

Pricing

Pay per usage

Go to Apify Store
LinkedIn Phone Number Scraper By Region & City Targeting

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

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

13

Total users

1

Monthly active users

5 days ago

Last modified

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() in src/main.py builds a separate Google query per city in your cities list (via build_queries()), and every phone row it finds is tagged with that city — leaving cities empty 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 — alsoFoundInCities on 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() computes leadCount and phoneCount from the actual pairs/phones sets 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 the GOOGLE_SERP Apify proxy group specifically, because the module's own comment notes the RESIDENTIAL group serves Google's JS-gated shell with no real results over plain HTTP — GOOGLE_SERP is the only group that reliably returns a real results page.
  • Genuine block detection, not a status-code guess. fetch_html() classifies a response via is_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")

FieldExample ValueUse Case
phone_number+44 20 7946 0958The extracted, dial-code-matched number
platformLinkedin.comSource platform label
keywordmarketingWhich of your search keywords surfaced this row
cityLondonThe city this lead was tagged under; null for a country-wide (no-city) search
titleGoogle result titleThe indexed page's title
descriptionGoogle result snippetThe text the phone number was extracted from
urlLinkedIn profile/page URLWhere the number was published
country / dial_codeUnited Kingdom / +44Search 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")

FieldExample ValueNotes
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
leadCount14Real count of (url, phone) pairs collected for this city before cross-city collapse
phoneCount12Real count of distinct phone numbers for this city
phone_number / urlnull / ""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

ParameterRequiredTypeDescriptionExample Value
keywordsYesarrayKeywords, LinkedIn usernames, or profile URLs to search for.["plumber", "electrician"]
countryYesstring enumCountry to scope the search and dial-code matching to (full list of ~150 countries with dial codes)."United Kingdom (+44)"
citiesNoarrayCity/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"]
platformNostring enumCurrently only "Linkedin". Default "Linkedin"."Linkedin"
maxPhoneNumbersNointeger (1–10000)Max phone numbers to collect per keyword. Default 20.50
useApifyProxyNobooleanRoute 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?

ScraperWhat it extracts
LinkedIn Profile Contact ExtractorContact details parsed from a profile
LinkedIn Company URL Mass Profile FinderBulk company URL discovery with executive contacts
LinkedIn Jobs Scraper — Employer & Company DetailsJob postings with employer profile data
LinkedIn Comments and Reactions ScraperPost 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 ApifyClient
client = 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.

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.