Linkedin Lead Scraper
Pricing
$14.99/month + usage
Linkedin Lead Scraper
The LinkedIn Lead Scraper helps you discover business prospects directly from LinkedIn. Capture profile names, job roles, company information, and locations quickly. Perfect for sales teams, recruiters, and marketers building qualified lead databases.
Pricing
$14.99/month + usage
Rating
0.0
(0)
Developer
Scrapio
Maintained by CommunityActor stats
1
Bookmarked
27
Total users
4
Monthly active users
4 days ago
Last modified
Categories
Share
LinkedIn Lead Scraper — Extract Emails, Profiles and Company Pages
Linkedin Lead Scraper turns a list of keywords into a dataset of publicly indexed LinkedIn pages — profiles, company pages, posts, jobs, articles — that carry a visible email address, by running targeted site:linkedin.com searches on Google and reading the title and snippet of every matching result. Every row is typed JSON with a resolved email, the source URL, and a classified result type — no HTML to parse, no LinkedIn login required. This is a lead-generation and B2B prospecting tool built for keyword-driven discovery, not a full-profile-data extractor. The guide below covers exact input/output fields, how the Google-search approach differs from direct LinkedIn scraping, and three deployment patterns for enrichment, monitoring, and bulk lead lists.
🧭 What Does Linkedin Lead Scraper Do?
Linkedin Lead Scraper searches Google (not LinkedIn itself) with a site:linkedin.com filter built from your keywords, optional location, and optional email-domain list, then scans each result's title and snippet text for a real email address. No LinkedIn account, login, or session cookie is required — the Actor never fetches a linkedin.com page directly, only Google's search-results page. Every result is classified by URL pattern into a result type (profile, company, post, article, job, or school) so you can filter the dataset by entity without extra parsing.
- 🔍 Runs a Google
site:linkedin.comsearch per keyword, with optional location and email-domain narrowing - 📇 Classifies each match into
profile,company,post,pulse_article,job, orschoolfrom its URL path - 📧 Extracts and validates email addresses found in the result's title or snippet, filtering out placeholder addresses (
test@…,example@…) and prose false positives - 🌐 Excludes LinkedIn's own help/learning/careers/press/marketing subdomains and non-content paths (login, directory, groups, jobs hub) so results are genuine content pages
- 🔁 Deduplicates URLs across pages and across keywords within the same run
- 🛡️ Retries blocked or failed requests through a fresh Apify Proxy connection, up to 3 attempts per page
- ⚙️ Streams every matched row to the dataset in real time as it is found, rather than waiting for the run to finish
⚠️ Real constraint: yield depends entirely on how many LinkedIn pages Google has indexed with a visible email in the title or snippet for a given keyword — most profiles and company pages don't expose one. The Actor gives up on a keyword after 5 consecutive Google result pages with no qualifying email (EMPTY_PAGE_LIMIT in the source), even if maxEmails hasn't been reached. Raising maxEmails alone will not produce more leads for a keyword whose indexed pool is smaller than that.
⚡ Features & Capabilities
Linkedin Lead Scraper's feature set splits into search-and-match logic, honest positioning against direct-scraping tools, and where it sits alongside Scrapio's other LinkedIn Actors.
Core features
- Keyword-driven discovery — no need to already know which LinkedIn URLs to target, unlike Actors that require a start-URL list
- Per-result classification into
profile,company,post,pulse_article,job, orschoolvia theresultTypefield - Domain-scoped email filtering: pass
emailDomains(e.g.["@gmail.com"]) to only keep addresses on those domains - Location-scoped search: an optional
locationstring is appended to the Google query to narrow results geographically - One flat, typed JSON row per lead result — every key:
network,keyword,title,description,url,email,resultType,scrapedAt - Charged only for rows actually written — the single event is
row_result, and rows without a resolved email are never pushed or charged, so there are no uncharged accounting rows to filter out
When another tool might suit you better
If you need full LinkedIn profile or company data — headline, experience, employee counts, industry, affiliated pages — rather than a discovered email address, a direct LinkedIn page scraper is the better fit. This Actor deliberately never fetches a linkedin.com page: it reads only what Google's index shows in the title and snippet, which is a small slice of what a real profile or company page contains. Scrapio's own LinkedIn Company Profile Scraper (below) is built for that deeper structured pull.
Linkedin Lead Scraper within the Scrapio data stack
Linkedin Lead Scraper covers keyword-to-email discovery across LinkedIn profiles, company pages, posts, jobs, and articles. For full structured company profile data plus affiliated pages and associated-employee rows, use LinkedIn Company Profile Scraper & Associated Employees. For bulk discovery of LinkedIn company URLs from keywords, domains, or brand names via DuckDuckGo and Bing (rather than Google), use LinkedIn Mass Company Profile Finder. Both are Scrapio Actors on the same platform.
Why do developers and data teams scrape LinkedIn?
Keyword-driven LinkedIn lead discovery serves a narrower, more commercially concentrated set of users than a full profile scraper — mostly people who want a contactable email tied to a role or company, not a complete professional history.
🏢 Sales and business development teams
A sales team enters keywords describing a target role or industry (e.g. "founder", "marketing director"), optionally scoped by location, and gets back rows carrying email, title (which usually contains the person's name and role), url, and resultType. The output drops straight into a CSV import for outreach tooling or a CRM, with keyword preserved on every row so leads stay traceable to the campaign that found them.
📊 AI training data and RAG indexing
The title and description fields carry the free-text content Google indexed for each LinkedIn page — job titles, company descriptions, post snippets — making them the highest-information fields for RAG context. For (1) RAG enrichment, index title + description alongside url and resultType so a retrieval layer can surface "who mentions X" style results. For (2) training data, resultType, network, and scrapedAt are the most structurally consistent fields across every row, while email is a clean, already-validated extraction target. All fields return as typed strings requiring no HTML parsing.
📱 Competitive and market intelligence
Running the same keyword set on a schedule and tracking which url values are new since the last run surfaces newly published LinkedIn company pages, hiring posts (resultType: "job"), or founder/executive profiles entering a market or geography — useful for tracking a competitor's hiring activity or a market segment's growth in publicly visible LinkedIn presence.
🔬 Research and academic use
Academic and market researchers can use keyword sets to build a dataset of publicly indexed LinkedIn content around a topic, role, or industry — for example, studying how a job title or skill term appears across public LinkedIn posts and profiles over time. All data returned is limited to what Google has already publicly indexed.
🎥 Product and SaaS development
Teams building a lead-enrichment API, a prospecting directory, or a monitoring product can wrap this Actor's keyword-in/leads-out pattern behind their own interface, using resultType to route profile leads, company leads, and job-posting leads into different product surfaces.
🍚 Input Parameters
All seven parameters, exactly as defined in the Actor's input schema, in schema order:
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
keywords | Yes | array | List of keywords to search for on LinkedIn (e.g., ["marketing", "founder", "business"]). The Actor searches Google for LinkedIn profiles/posts containing these keywords and extracts email addresses. | ["marketing", "founder"] |
platform | No | string | This actor currently supports LinkedIn only. Default "Linkedin"; the only enum value is "Linkedin". | "Linkedin" |
location | No | string | Optional: add a location to the search query (e.g., 'London', 'New York'). Leave empty to search globally. Default "". | "New York" |
emailDomains | No | array | Optional: filter results to only include emails from specific domains (e.g., ['@gmail.com', '@outlook.com']). Leave empty to collect all email domains. | ["@gmail.com"] |
maxEmails | No | integer | Maximum number of emails to collect per keyword. Default 20, minimum 1, maximum 5000. | 50 |
engine | No | string | Scraping engine used to collect results. Default "legacy"; the only enum value is "legacy". | "legacy" |
proxyConfiguration | No | object | Choose which Apify proxies to use for requests. The default selection is recommended for reliable results. If a request is blocked or fails, the Actor automatically retries it through a fresh connection. | {"useApifyProxy": true} |
platform and engine each currently expose exactly one selectable value — both fields exist in the schema but there is nothing else to choose today. If proxyConfiguration is omitted entirely (rather than sent as an empty/default object), the Actor falls back to Apify Proxy with the GOOGLE_SERP proxy group.
Complete JSON input example:
{"keywords": ["marketing", "founder", "business"],"platform": "Linkedin","location": "New York","emailDomains": ["@gmail.com"],"maxEmails": 20,"engine": "legacy","proxyConfiguration": {"useApifyProxy": true}}
Supported keyword, location, and domain filter formats
keywords is the only required field, and every other filter narrows the same underlying Google search:
- Broad keyword, no filters —
{"keywords": ["recruiter"]}searchessite:linkedin.com "recruiter"globally, across every result type. - Keyword + location —
{"keywords": ["founder"], "location": "London"}adds"London"as a required phrase in the query, scoping results to pages that mention that location. - Keyword + domain filter —
{"keywords": ["marketing"], "emailDomains": ["@gmail.com", "@outlook.com"]}OR's the domains into the query and drops any matched email that isn't on one of those domains, even if it was already found.
📦 Output Format
Every result is a single flat JSON object — the dataset's default view lists the same 8 fields the Actor writes, nothing is hidden behind the view. Records stream to the dataset in real time as they're found and are downloadable as JSON, CSV, Excel, or any other format the Apify dataset export supports.
Output for a profile result
{"network": "linkedin.com","keyword": "marketing","title": "Jane Smith - Marketing Director - Acme Inc | LinkedIn","description": "Marketing Director at Acme Inc, 10+ years in B2B growth. Reach out at jane.smith@gmail.com for partnership inquiries.","url": "https://www.linkedin.com/in/jane-smith-marketing/","email": "jane.smith@gmail.com","resultType": "profile","scrapedAt": "2026-07-30T14:22:05.482913Z"}
Output for a company result
{"network": "linkedin.com","keyword": "founder","title": "Acme Ventures | LinkedIn","description": "Acme Ventures is a seed-stage fund backing early founders. Contact the team at hello@acmeventures.com.","url": "https://www.linkedin.com/company/acme-ventures/","email": "hello@acmeventures.com","resultType": "company","scrapedAt": "2026-07-30T14:22:12.091844Z"}
Every field is present on every row regardless of resultType: network (the resolved platform domain, e.g. "linkedin.com"), keyword (the input keyword that produced this row), title and description (Google's indexed title and snippet text, snippet truncated to 500 characters), url (the resolved LinkedIn URL, de-duplicated within the run), email (the lowercased, validated address), resultType (profile / company / post / pulse_article / job / school / other), and scrapedAt (UTC ISO-8601 timestamp of extraction).
Schema stability and export options
The 8-field schema is fixed by the row-building code and does not change based on resultType — every row has the same keys whether it's a profile, a company page, or a job posting. Because the Actor reads Google's search-results markup structurally (by scanning every anchor and its containing result block, not by hardcoded CSS class names), it is resilient to Google changing its obfuscated class names, though a structural layout change on Google's side could still affect extraction. Results are available through the standard Apify dataset export formats (JSON, CSV, Excel, and others) and via the Apify API/apify_client for programmatic retrieval.
💡 Linkedin Lead Scraper Strategy Guide
🎯 Strategy 1: Real-time enrichment pipeline
Trigger a run whenever a new inbound record needs an email — a new company added to a target list, or a new role you're recruiting for. Feed the company name or role as a keywords entry (optionally with location), run the Actor, and take the email and url fields from any row where resultType matches what you're looking for (company for a firm, profile for a person). Append those two fields to the source CRM or spreadsheet record alongside scrapedAt so you know how current the match is.
🎯 Strategy 2: Scheduled monitoring and alerting
Set up an Apify Schedule to re-run the same keywords list weekly or monthly. Diff each run's url values against the previous run's dataset — any url that's new indicates a LinkedIn page (a hire, a new company page, a new post) that wasn't previously indexed with a matching email for that keyword. Alert on new rows where resultType is "job" to catch hiring signals, or "company" to catch newly surfaced firms.
🎯 Strategy 3: Bulk dataset build
Pass a long keywords list in a single run — the Actor processes them sequentially within the run and streams every matched row to the same dataset, deduplicating url values across the whole list automatically. Export the finished dataset to CSV for a research or outreach-list build. The schema does not document a concurrency or parallel-keyword-processing limit, so treat throughput as bounded by maxEmails per keyword and the 5-empty-page cutoff per keyword, not by a stated request-rate ceiling.
Strategy comparison at a glance
| Strategy | Best for | Run pattern | Output format |
|---|---|---|---|
| Real-time enrichment | One record at a time, inbound triggers | Single run per new record | JSON row appended to CRM/sheet |
| Scheduled monitoring | Tracking new leads over time | Recurring run via Apify Schedule | Dataset diffed on url between runs |
| Bulk dataset build | Research or outreach-list construction | One run, many keywords | Full dataset exported to CSV |
🌴 Related LinkedIn Scrapers & Tools
| Scraper Name | What it extracts |
|---|---|
| LinkedIn Company Profile Scraper & Associated Employees (Scrapio) | Structured LinkedIn company page data, affiliated/showcase pages, and associated-employee profile rows |
| LinkedIn Mass Company Profile Finder (Scrapio) | Bulk LinkedIn company URL discovery from keywords, domains, or brand names via DuckDuckGo and Bing |
| Instagram Profile Post Scraper: Hashtag & Business Leads (Scrapio) | Instagram posts plus bio-extracted business/lead fields, including email, for the same lead-generation use case on a different platform |
How to integrate Linkedin Lead Scraper with your stack
Linkedin Lead Scraper works with any language or tool that can make an HTTP request through the Apify API — the examples below use the official apify-client SDKs.
Python
from apify_client import ApifyClientimport csvclient = ApifyClient("<APIFY_API_TOKEN>")run_input = {"keywords": ["marketing", "founder", "recruiter"],"platform": "Linkedin","location": "New York","emailDomains": ["@gmail.com"],"maxEmails": 50,"engine": "legacy","proxyConfiguration": {"useApifyProxy": True},}run = client.actor("<YOUR_USERNAME>/linkedin-lead-scraper").call(run_input=run_input)rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())with open("linkedin_leads.csv", "w", newline="", encoding="utf-8") as f:fieldnames = ["network", "keyword", "title", "description", "url", "email", "resultType", "scrapedAt"]writer = csv.DictWriter(f, fieldnames=fieldnames)writer.writeheader()writer.writerows(rows)print(f"Saved {len(rows)} leads to linkedin_leads.csv")
Node.js
import { ApifyClient } from 'apify-client';import fs from 'fs';const client = new ApifyClient({ token: '<APIFY_API_TOKEN>' });const input = {keywords: ['marketing', 'founder', 'recruiter'],location: 'New York',emailDomains: ['@gmail.com'],maxEmails: 50,proxyConfiguration: { useApifyProxy: true },};const run = await client.actor('<YOUR_USERNAME>/linkedin-lead-scraper').call(input);const { items } = await client.dataset(run.defaultDatasetId).listItems();fs.writeFileSync('linkedin_leads.json', JSON.stringify(items, null, 2));console.log(`Saved ${items.length} leads to linkedin_leads.json`);
Async and scheduled pipelines
For fire-and-forget large keyword lists, start the run with client.actor(...).start() instead of .call() and poll the run status or the dataset item count via the API rather than blocking on completion. For recurring collection, use an Apify Schedule to trigger the same input on a cron interval, and read the resulting dataset from your own pipeline after each scheduled run completes.
🎯 Who Needs Linkedin Lead Scraper? (Use Cases & Industries)
🏢 Sales and business development teams
A BDR team targeting SaaS founders runs {"keywords": ["founder", "SaaS"], "location": "Austin"} and pulls email + url from every profile and company row to seed a cold-outreach list, with keyword preserved so each lead can be attributed to its targeting criteria.
📊 Growth and marketing teams
Marketing teams building a prospect database for a campaign use emailDomains to restrict results to business-plausible domains, then route rows by resultType — profile leads to a personal outreach sequence, company leads to an account-based marketing list.
📱 Competitive intelligence analysts
Analysts track a competitor's hiring and market presence by re-running the same keyword set on a schedule and watching for new url values with resultType: "job" or "company", surfacing hiring or expansion signals as they get indexed by Google.
🔬 Researchers
Researchers studying how a role, skill, or industry term appears in public LinkedIn content can build a keyword-based dataset limited strictly to publicly indexed, publicly accessible pages — no login or private data access is involved.
🎥 Lead-gen and enrichment product builders
Teams building their own lead-enrichment or prospecting product can wrap the keyword-in/leads-out pattern behind a custom interface, using resultType to route different lead categories into different parts of their product.
Is it legal to scrape LinkedIn?
Scraping publicly accessible LinkedIn data is legal in the United States: in hiQ Labs, Inc. v. LinkedIn Corp., 938 F.3d 985 (9th Cir. 2019), the Ninth Circuit held that scraping data a website makes publicly available does not violate the Computer Fraud and Abuse Act. That ruling addresses unauthorized-access law, not LinkedIn's own contract terms: LinkedIn's User Agreement prohibits automated scraping, and violating it is a civil contract risk between you and LinkedIn, not a criminal matter. Because Linkedin Lead Scraper extracts email addresses, which are personal data, GDPR (EU/UK) and CCPA (California) obligations attach when the data relates to an identifiable person — the lawful basis for collecting, storing, and using that data sits with you as the operator of the scraper, not with the Actor itself. Linkedin Lead Scraper returns only publicly accessible data. What you do with that data is your responsibility — consult legal counsel for commercial applications involving personal data.
❓ Frequently asked questions
Does Linkedin Lead Scraper work without a LinkedIn account?
Yes. The Actor never logs in to LinkedIn or fetches a linkedin.com page directly — it queries Google's public search results and reads the title and snippet Google already indexed. No LinkedIn account, password, or session cookie is required or accepted by this Actor.
How does Linkedin Lead Scraper handle anti-scraping measures?
It rotates user agents and Accept-Language headers per request, adds randomized jitter delays before each fetch, and detects blocking by response status and by known block phrases (e.g. "captcha", "unusual traffic") appearing in a small response body. On a detected block or a network error, it retries up to 3 times per page, requesting a fresh proxy connection from Apify Proxy between attempts.
Can I run Linkedin Lead Scraper at scale without getting blocked?
The retry-and-fresh-connection behavior above applies per page fetch, not as a scale guarantee — there is no published uptime or success-rate figure for this Actor. ⚠️ Note that each keyword independently stops after 5 consecutive result pages with no qualifying email, so a large keywords list will finish faster on keywords with little indexed content rather than exhausting maxEmails on every one.
How fresh is the data Linkedin Lead Scraper returns?
Each run performs a live Google search at run time, so the search itself is always current. The title and snippet text returned for each result, however, reflect whatever Google's own index currently holds for that LinkedIn page — which can lag behind the live page if Google hasn't re-crawled it recently. The Actor does not cache results between runs.
Which LinkedIn fields work best for AI training and RAG indexing?
For RAG, index title and description — they carry the free-text content (names, roles, company descriptions, post snippets) that a retrieval layer matches against. For training data, resultType, network, and scrapedAt are the most structurally consistent fields across every row, and email is a pre-validated extraction target. All fields return as typed strings requiring no HTML parsing or normalization before use.
Does scraping LinkedIn for emails raise data protection concerns?
Yes — email addresses are personal data. Linkedin Lead Scraper only surfaces addresses that were already publicly visible in a LinkedIn page's Google-indexed title or snippet; it does not access private profile fields. Storing, contacting, or otherwise processing those addresses is still subject to GDPR, CCPA, or other applicable data protection law depending on your jurisdiction and the data subject's location — that lawful basis is yours to establish, not the Actor's.
Does Linkedin Lead Scraper work with Claude, ChatGPT, and other AI agent tools?
There is no MCP server for this Actor. It is callable as a standard Apify API endpoint by any agent framework that can make an HTTP request — every response is typed JSON, so no HTML parsing is needed before passing results into an LLM context window.
How does Linkedin Lead Scraper compare to other LinkedIn scrapers?
Actors that log into LinkedIn directly (via a session cookie) can return far richer per-profile or per-company data — full experience history, employee counts, affiliated pages — because they read the live page rather than a Google snippet. Linkedin Lead Scraper's trade-off is the opposite: no LinkedIn account or cookie needed at all, keyword-driven discovery instead of a known-URL list, and output limited to whatever email and snippet text Google has already indexed. Choose based on whether you're starting from keywords (this Actor) or from known LinkedIn URLs you want fully enriched (a direct-scraping Actor, such as Scrapio's LinkedIn Company Profile Scraper).
ℹ️ Disclaimer
Linkedin Lead Scraper extracts only publicly available data from LinkedIn, via Google's public search index. This tool is intended for lawful use cases only. Users are responsible for complying with LinkedIn's terms of service and applicable data protection laws in their jurisdiction.