LinkedIn Phone Number Scraper: Lead Scoring
Pricing
$19.99/month + usage
LinkedIn Phone Number Scraper: Lead Scoring
LinkedIn Lead & Contact Finder (Google SERP) extracts publicly listed phone numbers from LinkedIn profiles and linked pages. Build targeted contact lists by role, industry, or company. Ideal for sales teams running outbound campaigns.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
Scraper Engine
Maintained by CommunityActor stats
1
Bookmarked
53
Total users
6
Monthly active users
6 days ago
Last modified
Categories
Share
LinkedIn Lead & Contact Finder — Emails, Phones and Job Titles
Find B2B leads and resolve known contacts from Google-indexed LinkedIn snippets, returned as structured JSON with name, jobTitle, company, phone_number and email fields — no HTML parsing required. Run it in Discovery mode to bulk-find leads by job title or industry, or Targeted mode to resolve specific people you already know into one structured row each. Results stream straight to your Apify dataset as they're found — start a run from the Actor page to see the first rows land within seconds.
What is LinkedIn Lead & Contact Finder?
LinkedIn Lead & Contact Finder is an Apify Actor that runs Google site:linkedin.com searches through the Apify GOOGLE_SERP proxy and extracts phone numbers, emails, websites and social links from the public result snippets Google returns. It does not log in to LinkedIn, does not open or render LinkedIn pages, and needs no LinkedIn account, cookie or session — only country selection is required to run it. It's built for sales development reps, recruiters, growth marketers and AI agents that need structured B2B contact rows without maintaining their own scraper.
What LinkedIn lead data is publicly available to scrape?
LinkedIn publishes a person's headline, current role and public activity to anyone without a login, and Google indexes a snippet of that public page. This Actor reads only that already-public, already-indexed snippet — it never accesses anything gated behind a LinkedIn login.
| Data category | Publicly available (in the Google-indexed snippet) | Restricted (behind LinkedIn login) |
|---|---|---|
| Name, headline | Yes — when Google indexed the page title | Full profile with edit history — login |
| Current job title / company | Yes — parsed from the title when present | Full work history, all past roles — login |
| Profile URL / public ID | Yes | — |
| Phone number | Only if it appears in the indexed snippet text | Reliable contact — usually not shown at all |
| Email address | Only if it appears in the indexed snippet text | Reliable contact — usually not shown at all |
| Personal website / social links | Only if present in the snippet | — |
| Connections, messages, full activity feed | No | Always — login + often a 1st-degree connection |
LinkedIn Lead & Contact Finder only returns publicly visible data — what Google has already indexed from what any visitor sees. Nothing behind a login wall.
What data can I extract with LinkedIn Lead & Contact Finder?
Every run writes one dataset row per lead (Discovery) or per resolved target (Targeted), using the same 29-field schema in both modes so downstream tooling never has to branch on mode. Below is every key the Actor's row-building code (build_lead_row / consolidate_target in src/number_extractor.py) writes, grouped by what it describes.
Identity and role fields
| Field name | Description |
|---|---|
name | Person's name, parsed from the Google result title |
headline | LinkedIn headline text, parsed from the title |
jobTitle | Job title, derived from the headline (splits on "at" / "@" / "chez" / "bei" / "en") |
company | Company name, derived from the headline or the last title segment |
seniority | Rule-based label: C-Level, VP, Director, Manager, or null |
decisionMaker | true when seniority is C-Level, VP or Director |
publicId | LinkedIn public-ID / vanity slug extracted from the profile URL |
url | Profile (or company) URL |
title | Raw, unparsed Google result title |
description | Raw Google result snippet text |
Contact fields
| Field name | Description |
|---|---|
phone_number | Primary phone number, in E.164 format, validated with the phonenumbers library |
phones | All valid phone numbers found in the snippet |
phoneCountry | Country name derived from the primary phone's dial-code region |
email | Primary email address found in the snippet |
emails | All email addresses found in the snippet |
emailDomain | Domain portion of the primary email |
website | First non-social external URL/domain found in the snippet |
socialLinks | Recognised social/messaging links (Instagram, X, Facebook, WhatsApp, Telegram, YouTube, GitHub, TikTok, Medium, Calendly, Linktree, Behance, Dribbble) |
Run context and metadata fields
| Field name | Description |
|---|---|
type | lead (Discovery), profile (Targeted, resolved or not), or error |
mode | discovery or targeted |
keyword | The Discovery keyword that produced this row (null in Targeted mode) |
target | The raw Targeted input string that produced this row (null in Discovery mode) |
inputMode | Targeted-mode target classification: url, slug, or name (null in Discovery mode) |
found | Targeted mode: whether a LinkedIn result was indexed for this target. Discovery leads are always true |
country | The country selected on input |
dial_code | The dial code being filtered for (null in "Any country" mode) |
query | The exact Google query string that produced this row |
scrapedAt | UTC extraction timestamp, ISO-8601 with a trailing Z |
The dataset's default view surfaces 26 of these 29 columns; platform, phones and emails (the raw arrays behind phone_number and email) are pushed to every row but sit outside the default view — open Fields on the dataset to add them, or read them from the API/export untouched.
🤖 Add-on: Need additional LinkedIn or B2B data?
For a different platform with the same lead-and-contact shape, see Instagram B2B Lead & Contact Scraper (below) — it discovers Instagram business profiles and extracts the same kind of validated email and phone pair. Both scrapers share the "never fabricate, only null" extraction philosophy, so their outputs can be merged into one lead list without reconciling conflicting schemas.
Why not build this yourself?
LinkedIn does not offer a self-serve public API that lets a third-party developer search for or bulk-resolve people's public contact details — its official Marketing/Talent Solutions APIs are partner-gated and scoped to specific verified use cases, not open self-signup search. Building an equivalent scraper yourself means solving three ongoing problems: keeping a Google-SERP fetcher from being blocked (rotating user agents, accept-language headers, and a jittered request cadence), validating extracted phone numbers so you don't collect years, follower counts or post IDs as false positives, and re-tuning your HTML selectors every time Google's result markup changes. LinkedIn Lead & Contact Finder already does all three: it routes requests through Apify's dedicated GOOGLE_SERP proxy group, validates every phone candidate against Google's own libphonenumber library before it is ever written to a row, and is maintained centrally so a markup change is fixed once for every user instead of once per in-house script.
How to use LinkedIn Lead & Contact Finder
The Actor is published on the Apify Store and runs entirely inside the Apify platform — no separate signup, credentials, or account with LinkedIn is required.
- Open the Actor's page on the Apify Store and click Start, or configure a run through the Apify Console.
- Fill the one required field:
country— pick a country to localise the search and filter phone numbers to that dial code, or choose "🌍 Any country" to keep every valid international number instead. - Choose
mode: leave it at the defaultdiscoveryto bulk-find leads fromkeywords, or switch totargetedand filltargetsto resolve specific people. - Set any optional filters worth using —
requirePhone,requireEmail, ortitleKeywordin Discovery mode;companyandmaxPagesPerTargetin Targeted mode. - Start the run and watch rows land in the dataset as they're found; export as JSON, CSV, Excel, or any format the Apify dataset export supports.
How to scale to bulk lead extraction
Both modes accept an array, not a single value: keywords in Discovery mode takes any number of search terms in one run (each is queried independently, with a global URL de-duplication set shared across all of them), and targets in Targeted mode takes any number of profile URLs, public-IDs, or names in one run, resolving each into its own row. There is no separate "batch" input — one run with a longer array is the intended way to scale, rather than looping single-item runs.
What can you do with LinkedIn lead data?
- 📈 A sales development rep building an outbound list uses
decisionMakerandseniorityto filter akeywordsrun down to C-level and Director-level contacts before loading the list into an outreach sequencer. - 🧑💼 A recruiter sourcing candidates for a role runs Discovery mode with a
titleKeywordfilter, then usesjobTitleandcompanyto check whether a lead already works at a target employer. - 📣 A marketing agency running account-based marketing uses
emailDomainto cluster leads returned across severalkeywordsruns by the company they actually work for, independent of how their name or title is written. - 🔎 An analyst verifying a known contact list feeds each name into
targets(Targeted mode) withcompanyset to disambiguate, and readsfoundto see which contacts LinkedIn's public footprint actually confirms. - 🤖 An AI agent or RAG pipeline consumes the typed JSON directly —
titleanddescriptionprovide natural-language context for an LLM summarizer, whileemail,phone_numberandurlare pulled straight into a CRM-write tool call without any additional parsing step.
How does LinkedIn Lead & Contact Finder handle rate limits and blocking?
Every Google request is routed through Apify's GOOGLE_SERP proxy group when useApifyProxy is enabled (the default), and headers are randomized per request from a rotating set of user agents and accept-language values. Each request is preceded by a randomized jitter delay, and a failed or blocked page is retried up to 3 attempts with an increasing backoff between attempts before the Actor moves on. A response is only treated as blocked when it returns a non-200 status or contains one of Google's known block-page phrases (e.g. "our systems have detected unusual traffic") — a normal empty results page is not treated as a block. If a keyword or target still fails after 3 consecutive empty/error pages, the Actor logs it, pushes an uncharged error row so the failure is visible in the dataset, and continues to the next keyword or target rather than aborting the whole run.
⬇️ Input
Pick a mode, then fill the fields for that mode. Every other field is shared between both modes.
| Parameter | Required | Type | Description | Example value |
|---|---|---|---|---|
mode | No | string | discovery (default) — bulk-find leads by keyword. targeted — resolve specific known profiles/names. | "discovery" |
keywords | No | array | Discovery mode only. One or more search terms (role + industry works best). Ignored in targeted mode. | ["marketing director"] |
maxResults | No | integer | Discovery mode only. Max lead rows to collect per keyword. Default 20, min 1, max 10000. | 20 |
targets | No | array | Targeted mode only. One entry per person: a profile URL, a public-ID/slug, or a full name. Ignored in discovery mode. | ["https://www.linkedin.com/in/williamhgates"] |
company | No | string | Targeted mode only. Optional company added to name-mode lookups to disambiguate common names. Ignored for URL/slug targets. | "Microsoft" |
maxPagesPerTarget | No | integer | Targeted mode only. Google result pages (10 results each) read per target before consolidating. Default 2, min 1, max 10. | 2 |
platform | No | string | Target site for the site: search. Only "Linkedin" is currently offered. | "Linkedin" |
country | Yes | string | Country to localise the search and filter phone numbers to that dial code. One of 195 options (194 countries plus a "🌍 Any country" sentinel that disables dial-code filtering). Default "United Kingdom (+44)". | "United Kingdom (+44)" |
requirePhone | No | boolean | Discovery mode only. Keep only leads with at least one valid phone number. Default false. | false |
requireEmail | No | boolean | Discovery mode only. Keep only leads with at least one email address. Default false. | false |
titleKeyword | No | string | Discovery mode only. Keep only leads whose title, name, headline, job title, or company contains this text (case-insensitive). | "founder" |
useApifyProxy | No | boolean | Route Google search requests through the Apify GOOGLE_SERP proxy. Default true; leave it off only if you have your own proxy strategy. | true |
maxResults and maxPagesPerTarget are clamped by the Actor itself before the run starts — a value below the minimum is raised to it, and a value above the maximum is capped, rather than being rejected.
Example input
Discovery mode, using every Discovery-relevant field:
{"mode": "discovery","keywords": ["marketing director", "founder saas"],"maxResults": 50,"platform": "Linkedin","country": "United Kingdom (+44)","requirePhone": false,"requireEmail": true,"titleKeyword": "founder","useApifyProxy": true}
Targeted mode, resolving three known people:
{"mode": "targeted","targets": ["https://www.linkedin.com/in/williamhgates","satyanadella","Melinda French Gates"],"company": "Microsoft","maxPagesPerTarget": 2,"platform": "Linkedin","country": "United States (+1)","useApifyProxy": true}
⬆️ Output
Both modes write to the same Apify dataset, with a consistent 29-key schema regardless of mode — a field the current row doesn't apply to is written as null, never omitted and never fabricated. Export as JSON, CSV, Excel, HTML table, or any other format the Apify dataset export supports.
Example output
A resolved Discovery lead:
{"type": "lead","mode": "discovery","platform": "Linkedin.com","keyword": "marketing director","target": null,"inputMode": null,"found": true,"name": "Sarah Chen","headline": "Marketing Director at Brightline Analytics","jobTitle": "Marketing Director","company": "Brightline Analytics","seniority": "Director","decisionMaker": true,"publicId": "sarahchen-mkt","url": "https://www.linkedin.com/in/sarahchen-mkt","phone_number": "+442071234567","phones": ["+442071234567"],"phoneCountry": "United Kingdom","email": "sarah.chen@brightlineanalytics.com","emails": ["sarah.chen@brightlineanalytics.com"],"emailDomain": "brightlineanalytics.com","website": "brightlineanalytics.com","socialLinks": null,"title": "Sarah Chen - Marketing Director - Brightline Analytics | LinkedIn","description": "Marketing Director at Brightline Analytics. +44 20 7123 4567. sarah.chen@brightlineanalytics.com","country": "United Kingdom","dial_code": "+44","query": "site:linkedin.com \"+44\" \"marketing director\"","scrapedAt": "2026-07-26T09:14:02Z"}
An unresolved Targeted lookup (no LinkedIn result was indexed for this target, so it is pushed but not charged):
{"type": "profile","mode": "targeted","platform": "Linkedin.com","keyword": null,"target": "an-obscure-consultant-99","inputMode": "slug","found": false,"name": null,"headline": null,"jobTitle": null,"company": null,"seniority": null,"decisionMaker": null,"publicId": "an-obscure-consultant-99","url": "https://www.linkedin.com/in/an-obscure-consultant-99","phone_number": null,"phones": null,"phoneCountry": null,"email": null,"emails": null,"emailDomain": null,"website": null,"socialLinks": null,"title": null,"description": "No matching LinkedIn result was indexed by Google for this target.","country": "United States","dial_code": "+1","query": "site:linkedin.com/in/an-obscure-consultant-99","scrapedAt": "2026-07-26T09:15:47Z"}
How does it work?
Every request the Actor makes goes to Google's own search endpoint (site:linkedin.com ... queries), routed through Apify's GOOGLE_SERP proxy group and localised to the region matching the selected country. The Actor never contacts linkedin.com directly, so it carries none of LinkedIn's own anti-bot or login walls — it only has to stay unblocked by Google, which it does with rotating headers, jittered request timing, and a retry-with-backoff loop that treats a genuine block page differently from an ordinary empty results page. Because it reads Google's public result snippets rather than rendering LinkedIn's page, everything returned is data LinkedIn has already made visible to anyone, including Google's own crawler. The output schema (the 29 fields documented above) is fixed by the Actor's own row-building code, not by LinkedIn's page layout, so it stays stable even if LinkedIn changes how its profile pages render.
Integrations
LinkedIn Lead & Contact Finder runs like any other Apify Actor, so it works with the tools you already use to call Apify.
Calling LinkedIn Lead & Contact Finder programmatically
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run_input = {"mode": "discovery","keywords": ["marketing director"],"country": "United Kingdom (+44)","maxResults": 20,}run = client.actor("Scraper-Engine/linkedin-lead-contact-finder-ppe").call(run_input=run_input)for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["name"], item["email"], item["phone_number"])
Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request to the Apify API.
No-code tools (n8n, Make, LangChain)
In n8n, use the Apify node (or an HTTP Request node pointed at the Actor's run-sync-get-dataset-items endpoint) to trigger a run and pull the resulting leads directly into a workflow. In Make, the Apify app's "Run an Actor and get dataset items" module does the same. In LangChain or a custom agent framework, wrap the apify-client call above as a tool function so an agent can request leads for a keyword and read the returned JSON rows directly as tool output.
Is it legal to scrape LinkedIn lead data?
Scraping publicly available LinkedIn data is generally lawful, and LinkedIn Lead & Contact Finder returns only data that is already publicly visible and already indexed by Google — it does not access anything behind a login. Because the output includes personal data (names, phone numbers, email addresses), any storage or use of it is subject to data-protection law such as GDPR (EU/UK) and CCPA (California) — you need a lawful basis for collecting, storing and contacting the individuals returned, and your use (e.g. cold outreach) may be subject to separate marketing-communication rules in your jurisdiction. Consult legal counsel if your use case involves bulk storage of personal data.
❓ Frequently asked questions
What LinkedIn lead fields does LinkedIn Lead & Contact Finder return?
The top fields are name, jobTitle, company, email and phone_number. See the data fields section above for the complete 29-field schema.
Does LinkedIn Lead & Contact Finder require a LinkedIn account or login?
No. The Actor never logs in to or authenticates with LinkedIn — it only reads Google's public search results. The only input the schema requires is country.
How many leads can I extract in one run?
maxResults (Discovery mode) accepts up to 10000 leads per keyword, and there is no fixed run-wide ceiling beyond that per-keyword cap multiplied by however many keywords you supply. Actual yield depends on how many matching, contact-bearing snippets Google has indexed for your keyword and country — not a number this Actor controls.
What happens if a search returns zero results, or a targeted profile isn't indexed?
In Discovery mode, a keyword that returns no contact-bearing snippets simply produces no rows for that keyword — nothing is fabricated to fill the gap. In Targeted mode, if Google has no indexed LinkedIn result for a target at all, the row is still pushed with found: false, description set to "No matching LinkedIn result was indexed by Google for this target," and every contact field null — and that row is not charged.
Can I scrape multiple LinkedIn leads or profiles at once?
Yes. keywords (Discovery) and targets (Targeted) both accept arrays, so one run can cover any number of search terms or people — see How to scale to bulk lead extraction above.
Does LinkedIn Lead & Contact Finder work with Claude, ChatGPT, and other AI agent tools?
It is callable as an HTTP endpoint by any agent framework through the Apify API — see the Python example above. There is no dedicated MCP server verified for this Actor; wrap the apify-client call as a tool function in your agent framework of choice.
How does LinkedIn Lead & Contact Finder compare to other LinkedIn lead scrapers?
peakydev/leads-scraper-ppe advertises "up to 30K leads per run" and email/phone "enrichment" against "over 700M verified leads," as observed on the Apify Store on 2026-07-26, but its own README documents a required minimum charge of 100 leads per run even if fewer are found. olympus/b2b-leads-finder advertises "up to 20,000 verified leads from a single search URL," as observed on the Apify Store on 2026-07-26, but requires the user to supply their own LinkedIn session cookie and also documents a 100-lead minimum charge. LinkedIn Lead & Contact Finder takes a different approach on both points: it never asks for a LinkedIn cookie or login (there is no cookie input in its schema at all), and its charging logic (should_charge in the source) only bills a row_result when a row actually delivered a value — a Discovery lead with a contact signal, or a Targeted lookup that resolved (found: true). Error rows and unresolved Targeted lookups are pushed but never charged.
Does LinkedIn Lead & Contact Finder return data in a format LLMs can use directly?
Yes. Every row is typed, normalized JSON with the same field names across every run — no HTML, no selectors to write. Pass rows directly to an LLM prompt, index them into a vector store, or feed them to an agent tool as structured context.
What happens when LinkedIn or Google changes its layout or blocking?
The Actor is maintained, and its output schema is designed to stay stable across snippet-layout changes because parsing logic (title splitting, phone/email extraction) is centralized in the Actor's own code rather than tied to a specific page structure. No specific fix turnaround time is published for layout changes.
Can I use LinkedIn Lead & Contact Finder without managing proxies or browser infrastructure?
Yes. The Actor routes every request through Apify's GOOGLE_SERP proxy group when useApifyProxy is enabled (the default) — you don't configure or pay for a separate proxy provider, and there is no browser to manage since the Actor reads Google's HTML search results directly rather than rendering pages.
Which LinkedIn lead fields work best for AI training data and RAG indexing?
For RAG indexing, title and description carry the most free-text context (the raw Google snippet), while headline gives a compact role summary. For structured training data or CRM enrichment, jobTitle, company, seniority, decisionMaker, email and phone_number return as consistent typed primitives (strings and booleans) across every record.
🔗 Related scrapers
| Scraper | What it extracts |
|---|---|
| Instagram B2B Lead & Contact Scraper | Instagram business/creator profiles with validated email and phone, discovered by keyword or handle |
| YouTube Channel Finder With Creator Analytics | YouTube channels found by keyword or URL, with channel performance/growth analytics |
| Facebook Ads Scraper — AI Ad Copy Enrichment | Facebook Ad Library entries by page, link, or keyword search, with AI-enriched ad copy |
| Instagram Followers And Following Scraper with AI Enrichment | An Instagram profile's followers/following lists, including mutuals and one-way relationships |
💬 Your feedback
Found a bug, or need a field this Actor doesn't return yet? Let us know through the Issues tab on the Actor's Apify Store page, or send feedback via the Actor's Console page — reports are what keep the extraction rules (and the phone/email validation) current.