Linkedin Phone Number Scraper
Pricing
$14.99/month + usage
Linkedin Phone Number Scraper
LinkedIn Phone Number Scraper helps you collect professional phone numbers from LinkedIn profiles. Use the data for sales outreach, recruitment, and partnership discussions. Fast, scalable scraping with clean exports.
Pricing
$14.99/month + usage
Rating
0.0
(0)
Developer
Scrapio
Maintained by CommunityActor stats
0
Bookmarked
56
Total users
7
Monthly active users
11 days ago
Last modified
Categories
Share
LinkedIn Phone Number Scraper — Numbers, Profiles and Countries
LinkedIn Phone Number Scraper finds publicly indexed phone numbers linked to LinkedIn profiles, company pages, and posts, and returns them as clean, typed JSON. Give it a list of keywords (or LinkedIn usernames or profile URLs) and a target country, and it runs targeted Google searches, parses the result snippets, and normalizes any phone numbers found to E.164 format. Unlike a scraping framework that hands you raw HTML, the Actor returns structured rows — phone_number, title, description, url, country, dial_code — ready for a CRM, a spreadsheet, or a downstream pipeline without any parsing. Because it works entirely off Google's search index rather than LinkedIn's own front end, it needs no LinkedIn login and keeps working even when LinkedIn changes its page markup. This guide covers every input and output field, how the Google-SERP approach actually behaves, and three concrete ways teams run it in production.
🧭 What Does LinkedIn Phone Number Scraper Do?
LinkedIn Phone Number Scraper does not log into LinkedIn, and it does not scrape LinkedIn.com directly — it searches Google (site:linkedin.com queries) and parses the public result snippets Google already indexes, then extracts and normalizes any phone number present in that snippet text. No LinkedIn account, cookie, or session is required. Because it depends on Google's index, results only exist where a phone number was already present in a publicly cached LinkedIn title or description — the Actor cannot pull a number off a profile that Google hasn't indexed with one.
- Accepts plain keywords (job titles, industries, names) or LinkedIn profile/company URLs as input
- Runs
site:linkedin.comGoogle searches localized to the selected country - Extracts phone-like text from search result titles and descriptions
- Normalizes extracted numbers to E.164 using the country's dial code
- Filters out numbers that don't match the selected country's dial code
- Deduplicates by URL + phone number across the entire run, not just per page
- Routes every Google request through Apify's
GOOGLE_SERPproxy group by default
⚡ Features & Capabilities
The Actor is built around one job — turning indexed LinkedIn phone-number mentions into structured rows — done with retry logic, block detection, and country-aware normalization.
Core features
- Google-SERP based discovery: builds a
site:linkedin.com "<dial code>" "<keyword>"query per keyword, so results are always scoped tolinkedin.compages - Profile-URL fallback queries: if a keyword is a LinkedIn profile or company URL (matched against
linkedin.com/in/,/pub/, or/company/), the Actor derives a name from the URL slug and tries up to three broadening queries — name + dial code, name alone, then the raw slug — so a real result surfaces even when the exact-URL match returns nothing - E.164 normalization: handles international
+/00prefixes, national trunk-0numbers,(0)trunk notation, and collapses an accidentally duplicated country code - Length and dial-code filtering: a candidate is only accepted if its digit count falls between 10 and 14 and it matches the selected country's dial code — this rejects IDs and unrelated numbers, not just malformed ones
- Genuine block detection: flags a response as blocked only on a non-200 status or specific interstitial phrases (
our systems have detected unusual traffic,to continue, please type the characters,/sorry/index?continue) or a JS-gated shell with no result markers — a normal result page containing the word "captcha" in a footer link is not treated as a block - Global run-level deduplication: the
(url, phone_number)pair is tracked in a single set for the whole run, so the same number attached to the same URL is never pushed twice even across different keywords - Paginated retrieval with a hard stop: each query fetches Google results 10 at a time and keeps paginating until
maxPhoneNumbersis hit or 3 consecutive pages return no new results, whichever comes first — it does not paginate indefinitely against an exhausted query - Redirect unwrapping:
urlvalues that come back as Google or LinkedIn safety-redirect links (/url?q=…,/safety/go…) are resolved to the real destination URL before being written to the row - Exact output fields per row:
platform,keyword,title,description,url,phone_number,country,dial_code
⚠️ Known data quirk: in the underlying country-to-region table, both "Congo (Democratic Republic) (+243)" and "Congo (Republic) (+242)" resolve to the same ISO region code (CG) for Google-proxy localization. The dial code used for phone-number matching is still correct for whichever entry you pick (+243 or +242), but the search itself is localized to the same region for both.
Country and dial-code handling
The country input drives two independent mechanisms, both derived from the same 194-entry enum:
- Phone matching and normalization — the dial code parsed out of the selected value (e.g.
+44from"United Kingdom (+44)") is what every extracted number is checked against and normalized to. - Search localization — where a matching entry exists in the Actor's internal ISO-3166 lookup table, the two-letter region code is passed both to Google as the
glsearch parameter and to the ApifyGOOGLE_SERPproxy asapifyProxyCountry, so results are geographically localized as well as dial-code filtered.
A sample of the supported values (the full list is in the input schema's country enum):
| Country | Value to pass |
|---|---|
| United States | United States (+1) |
| United Kingdom | United Kingdom (+44) |
| Germany | Germany (+49) |
| India | India (+91) |
| Nigeria | Nigeria (+234) |
| Brazil | Brazil (+55) |
| Australia | Australia (+61) |
| United Arab Emirates | United Arab Emirates (+971) |
| South Africa | South Africa (+27) |
| Philippines | Philippines (+63) |
How LinkedIn Phone Number Scraper compares to other LinkedIn scrapers
| Feature | LinkedIn Phone Number Scraper | scraper-mind/linkedin-phone-number-scraper | api-empire/linkedin-profile-phone-number-scraper |
|---|---|---|---|
| Output format | Typed JSON dataset | JSON array | JSON array |
| Pricing model | Pay-per-event (row_result) | Flat monthly price (observed on listing, 2026-07-26) | Flat monthly price (observed on listing, 2026-07-26) |
| Input keywords | List (multiple keywords per run) | Single keyword string (per their example input, 2026-07-26) | List (keywords array) |
| Profile-URL fallback queries | Yes — up to 3 broadening queries per URL | Not documented | Not documented |
| Country-aware normalization | E.164 with dial-code filtering | E.164 output claimed, method not documented | Country field present, method not documented |
| Global run-level dedup | Yes (url, phone_number pair) | "Deduplication" claimed, scope not documented | Not documented |
If your use case is feeding structured leads into a CRM or an LLM pipeline, the pricing-model and dedup rows are the practical decision-makers — paying only for rows actually returned avoids paying for a run that finds nothing, and run-level dedup means you don't have to de-duplicate the export yourself.
When another tool might suit you better
If you need contact data from a specific known LinkedIn profile URL rather than a keyword search, a scraper that logs into LinkedIn directly or reads the profile page itself may surface more contact fields — this Actor only sees what Google's snippet already shows, so profiles without a phone number in their cached snippet return nothing even if the number exists on the live page. If your target country has thin Google indexing for LinkedIn pages, a direct-profile approach will generally outperform a search-based one.
LinkedIn Phone Number Scraper within the Scrapio data stack
LinkedIn Phone Number Scraper covers phone numbers surfaced through indexed LinkedIn content. For LinkedIn post monitoring by keyword, use LinkedIn Post Keyword Monitor. For scoring the credibility of a LinkedIn profile, use LinkedIn Profile Credibility Scraper. For the same phone-discovery pattern on a different platform, see Instagram Phone Lead Validator.
Why do developers and data teams scrape LinkedIn?
🏢 Sales and lead generation teams
Sales teams feed a list of target job titles or industries (e.g. "marketing director", "logistics manager") into keywords, set country to their target market, and get back rows carrying phone_number, title, and url for outreach. Because the row also carries keyword, teams can segment leads by the search term that produced them and route different keyword buckets to different reps or campaigns. The description field often contains enough of the original snippet text to qualify a lead (job title, company name) before a rep ever opens the LinkedIn URL.
📊 AI training data and RAG indexing
The title and description fields carry unstructured text pulled directly from indexed LinkedIn snippets, making them useful as short-form enrichment context. For RAG enrichment, title and description give an LLM agent a text snippet to cite alongside a contact record. For training data, phone_number, country, and dial_code are consistently typed and structured across every row, since they pass through the same normalization function regardless of source keyword — useful for building or validating phone-number parsing datasets.
📱 Competitive and market intelligence
Tracking which companies or roles have publicly indexed contact numbers on LinkedIn — by running the same keywords list across multiple country values — surfaces where a competitor's team, or an industry segment, has public phone-number exposure. The keyword field on each row lets you group results back to the search term (e.g. a competitor's job title pattern) that produced them.
🔬 Research and academic use
Researchers studying public data exposure or contact-information availability patterns across professional networks can use country-scoped runs to compare how much phone-number data is publicly indexed for a given region. This Actor only surfaces data Google has already indexed publicly — it does not access private or login-gated LinkedIn content.
🎥 Product and SaaS development
Teams building lead-enrichment or contact-verification products can use the Actor as a discovery step — feed a company or role list in, use the returned phone_number and url rows as a first-pass candidate set, then run those candidates through a verification or dialer product downstream.
🍚 Input Parameters
Read directly from the Actor's input schema. Required fields: keywords, country.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
keywords | Yes | array of strings | A list of keywords, LinkedIn usernames, or profile URLs to search for. | ["marketing", "founder"] |
platform | No | string (enum: Linkedin, default Linkedin) | Select platform. For now this actor targets Linkedin via google.com SERP. | "Linkedin" |
country | Yes | string (enum, default United Kingdom (+44)) | Select a country to scrape related phone numbers. The dial code is used to normalize and filter phone numbers. | "United States (+1)" |
maxPhoneNumbers | No | integer (min 1, max 10000, default 20) | Maximum number of phone numbers to collect per keyword. The scraper will stop once this limit is reached. | 50 |
useApifyProxy | No | boolean (default true) | Route Google search requests through Apify Proxy (recommended). The Actor fetches reliable, unblocked search results automatically. Turn this off only if you intend to run without a proxy. | true |
The country field accepts any of the 194 country/dial-code pairs listed in the schema enum, formatted as "Country Name (+DialCode)" (for example "Germany (+49)", "India (+91)", "Nigeria (+234)"). The selected value drives two things at once: the dial code used to validate and normalize every extracted phone_number, and (where a matching ISO region exists) the localization of the Google search itself via the Apify proxy.
Example JSON input
{"keywords": ["marketing director", "founder"],"platform": "Linkedin","country": "United States (+1)","maxPhoneNumbers": 50,"useApifyProxy": true}
Supported URL types and input formats
keywords accepts three distinct input shapes, detected automatically:
- Plain keyword or phrase — e.g.
"marketing director"— builds a single query:site:linkedin.com "+44" "marketing director". - LinkedIn profile or company URL — matched against
linkedin.com/in/…,/pub/…, or/company/…— the Actor extracts the URL slug, derives a name from it (e.g.louis-rose-9057562bbecomeslouis rose), and tries up to three fallback queries in order: name + dial code, name alone, then the raw slug. - LinkedIn username / vanity slug — e.g.
louis-rose-9057562b— handled the same way as a profile URL once the slug is extracted.
Example inputs covering each shape:
{ "keywords": ["real estate agent"], "country": "Canada (+1)" }
{ "keywords": ["https://www.linkedin.com/in/louis-rose-9057562b/"], "country": "United Kingdom (+44)" }
{ "keywords": ["marketing", "founder", "https://www.linkedin.com/company/example-co/"], "country": "Australia (+61)" }
📦 Output Format
Every dataset row is typed JSON with a stable, flat schema — the same 8 keys on every row, no nested objects. The dataset view exposes all 8 fields the Actor writes; there is no hidden or additional data beyond what's documented below.
Billing: this Actor runs on Apify's pay-per-event pricing model. It charges exactly one row_result event for every phone-number row it pushes to the dataset — there is no separate uncharged accounting or error row in this Actor's dataset output, since the row-push function is only ever called on a successfully matched and normalized phone number. A run that finds zero matching numbers for its keywords therefore produces zero dataset rows and incurs no row_result charges.
Output for phone number result
{"platform": "Linkedin.com","keyword": "marketing director","title": "John Doe - Marketing Director - Example Corp | LinkedIn","description": "Marketing Director at Example Corp. Call +1 415 123 4567 for partnership inquiries...","url": "https://www.linkedin.com/in/johndoe/","phone_number": "+14151234567","country": "United States","dial_code": "+1"}
Field reference:
| Field | Type | Description |
|---|---|---|
platform | string | The platform label, derived from the platform input (e.g. Linkedin.com). |
keyword | string | The input keyword or URL that produced this row. |
title | string | The title text of the matching Google search result. |
description | string | The snippet/description text of the matching Google search result. |
url | string | The linkedin.com URL of the matching result, with Google/LinkedIn redirect wrappers resolved to the real target. |
phone_number | string | The extracted phone number, normalized to E.164 format (e.g. +14151234567). |
country | string | The country name parsed from the country input (e.g. United States). |
dial_code | string | The dial code parsed from the country input (e.g. +1), used to validate and normalize phone_number. |
Schema stability and export options
Every row carries the same 8 fields regardless of keyword or country, so downstream code can rely on a fixed shape. Because the Actor reads from Google's search results rather than LinkedIn's own front end, a LinkedIn layout change does not affect the schema — only a change to Google's result markup (div.MjjYud / div.tF2Cxc result blocks) could. Results are delivered through the standard Apify dataset, exportable as JSON, CSV, Excel, XML, or HTML directly from the Apify Console or via the API/apify_client.
💡 LinkedIn Phone Number Scraper Strategy Guide
🎯 Strategy 1: Real-time enrichment pipeline
Trigger a run from your CRM or outreach tool whenever a new target list of job titles or company names needs phone coverage. Pass the list as keywords, set country to the lead's market, and set maxPhoneNumbers to cap spend per keyword. Append the returned phone_number, title, and url fields to the matching lead record, using keyword to map each result back to the search term that triggered it.
🎯 Strategy 2: Scheduled monitoring and alerting
Use an Apify schedule to re-run the same keywords/country combination on a recurring cadence. Diff each run's output against the previous run on the (url, phone_number) pair to detect newly indexed numbers for the same keyword set, and alert only on genuinely new rows rather than re-processing the full result set each time.
🎯 Strategy 3: Bulk dataset build
For a research or lead-generation dataset, split a large keyword list across multiple Actor runs (one run per keyword batch or per target country), then aggregate the resulting datasets via the Apify API into a single CSV or database table. Set maxPhoneNumbers deliberately low per run to keep pay-per-event spend predictable across a large keyword set.
Strategy comparison at a glance
| Strategy | Best for | Run pattern | Output format |
|---|---|---|---|
| Real-time enrichment | Appending phone data to inbound leads as they arrive | On-demand, triggered per batch | JSON dataset, pushed to CRM/DB |
| Scheduled monitoring | Catching newly indexed numbers for a fixed keyword set | Recurring Apify schedule | JSON dataset, diffed run-to-run |
| Bulk dataset build | Large-scale keyword or research datasets | Parallel runs, batched keywords | Aggregated CSV/database export |
🌴 Related LinkedIn Scrapers & Tools
| Scraper | What it extracts |
|---|---|
| LinkedIn Post Keyword Monitor | Monitors LinkedIn posts for keyword matches over time |
| LinkedIn Profile Credibility Scraper | Scores LinkedIn profiles for credibility signals |
| Instagram Phone Lead Validator | The same keyword-driven phone-number discovery pattern, applied to Instagram |
| Facebook Group Admin Contact Scraper | Extracts admin contact details from Facebook groups |
| YouTube Channel Contact Extractor | Extracts public contact details from YouTube channels |
How to integrate LinkedIn Phone Number Scraper with your stack
LinkedIn Phone Number Scraper works with any language or tool that can make an HTTP request through the Apify API, or with the official Apify client libraries.
Python
from apify_client import ApifyClientimport csvclient = ApifyClient("<YOUR_API_TOKEN>")run_input = {"keywords": ["marketing director", "founder"],"platform": "Linkedin","country": "United States (+1)","maxPhoneNumbers": 50,"useApifyProxy": True,}run = client.actor("<YOUR_USERNAME>/linkedin-phone-number-scraper-pay-per-events").call(run_input=run_input)rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())with open("linkedin_phone_numbers.csv", "w", newline="", encoding="utf-8") as f:writer = csv.DictWriter(f, fieldnames=["platform", "keyword", "title", "description","url", "phone_number", "country", "dial_code",])writer.writeheader()writer.writerows(rows)print(f"Collected {len(rows)} phone number rows")
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });const input = {keywords: ['marketing director', 'founder'],platform: 'Linkedin',country: 'United States (+1)',maxPhoneNumbers: 50,useApifyProxy: true,};const run = await client.actor('<YOUR_USERNAME>/linkedin-phone-number-scraper-pay-per-events').call(input);const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Collected ${items.length} phone number rows`);
Async and scheduled pipelines
For large keyword lists, start the run asynchronously (call() without waiting, or the Apify API's async run endpoint) and poll the run status or the dataset item count until it completes, rather than blocking on a single long-running call. For recurring collection, use an Apify schedule to re-run the same input on a cadence and read the resulting dataset from your own polling job or webhook consumer.
🎯 Who Needs LinkedIn Phone Number Scraper? (Use Cases & Industries)
🏢 Sales development teams
An SDR team feeds a target-role keyword list (e.g. "VP of operations") and their target country into a run, then loads the returned phone_number and url fields directly into their outreach sequencer, using title to confirm the role before dialing.
📊 Data and growth teams
Growth teams run the Actor against a recurring keyword set on a schedule, aggregate the phone_number, country, and dial_code fields into a lead database, and use keyword to attribute each new record to the campaign or segment that sourced it.
📱 Marketing agencies
Agencies running outreach on behalf of clients scope a run to a client's target country and industry keywords, then hand off the resulting dataset — title, description, url, and phone_number — as a ready-to-dial contact list.
🔬 Researchers
Researchers studying public contact-data exposure patterns on professional networks can compare how many phone numbers are publicly indexed per country for a fixed keyword set. The Actor surfaces only data already public in Google's index.
Is it legal to scrape LinkedIn?
Scraping publicly accessible web data is generally lawful in the United States — the Ninth Circuit's ruling in hiQ Labs v. LinkedIn (9th Cir., 2019, and again on remand in 2022) held that scraping publicly available LinkedIn profile data does not violate the Computer Fraud and Abuse Act. That precedent addresses CFAA liability specifically; it does not clear every legal question. Violating a platform's Terms of Service is a separate matter — LinkedIn's ToS restricts automated data collection, and breaching it is a civil contract risk between you and LinkedIn, not a criminal one. Because this Actor's output can include names, job titles, and phone numbers tied to identifiable individuals, data protection law (GDPR in the EU/UK, CCPA in California, and similar regimes elsewhere) may apply to how you store and use the data, separate from whether the scraping itself was lawful. LinkedIn Phone Number Scraper returns only publicly accessible data surfaced through Google's search index. What you do with that data is your responsibility — consult legal counsel for commercial applications involving personal data.
❓ Frequently asked questions
Does LinkedIn Phone Number Scraper work without a LinkedIn account?
Yes. The Actor never logs into LinkedIn and never fetches a LinkedIn page directly — it searches Google with a site:linkedin.com query and parses the public result snippets. No LinkedIn credentials, cookies, or session are required or used.
How does LinkedIn Phone Number Scraper handle Google's anti-scraping measures?
By default, every Google request is routed through Apify's GOOGLE_SERP proxy group, optionally localized to the selected country's ISO code. Each page fetch retries up to 3 times with a randomized 1–2 second delay before each attempt and a 3–6 second delay between retries, and randomizes the user agent and accept-language header per request. A response is only treated as blocked on a non-200 status, a genuine interstitial/CAPTCHA phrase, or a JS-gated shell with no result markers — not on the mere presence of words like "sorry" or "captcha" that appear in a normal page's footer.
Can I run LinkedIn Phone Number Scraper at scale without getting blocked?
The Actor stops paginating a keyword's query after 3 consecutive empty or failed pages, and moves to the next fallback query or keyword rather than retrying indefinitely. Disabling useApifyProxy runs requests with no proxy at all, which the Actor's own logging flags as likely to be blocked by Google — leaving it enabled is recommended for any run beyond a handful of keywords. No uptime or block-rate figure is published for this Actor.
How fresh is the data LinkedIn Phone Number Scraper returns?
Every run performs a live Google search at the time it executes — there is no caching layer, and the request headers explicitly disable cached responses (cache-control: max-age=0). The data returned reflects whatever Google's index currently shows for the queried keywords and country, which in turn reflects however recently Google last crawled the underlying LinkedIn page.
What happens if a keyword returns zero phone numbers?
The run simply produces no rows for that keyword rather than erroring — this is expected when Google has no indexed LinkedIn snippet containing a phone number for the search terms used. The Actor logs a message suggesting broader keywords (a job title or industry rather than a single exact profile URL) when a run finishes with zero total rows across all keywords, since a narrow single-profile query is the input pattern most likely to have no matching indexed snippet.
Which LinkedIn fields work best for AI training and RAG indexing?
For RAG, title and description carry the free-text snippet content — the highest-information fields for citation or context injection. For training or validation data, phone_number, country, and dial_code are the most consistently structured fields, since every row passes through the same E.164 normalization and dial-code filter regardless of source keyword. All fields return as typed strings requiring no additional parsing before use in an LLM context window.
Does scraping LinkedIn phone numbers raise data protection concerns?
Yes — a phone number tied to a name and job title is personal data under regimes like GDPR and CCPA. LinkedIn Phone Number Scraper returns only publicly available data already indexed by Google; the lawful basis for storing, processing, or using that data for your specific purpose is your responsibility as the data controller.
Does LinkedIn Phone Number Scraper work with Claude, ChatGPT, and other AI agent tools?
Yes, as an HTTP endpoint callable by any agent framework through the Apify API — this Actor does not expose a dedicated MCP server. Every response is typed JSON with a fixed 8-field schema, so an agent can consume the dataset directly without writing an HTML parser.
How does LinkedIn Phone Number Scraper compare to other LinkedIn scrapers?
As observed on their live Apify listings on 2026-07-26: scraper-mind's LinkedIn Phone Number Scraper accepts a single keyword string per run and bills on a flat monthly price rather than per result; api-empire's LinkedIn Profile Phone Number Scraper accepts a keywords list similar to this Actor but also bills flat-rate. Both claim E.164 output and deduplication without documenting the method. This Actor's differentiators are pay-per-event pricing (you pay for rows actually returned, not a flat monthly fee), a multi-keyword list input, and documented run-level deduplication by URL and phone number together. Where a competitor may be a better fit: if your workflow needs a single fixed monthly cost regardless of volume, a flat-price competitor removes per-run cost variance that pay-per-event pricing introduces.
ℹ️ Disclaimer
LinkedIn Phone Number Scraper extracts only publicly available data surfaced through Google's search index. This tool is intended for lawful use cases only. Users are responsible for complying with LinkedIn's and Google's terms of service and applicable data protection laws in their jurisdiction.