LinkedIn Phone Number Scraper: Lead Scoring avatar

LinkedIn Phone Number Scraper: Lead Scoring

Pricing

$19.99/month + usage

Go to Apify Store
LinkedIn Phone Number Scraper: Lead Scoring

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

Scraper Engine

Maintained by Community

Actor stats

1

Bookmarked

53

Total users

6

Monthly active users

6 days ago

Last modified

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 categoryPublicly available (in the Google-indexed snippet)Restricted (behind LinkedIn login)
Name, headlineYes — when Google indexed the page titleFull profile with edit history — login
Current job title / companyYes — parsed from the title when presentFull work history, all past roles — login
Profile URL / public IDYes
Phone numberOnly if it appears in the indexed snippet textReliable contact — usually not shown at all
Email addressOnly if it appears in the indexed snippet textReliable contact — usually not shown at all
Personal website / social linksOnly if present in the snippet
Connections, messages, full activity feedNoAlways — 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 nameDescription
namePerson's name, parsed from the Google result title
headlineLinkedIn headline text, parsed from the title
jobTitleJob title, derived from the headline (splits on "at" / "@" / "chez" / "bei" / "en")
companyCompany name, derived from the headline or the last title segment
seniorityRule-based label: C-Level, VP, Director, Manager, or null
decisionMakertrue when seniority is C-Level, VP or Director
publicIdLinkedIn public-ID / vanity slug extracted from the profile URL
urlProfile (or company) URL
titleRaw, unparsed Google result title
descriptionRaw Google result snippet text

Contact fields

Field nameDescription
phone_numberPrimary phone number, in E.164 format, validated with the phonenumbers library
phonesAll valid phone numbers found in the snippet
phoneCountryCountry name derived from the primary phone's dial-code region
emailPrimary email address found in the snippet
emailsAll email addresses found in the snippet
emailDomainDomain portion of the primary email
websiteFirst non-social external URL/domain found in the snippet
socialLinksRecognised social/messaging links (Instagram, X, Facebook, WhatsApp, Telegram, YouTube, GitHub, TikTok, Medium, Calendly, Linktree, Behance, Dribbble)

Run context and metadata fields

Field nameDescription
typelead (Discovery), profile (Targeted, resolved or not), or error
modediscovery or targeted
keywordThe Discovery keyword that produced this row (null in Targeted mode)
targetThe raw Targeted input string that produced this row (null in Discovery mode)
inputModeTargeted-mode target classification: url, slug, or name (null in Discovery mode)
foundTargeted mode: whether a LinkedIn result was indexed for this target. Discovery leads are always true
countryThe country selected on input
dial_codeThe dial code being filtered for (null in "Any country" mode)
queryThe exact Google query string that produced this row
scrapedAtUTC 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.

  1. Open the Actor's page on the Apify Store and click Start, or configure a run through the Apify Console.
  2. 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.
  3. Choose mode: leave it at the default discovery to bulk-find leads from keywords, or switch to targeted and fill targets to resolve specific people.
  4. Set any optional filters worth using — requirePhone, requireEmail, or titleKeyword in Discovery mode; company and maxPagesPerTarget in Targeted mode.
  5. 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 decisionMaker and seniority to filter a keywords run 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 titleKeyword filter, then uses jobTitle and company to check whether a lead already works at a target employer.
  • 📣 A marketing agency running account-based marketing uses emailDomain to cluster leads returned across several keywords runs 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) with company set to disambiguate, and reads found to see which contacts LinkedIn's public footprint actually confirms.
  • 🤖 An AI agent or RAG pipeline consumes the typed JSON directly — title and description provide natural-language context for an LLM summarizer, while email, phone_number and url are 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.

ParameterRequiredTypeDescriptionExample value
modeNostringdiscovery (default) — bulk-find leads by keyword. targeted — resolve specific known profiles/names."discovery"
keywordsNoarrayDiscovery mode only. One or more search terms (role + industry works best). Ignored in targeted mode.["marketing director"]
maxResultsNointegerDiscovery mode only. Max lead rows to collect per keyword. Default 20, min 1, max 10000.20
targetsNoarrayTargeted 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"]
companyNostringTargeted mode only. Optional company added to name-mode lookups to disambiguate common names. Ignored for URL/slug targets."Microsoft"
maxPagesPerTargetNointegerTargeted mode only. Google result pages (10 results each) read per target before consolidating. Default 2, min 1, max 10.2
platformNostringTarget site for the site: search. Only "Linkedin" is currently offered."Linkedin"
countryYesstringCountry 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)"
requirePhoneNobooleanDiscovery mode only. Keep only leads with at least one valid phone number. Default false.false
requireEmailNobooleanDiscovery mode only. Keep only leads with at least one email address. Default false.false
titleKeywordNostringDiscovery mode only. Keep only leads whose title, name, headline, job title, or company contains this text (case-insensitive)."founder"
useApifyProxyNobooleanRoute 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 ApifyClient
client = 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.

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.

ScraperWhat it extracts
Instagram B2B Lead & Contact ScraperInstagram business/creator profiles with validated email and phone, discovered by keyword or handle
YouTube Channel Finder With Creator AnalyticsYouTube channels found by keyword or URL, with channel performance/growth analytics
Facebook Ads Scraper — AI Ad Copy EnrichmentFacebook Ad Library entries by page, link, or keyword search, with AI-enriched ad copy
Instagram Followers And Following Scraper with AI EnrichmentAn 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.