πŸ’Ό LinkedIn B2B Email Scraper avatar

πŸ’Ό LinkedIn B2B Email Scraper

Pricing

from $2.99 / 1,000 results

Go to Apify Store
πŸ’Ό LinkedIn B2B Email Scraper

πŸ’Ό LinkedIn B2B Email Scraper

Pricing

from $2.99 / 1,000 results

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

19 hours ago

Last modified

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):

FieldExample ValueUse 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.

ParameterRequiredTypeDescriptionExample Value
keywordsYesarraySearch terms used to find LinkedIn profiles via Google["marketing", "real estate"]
modeNostring ("b2b" | "personal", default "b2b")b2b = corporate/company patterns; personal = Gmail/Outlook/personal-domain discovery"b2b"
customDomainsNoarrayPersonal mode only: strict allowlist of email domains to keep["@gmail.com", "@outlook.com"]
patternsNoarrayB2B mode only: which of the 29 built-in patterns to run (empty = all 29)["contact_at_domain", "business_development"]
platformNostring (enum "LinkedIn.com", default "LinkedIn.com")Target platform (locked to LinkedIn)"LinkedIn.com"
locationNostring (default "")Optional geographic filter added to every search query"London"
maxEmailsNointeger (1-50000, default 10)Hard cap on total emails collected across the whole run200
maxEmailsPerPatternNointeger (1-5000, default 15)Cap on emails collected per individual B2B pattern25
useProxyNoboolean (default true)Enables Apify Proxy with datacenter-to-residential escalationtrue
proxyConfigurationNoobject (default {"useApifyProxy": true, "apifyProxyGroups": ["GOOGLE_SERP"]})Proxy override; a residential fallback tier is always prepared alongside itsee JSON example
enableSeniorityScoringNoboolean (default false)Classifies each lead into a seniority bucket + 0-100 decision-maker scoretrue
targetSeniorityNoarrayUsed only when seniority scoring is on: keep only matching buckets["Founder", "C-Suite"]
enableEmployeeDirectoryNoboolean (default false)Crawls a company's public people/about pages for employee profiles (no login)true
companyUrlsNoarrayUsed only when employee directory is on: LinkedIn company URLs/names to crawl["https://www.linkedin.com/company/microsoft"]
maxEmployeesPerCompanyNointeger (1-500, default 10)Cap on employee profiles discovered + enriched per company20
{
"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 NameWhat it extracts
LinkedIn Company Scraper: Search By Name, Keyword or URLResolves a company name/keyword/id to its canonical LinkedIn page, then scrapes industry, size, HQ, specialties, and employees
LinkedIn Company About Scraper With Firmographic EnrichmentFirmographic data per company: specialties, founded year, organization type, follower count, HQ, and employee count/range
LinkedIn Company Employees Scraper With Growth TrackerPublic employee roster and headcount snapshot per company, for building a headcount-over-time series across scheduled runs
LinkedIn Profile ScraperFull person profile data from a LinkedIn URL: experience, education, posts, and more
Instagram B2B Email Scraper & Phone LeadsThe same B2B email/phone-lead discovery approach applied to Instagram bios and profiles
Alibaba Email Scraper & Trade Assurance DetailsSupplier 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 ApifyClient
client = 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.

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.