πΌ LinkedIn B2B Email Scraper
Pricing
from $2.99 / 1,000 results
πΌ LinkedIn B2B Email Scraper
Pricing
from $2.99 / 1,000 results
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
19 hours ago
Last modified
Categories
Share
LinkedIn Email Scraper β B2B Leads, Seniority Scores and Domains
LinkedIn Email Scraper finds business and personal email addresses tied to LinkedIn profiles, company pages, and bios by running keyword searches through Google and parsing the matching results. Each run returns structured leads with fields like email, keyword, pattern, title, description, and url, and can optionally attach a decision-maker seniority score or crawl a company's public employee directory. Sales teams, agencies, and researchers use it to build outreach lists without ever touching LinkedIn's login wall. Configure your keywords and patterns once, and every run since stays reproducible and schema-stable.
What is LinkedIn Email Scraper?
LinkedIn Email Scraper is an Apify Actor that discovers email addresses associated with LinkedIn profiles and company pages by searching Google for indexed LinkedIn content matching your keywords, then extracting any email address, title, and description found in the result. It returns a normalized JSON dataset β no LinkedIn account, login, or cookies are required for either the core email search or the optional employee-directory crawl, since both work entirely against public Google results and public LinkedIn pages.
- Discovers leads by keyword, searched across up to 29 built-in B2B corporate-email patterns (or a single broad query in personal mode)
- Returns the identifying/contact fields needed for outreach:
email,title,url,description - Optional decision-maker seniority scoring buckets each lead into Founder / C-Suite / VP / Director / Manager / IC with a 0-100 score
- Optional no-login employee directory discovery adds real employee profiles (
fullname,headline,current_company,location) per target company - Supports a location filter, a custom personal-email-domain allowlist, and per-pattern volume caps
- Output is a standard Apify dataset, exportable in Apify's standard formats (JSON, CSV, Excel, XML)
What data can I extract with LinkedIn Email Scraper?
Every run pushes rows containing the following fields (the exact keys written by the Actor's row-building logic, not just the default table view):
| Field | Example Value | Use Case |
|---|---|---|
email | "hr@acmecorp.com" | The email address extracted from the Google result |
keyword | "marketing" | Which input keyword produced this lead |
pattern | "contact_at_domain" | Which of the 29 B2B search patterns matched (b2b mode only) |
leadType | "b2b" | Whether the row is a b2b email, personal email, or employee directory record |
title | "Acme Corp - Marketing Team | LinkedIn" | The raw Google result title / LinkedIn page headline |
url | "https://www.linkedin.com/company/acme-corp/" | The LinkedIn URL the email or profile was found on |
description | "Contact us at hr@acmecorp.com for partnership inquiries..." | Google's snippet text, useful for verifying context before outreach |
network | "LinkedIn.com" | Platform searched (always LinkedIn.com) |
location | "London" | The location filter applied to the query, if any |
scraped_at | "2026-07-25T14:02:31Z" | UTC timestamp the row was collected |
The default dataset view surfaces 8 of these columns (email, keyword, pattern, leadType, title, url, description, network); location and scraped_at are still written to every row and available in the raw JSON or a custom view.
Decision-maker and employee signals
Turning on enableSeniorityScoring adds six more fields to every row: personName, jobTitle, and company (parsed from the "Name - Title - Company" pattern in the LinkedIn result snippet), plus seniority (one of Founder / C-Suite / VP / Director / Manager / IC), decisionMakerScore (0-100), and matchedTitle (the raw text the classifier matched on). A sales team searching "software agency" can turn this on, set targetSeniority to ["Founder", "C-Suite"], and get only owner- and executive-level leads instead of every title match. Turning on enableEmployeeDirectory instead adds fullname, headline, current_company, and profile_url for each employee found on a target company's public people/about pages.
Targeting and filter fields
Three inputs control which leads make it into the dataset: patterns narrows a b2b run to specific corporate-email search patterns instead of all 29 (e.g. only hr_recruitment and careers_hiring); customDomains restricts personal-mode results to a strict allowlist of email domains (e.g. only @gmail.com); and location appends a geographic term to every query so results skew toward a city, region, or country. Combined with targetSeniority, these fields let a run narrow from "every LinkedIn email mentioning marketing" down to a short list of named decision-makers at a specific location.
Why not build this yourself?
Finding emails on LinkedIn through Google means fetching paginated SERP results, detecting when Google has served a CAPTCHA or consent interstitial instead of real results, and escalating through proxy tiers without stalling the run on a single block β this Actor's proxy state machine moves from a direct connection to a datacenter proxy to a residential proxy automatically, with the residential tier always pre-provisioned so one blocked request doesn't end the run. It also runs 29 distinct search-pattern templates, deduplicates emails across all of them, classifies personal vs. corporate domains, and β for the optional employee-directory feature β parses company and profile pages for JSON-embedded identifiers, XPath-based name/title/location extraction, and Nominatim geocoding fallback for bare city names. Building and maintaining that pipeline (block detection, proxy rotation, HTML parsing across LinkedIn's markup, geocoding) is a standing engineering cost; running it as a configured Actor is not.
If you need one or two email addresses for known companies, a manual Google search is faster. If you need this at keyword scale, across many companies and locations, in a structured, repeatable format, that's what this Actor is built for.
How to use data extracted from LinkedIn?
B2B sales and lead generation
Sales teams are the primary users: set keywords to an industry or role term, leave mode at "b2b" to run some or all 29 corporate patterns, and set maxEmails and maxEmailsPerPattern to size the run. The dataset lands with email, title, description, and url per lead, ready to push into a CRM or outreach tool. Turning on enableSeniorityScoring and setting targetSeniority to ["Founder", "C-Suite", "VP"] filters the same run down to leads worth prioritizing for a founder- or executive-level pitch, instead of every generic company inbox the patterns surface.
Agencies running outbound campaigns for clients
Agencies running the same keyword set repeatedly for different clients can swap keywords, location, and patterns per client brief while keeping the rest of the configuration fixed, producing a consistently shaped dataset run over run. For clients that hand over a target-account list instead of a keyword, enableEmployeeDirectory with companyUrls set to those accounts' LinkedIn company pages returns a per-company employee roster (fullname, headline, current_company) that can be benchmarked or audited alongside the email leads.
Market and account-based research
Combining enableEmployeeDirectory with enableSeniorityScoring builds an account map for ABM research: point companyUrls at a shortlist of target accounts, and the resulting rows show which employees at each company were discoverable, their headline/title, and β when the title parses cleanly β a seniority bucket, giving a rough read on how top-heavy or IC-heavy a target account's public presence looks.
AI agents and automated pipelines
Because the Actor runs as a standard Apify Actor with a JSON input and dataset output, it drops into an agent pipeline as a callable enrichment tool: an agent can pass a company name or keyword as keywords, receive structured email/lead rows back, and chain the result into a CRM-write or outreach-drafting step without any custom scraping code of its own.
πΌ Input sample
keywords is the only required field; every other input has a default. The table below matches the Actor's input schema exactly.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
keywords | Yes | array | Search terms used to find LinkedIn profiles via Google | ["marketing", "real estate"] |
mode | No | string ("b2b" | "personal", default "b2b") | b2b = corporate/company patterns; personal = Gmail/Outlook/personal-domain discovery | "b2b" |
customDomains | No | array | Personal mode only: strict allowlist of email domains to keep | ["@gmail.com", "@outlook.com"] |
patterns | No | array | B2B mode only: which of the 29 built-in patterns to run (empty = all 29) | ["contact_at_domain", "business_development"] |
platform | No | string (enum "LinkedIn.com", default "LinkedIn.com") | Target platform (locked to LinkedIn) | "LinkedIn.com" |
location | No | string (default "") | Optional geographic filter added to every search query | "London" |
maxEmails | No | integer (1-50000, default 10) | Hard cap on total emails collected across the whole run | 200 |
maxEmailsPerPattern | No | integer (1-5000, default 15) | Cap on emails collected per individual B2B pattern | 25 |
useProxy | No | boolean (default true) | Enables Apify Proxy with datacenter-to-residential escalation | true |
proxyConfiguration | No | object (default {"useApifyProxy": true, "apifyProxyGroups": ["GOOGLE_SERP"]}) | Proxy override; a residential fallback tier is always prepared alongside it | see JSON example |
enableSeniorityScoring | No | boolean (default false) | Classifies each lead into a seniority bucket + 0-100 decision-maker score | true |
targetSeniority | No | array | Used only when seniority scoring is on: keep only matching buckets | ["Founder", "C-Suite"] |
enableEmployeeDirectory | No | boolean (default false) | Crawls a company's public people/about pages for employee profiles (no login) | true |
companyUrls | No | array | Used only when employee directory is on: LinkedIn company URLs/names to crawl | ["https://www.linkedin.com/company/microsoft"] |
maxEmployeesPerCompany | No | integer (1-500, default 10) | Cap on employee profiles discovered + enriched per company | 20 |
{"keywords": ["marketing agency"],"mode": "b2b","patterns": ["contact_at_domain", "business_development", "hr_recruitment"],"location": "New York","maxEmails": 150,"maxEmailsPerPattern": 30,"useProxy": true,"enableSeniorityScoring": true,"targetSeniority": ["Founder", "C-Suite", "VP"]}
Common pitfall: customDomains and patterns are mode-specific β customDomains only filters personal mode and patterns only applies in b2b mode, so setting either while the other mode is active does nothing. Likewise, targetSeniority is only enforced when enableSeniorityScoring is true; leaving scoring off means every seniority-shaped input is silently ignored and no rows are filtered.
π½ Output sample
Output is a standard Apify dataset β one JSON object per row, exportable in Apify's standard formats (JSON, CSV, Excel, XML). A default B2B run (no optional features enabled) produces rows shaped like this:
{"network": "LinkedIn.com","keyword": "marketing agency","title": "Acme Growth Partners - Business Development | LinkedIn","description": "Reach our business development team at partnerships@acmegrowth.com for collaboration inquiries.","url": "https://www.linkedin.com/company/acme-growth-partners/","email": "partnerships@acmegrowth.com","leadType": "b2b","location": "New York","pattern": "business_development","scraped_at": "2026-07-25T14:02:31Z"}
When enableSeniorityScoring is on, every row also carries personName, jobTitle, company, seniority, decisionMakerScore, and matchedTitle. When enableEmployeeDirectory is on, employee rows carry leadType: "employee" along with fullname, headline, current_company, and profile_url instead of an email. One honest caveat: when an employee profile is blocked or fails to load, the Actor still pushes a row containing an error field (e.g. "Login required or blocked") instead of dropping it silently, and that row is still charged as a row_result event β filter these out downstream with an expression like !record.error if you only want successfully enriched profiles.
How do you filter and target specific email leads?
Targeting starts with the choice between mode: "b2b", which runs corporate search-pattern templates tuned to surface contact@, hr@, and similar business addresses, and mode: "personal", which runs a single broader query and optionally restricts results to a customDomains allowlist. Within b2b mode, patterns narrows which of the 29 templates run β pick hr_recruitment and careers_hiring for talent-facing contacts, or business_development and sponsor_me for partnership contacts β instead of running all 29 and sorting afterward. location adds a geographic term to every query without needing a separate radius or bounding-box field. Volume is controlled by maxEmails (a hard cap on the whole run) and maxEmailsPerPattern (a per-pattern cap that prevents one high-yield pattern from consuming the entire run's budget before others get a chance). Quality filtering comes from enableSeniorityScoring plus targetSeniority, which drops any lead whose parsed title doesn't match the requested seniority buckets before it's ever pushed to the dataset (and before it's charged).
{ "keywords": ["real estate"], "mode": "b2b", "patterns": ["hr_recruitment", "careers_hiring"], "location": "London", "maxEmails": 200, "maxEmailsPerPattern": 50 }
{ "keywords": ["fitness coach"], "mode": "personal", "customDomains": ["@gmail.com"], "maxEmails": 100 }
{ "keywords": ["marketing agency"], "mode": "b2b", "enableSeniorityScoring": true, "targetSeniority": ["Founder", "C-Suite"], "maxEmails": 150 }
βΆοΈ Want to try other LinkedIn scrapers?
| Scraper Name | What it extracts |
|---|---|
| LinkedIn Company Scraper: Search By Name, Keyword or URL | Resolves a company name/keyword/id to its canonical LinkedIn page, then scrapes industry, size, HQ, specialties, and employees |
| LinkedIn Company About Scraper With Firmographic Enrichment | Firmographic data per company: specialties, founded year, organization type, follower count, HQ, and employee count/range |
| LinkedIn Company Employees Scraper With Growth Tracker | Public employee roster and headcount snapshot per company, for building a headcount-over-time series across scheduled runs |
| LinkedIn Profile Scraper | Full person profile data from a LinkedIn URL: experience, education, posts, and more |
| Instagram B2B Email Scraper & Phone Leads | The same B2B email/phone-lead discovery approach applied to Instagram bios and profiles |
| Alibaba Email Scraper & Trade Assurance Details | Supplier emails and Trade Assurance details from Alibaba listings |
How to extract LinkedIn data programmatically
The Actor runs as a standard Apify Actor: one authenticated REST call starts a run, and the dataset comes back as structured JSON β no scraping code of your own required.
Python example
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("simpleapi/linkedin-b2b-emails-scraper").call(run_input={"keywords": ["marketing agency"],"mode": "b2b","patterns": ["contact_at_domain", "business_development"],"maxEmails": 100,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["email"], item["title"], item["url"])
MCP for AI agents
This Actor is callable through Apify's Actors MCP Server, which exposes any Apify Actor as a tool to an MCP-compatible client (Claude, and other MCP-aware agent frameworks):
$npx @apify/actors-mcp-server --actors simpleapi/linkedin-b2b-emails-scraper
An agent building an outbound-prospecting pipeline can call the Actor as a tool with a company or industry keyword and receive structured email leads back to feed directly into a drafting or CRM-write step.
Export to spreadsheets or CRM
Apify datasets export directly to CSV or Excel from the run's Storage tab. Map email to your CRM's email column, title and description to a notes/context field, url to the LinkedIn link field, and β when seniority scoring is on β company and seniority to segment your import by account and decision-maker level.
Is it legal to scrape LinkedIn B2B emails?
Scraping publicly accessible LinkedIn pages and Google's public search results is generally permitted, since this Actor only reads content that is already indexed and visible without logging in. That said, email addresses β including business emails like hr@acmecorp.com β are personal data under GDPR and, depending on context, under the CCPA, because an email address can identify or contact a specific person even in a corporate context. Anyone storing or using the collected emails for outreach needs a lawful basis (e.g. legitimate interest for B2B marketing) and must honor opt-out/erasure requests. This Actor does not itself send any emails or make storage decisions β that responsibility sits with whoever uses the output. Consult legal counsel for commercial applications involving bulk storage of personal data.
β FAQ
Does this scraper require a LinkedIn login or cookies?
No. Both the core email search and the optional employee-directory crawl work entirely against Google's public search results and LinkedIn's public pages β no li_at cookie, LinkedIn account, or API key is required.
Can I get employee profile data along with the email leads?
Yes. Turning on enableEmployeeDirectory and setting companyUrls (or falling back to keywords as company-name search terms) adds rows with leadType: "employee" carrying fullname, headline, current_company, and profile_url, alongside the email-lead rows from the main search.
How accurate is the email data?
The Actor returns the email exactly as it appears in Google's indexed snippet of the LinkedIn page at request time. Accuracy depends on whether the underlying LinkedIn content is current β Google's index can lag behind the live page. Run collected addresses through a standard email-verification step before large outreach sends.
How many emails can I get per run?
Up to maxEmails, which accepts 1-50,000 and defaults to 10. In b2b mode, maxEmailsPerPattern (1-5,000, default 15) additionally caps how many emails any single one of the 29 patterns can contribute, so the total run budget isn't consumed by one high-yield pattern.
What happens if an employee profile fails to load?
The row is still pushed (and still charged as a row_result event) with an error field describing the failure (e.g. "Login required or blocked", "HTTP 999") instead of fullname/headline data. Filter these out downstream by excluding rows where error is present.
Can I target only decision-makers instead of every match?
Yes. Turn on enableSeniorityScoring and set targetSeniority to the buckets you want (Founder, C-Suite, VP, Director, Manager, IC); any lead whose parsed title doesn't match one of those buckets is dropped before it's pushed or charged.
Does this scraper work with Claude, ChatGPT, and AI agent frameworks?
Yes. It is reachable through Apify's Actors MCP Server (npx @apify/actors-mcp-server --actors simpleapi/linkedin-b2b-emails-scraper) for MCP-compatible clients, and callable as a standard HTTP endpoint by any agent framework that can make a REST call.
Does it include personal emails like Gmail or Yahoo addresses?
Only in mode: "personal". B2B mode explicitly filters out personal-domain addresses so only corporate emails remain, while personal mode can further restrict results to a customDomains allowlist (e.g. only @gmail.com).
Can I use this without a LinkedIn API key or developer account?
Yes. No LinkedIn API key, developer account, or LinkedIn login of any kind is required β only an Apify account to run the Actor.
Conclusion
LinkedIn Email Scraper turns a keyword and a set of search patterns into a structured list of B2B or personal email leads from LinkedIn, with optional seniority scoring and no-login employee directory discovery layered on top when needed. It's built for sales teams, agencies, and researchers who need repeatable, schema-stable outreach data rather than a one-off manual search. Configure your keywords, patterns, and filters in the input above, then run the Actor on Apify to get your first dataset of leads.