LinkedIn B2B Emails Scraper: Key Decision Maker Contacts
Pricing
from $4.99 / 1,000 results
LinkedIn B2B Emails Scraper: Key Decision Maker Contacts
πΌπ LinkedIn B2B Email Scraper extracts verified email contacts from LinkedIn profiles & company pages. β‘οΈ Accelerate lead generation, sales outreach & recruiting with clean, targeted B2B data. π© Save time, boost conversions.
Pricing
from $4.99 / 1,000 results
Rating
0.0
(0)
Developer
API Empire
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
LinkedIn Scraper β Extract B2B Emails, Profiles & Seniority Scores
LinkedIn B2B Emails Scraper: Key Decision Maker Contacts finds business and personal emails tied to LinkedIn profiles by searching Google for public LinkedIn search-result snippets, then parses each snippet into a name, job title, and company. It returns three linked data types β discovered emails, parsed decision-maker profile data, and a computed seniority score β as typed, normalized JSON. No LinkedIn login, session, or API key is required at any point. After a run, you get a deduplicated, seniority-ranked contact list ready to filter, export, or feed straight into a CRM or outreach tool.
What is LinkedIn B2B Emails Scraper: Key Decision Maker Contacts?
LinkedIn B2B Emails Scraper: Key Decision Maker Contacts is an Apify Actor that discovers business and personal email addresses tied to public LinkedIn profiles by querying Google (site:linkedin.com search patterns) rather than crawling LinkedIn itself. Each matching Google result snippet β the "Name - Title - Company | LinkedIn" line Google shows for a public LinkedIn profile β is regex-parsed into a name, job title, and company, then classified into a seniority bucket and a 0-100 decision-maker score. No LinkedIn account, cookies, or session login are used or required.
- Discover B2B (corporate-domain) or personal emails linked to public LinkedIn results
- Parse decision-maker profile data β name, job title, company β out of the raw snippet
- Classify seniority (Founder / C-Suite / VP / Director / Manager / IC) and score decision-maker likelihood 0-100
- Filter to only target seniority levels or job-title keywords before results are saved
- Export results as JSON or CSV from the Apify dataset
What data does LinkedIn B2B Emails Scraper: Key Decision Maker Contacts collect?
Every run returns one row per discovered email, bundling three linked data types β email, parsed profile identity, and seniority score β alongside search metadata.
| Data Type | Key Fields | JSON Field Names |
|---|---|---|
| Emails | discovered address, B2B vs personal | email, leadType, pattern |
| Decision-maker profile data | parsed name, job title, company | personName, jobTitle, company, matchedTitle |
| Seniority & scoring | seniority bucket, 0-100 score | seniority, decisionMakerScore |
| Search & source metadata | keyword, location, source URL, raw snippet | keyword, location, network, url, title, description, scraped_at |
Need more LinkedIn data?
If you need full individual profile detail beyond a search snippet β work history, skills, and enriched company data β pair this Actor with LinkedIn Profile Scraper With Company Enrichment. If you need to go the other direction and pull every employee of a specific target company rather than searching by keyword, LinkedIn Company Employees Scraper builds that list directly from a company page.
How does LinkedIn B2B Emails Scraper: Key Decision Maker Contacts differ from the official LinkedIn API?
LinkedIn's official API access is heavily restricted: most endpoints sit behind the LinkedIn Partner Program, requiring a business application, a use-case review, and an approved partnership before any data access is granted β there is no public, self-serve endpoint for searching profiles by job title or pulling contact emails. This Actor instead searches Google's public index for LinkedIn result snippets and requires no LinkedIn partnership, review, or account at all.
| Feature | LinkedIn Official API | This Actor |
|---|---|---|
| Access model | Partner Program approval required | Runs immediately, no approval process |
| Credentials | LinkedIn OAuth app + partner agreement | None β no LinkedIn login or token |
| Search by job title / seniority | Not exposed to third-party developers | Native input (keywords, seniority, title filters) |
| Email discovery | Not provided by any LinkedIn API scope | Core function of this Actor |
| Setup time | Weeks (application + review) | Minutes (configure input, start run) |
| Output format | Varies by approved scope | Consistent typed JSON on every run |
Use the official API if you already hold an approved LinkedIn partnership and only need the specific scopes it grants. Use this Actor when you need job-title-targeted, seniority-scored contact discovery without going through partner approval.
Why do developers and teams scrape LinkedIn?
For B2B sales and lead-generation teams
Sales teams use keyword-targeted decision-maker search to build outbound prospect lists without manually browsing LinkedIn profile by profile. Set decisionMakerKeywords to a target role like "VP of Sales" or "Head of Procurement," set emailMode to b2b, and add targetSeniority: ["VP", "C-Suite", "Director"] to keep only leads senior enough to approve a purchase. Each returned row already carries decisionMakerScore and company, so a rep can rank a fresh list by likely buying authority before the first outreach email is sent.
For recruiters and talent-sourcing teams
Recruiters searching for candidates at a specific seniority level use targetTitles (e.g. "Engineering," "Growth") combined with leadLocation to narrow candidate discovery to a role and a city or region. Because the seniority classifier buckets titles into Manager, Director, VP, and above, a sourcer can filter out entry-level Individual Contributor (IC) matches automatically instead of manually re-reading every result snippet to check seniority.
For marketing and partnership teams
Partnership and business-development teams identify companies and named contacts in an industry vertical by searching an industry keyword (e.g. "fintech," "logistics") with emailMode set to b2b, then reviewing the company and matchedTitle fields returned per lead. This produces a working contact sheet for sponsorship, co-marketing, or channel-partner outreach without a manual LinkedIn search session per prospect.
For market researchers and analysts
Researchers studying who holds senior roles across a sector can run the same keyword across multiple leadLocation values and aggregate the returned seniority and company fields to see where a given title concentrates geographically. Because only publicly indexed Google search results are used, the scope stays limited to what LinkedIn and Google have already made publicly discoverable.
How to scrape LinkedIn (step by step)
- Open the Actor's published listing on the Apify Store and click Run.
- Provide
decisionMakerKeywordsβ the job titles, roles, or industries to search for (e.g. "VP of Sales"). - Set
emailMode(b2borpersonal) and, if you only want senior contacts, settargetSeniorityand/ortargetTitlesto filter the results. - Start the run β the Actor searches Google, parses each snippet, classifies seniority, and pushes matching leads to the dataset live.
- Download the results as JSON or CSV from the run's dataset once it finishes (or while it's still running, for partial results).
What to do when LinkedIn changes its structure
This Actor searches Google's rendering of public LinkedIn results rather than LinkedIn's own page markup, and it is maintained to keep its output schema β the same field names and types β stable on your end. No specific turnaround time is promised for any given fix.
β¬οΈ Input
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
decisionMakerKeywords | No | array | Job titles, roles, or industries to search for LinkedIn decision-makers via Google. | ["VP of Sales"] |
emailMode | No | string | b2b (corporate email patterns) or personal (Gmail/Outlook discovery). Default b2b. | "b2b" |
targetSeniority | No | array | Keep only leads classified into these seniority buckets (Founder, C-Suite, VP, Director, Manager, IC, Unknown). The selected buckets are also injected into the Google query, so this narrows the search as well as the output. Unknown means the page carried no job-title evidence β nothing is guessed. Empty = no filter. | ["VP", "C-Suite", "Founder"] |
targetTitles | No | array | Keep only leads whose parsed job title contains one of these keywords (case-insensitive). Also added to the Google query as an OR clause. Empty = no filter. | ["Sales", "Growth"] |
personalDomainFilter | No | array | Personal mode only β the listed domains are added to the Google query and results are filtered to them. Ignored in B2B mode. Empty = accept any domain. | ["@gmail.com", "@outlook.com"] |
b2bSearchPatterns | No | array | B2B mode only β specific pattern keys to run from b2b_patterns.py. Empty = run all 34 patterns. Highest measured yield on LinkedIn: dm_email_me_at, dm_hiring_contact, dm_direct_line, dm_my_email_is, dm_available_at, email_direct_mention, bio_email_basic. | ["dm_email_me_at", "dm_hiring_contact", "dm_direct_line"] |
sourcePlatform | No | string | Target platform for discovery (locked to LinkedIn). Default LinkedIn.com. | "LinkedIn.com" |
leadLocation | No | string | Geographic filter added to search queries. Leave empty for global results. | "London" |
maxDecisionMakerEmails | No | integer | Maximum number of post-filter decision-maker emails to collect (1β50000). Default 10. | 50 |
maxEmailsPerSearchPattern | No | integer | Cap on raw emails scanned per B2B search pattern before filtering (1β5000). Default 15. | 15 |
maxRunSeconds | No | integer | Hard wall-clock budget for the whole run (30β86400). When it elapses the Actor stops cleanly and keeps everything already collected. Default 3600. | 3600 |
forceDirectConnection | No | boolean | Check to force a direct connection with no proxy at all (no escalation on a block). Leave unchecked to keep Apify Proxy enabled. | false |
proxyConfiguration | No | object | Optional proxy override when Apify Proxy is enabled. Default uses the GOOGLE_SERP proxy group. | {"useApifyProxy": true, "apifyProxyGroups": ["GOOGLE_SERP"]} |
No parameter is required β an empty run simply returns zero results, since at least one entry in decisionMakerKeywords is needed for any search to execute.
{"decisionMakerKeywords": ["VP of Sales", "Marketing Director"],"emailMode": "b2b","targetSeniority": ["VP", "C-Suite", "Founder"],"targetTitles": ["Sales", "Growth"],"personalDomainFilter": ["@gmail.com", "@outlook.com"],"b2bSearchPatterns": ["email_for_bookings", "bio_email_basic", "contact_at_domain", "business_development"],"sourcePlatform": "LinkedIn.com","leadLocation": "London","maxDecisionMakerEmails": 50,"maxEmailsPerSearchPattern": 15,"forceDirectConnection": false,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["GOOGLE_SERP"] }}
The most common input mistake is setting a strict targetSeniority or targetTitles filter without raising maxDecisionMakerEmails β filtered-out leads are scanned but never counted toward your cap, so a strict filter yields fewer rows than the number set unless the cap is raised or more keywords/patterns are added.
β¬οΈ Output
Every run pushes typed, normalized JSON rows to the Apify dataset β no HTML, no selectors. Export as JSON, CSV, Excel, or any format the Apify dataset supports. The pattern field is present only on B2B-mode rows; personal-mode rows omit it rather than sending it as an empty value.
Scraped decision-maker lead (B2B mode)
Real row from a live run (decisionMakerKeywords: ["VP of Sales"], emailMode: "b2b"). Note that the address appears verbatim in the description the Actor read β nothing is pattern-generated:
{"network": "linkedin.com","keyword": "VP of Sales","title": "Connie White - VP of Sales and Recruiting Please email ...","description": "Connie White. VP of Sales and Recruiting Please email me at Connie@preferredtalentsolutions.net I rarely check messenger. Preferred Talent Solutions, LLC ... Read more","url": "https://www.linkedin.com/in/cowhite","email": "connie@preferredtalentsolutions.net","leadType": "b2b","location": "","pattern": "dm_email_me_at","scraped_at": "2026-08-04T08:21:24Z","personName": "Connie White","jobTitle": "VP of Sales and Recruiting Please email ...","company": "","seniority": "VP","decisionMakerScore": 80,"matchedTitle": "VP of Sales and Recruiting Please email ...","seniorityEvidence": "VP","titleSource": "parsed_job_title"}
Scraped decision-maker lead (Personal mode)
Real row from a live run (emailMode: "personal", personalDomainFilter: ["@gmail.com"]):
{"network": "linkedin.com","keyword": "marketing consultant","title": "Caroline Rochford - Freelance Digital Marketing Consultant","description": "Boston, Massachusetts, United States Β· Freelance Digital Marketer Β· Freelance Freelance Digital Marketing Consultant Β· A Social Media Consultant ... Contact me at rochfoca@ gmail.com Β· Experience: Freelance Β· Education: Boston ...","url": "https://www.linkedin.com/in/caroline-rochford-85791a109","email": "rochfoca@gmail.com","leadType": "personal","location": "","scraped_at": "2026-08-04T08:43:02Z","personName": "Caroline Rochford","jobTitle": "Freelance Digital Marketing Consultant","company": "","seniority": "IC","decisionMakerScore": 15,"matchedTitle": "Freelance Digital Marketing Consultant","seniorityEvidence": "Consultant","titleSource": "parsed_job_title"}
Both examples reflect the Actor's default dataset view (18 fields, including the seniorityEvidence / titleSource audit pair). A second built-in dataset view, "Decision-Makers Only," surfaces the same underlying rows sorted by decisionMakerScore with a narrower column set (personName, seniority, decisionMakerScore, jobTitle, company, email, url) for quick review.
How many results can you scrape with LinkedIn B2B Emails Scraper: Key Decision Maker Contacts?
maxDecisionMakerEmails caps the run at up to 50,000 post-filter emails per run (default 10), and maxEmailsPerSearchPattern caps raw scanning at up to 5,000 per B2B pattern before filtering (default 15) β and two further safety caps always apply: each individual query stops after 6 result pages, and the whole run stops at the maxRunSeconds wall-clock budget (default 3600s), keeping everything collected so far. Internally, the Actor pages through Google search results 10 at a time per keyword/pattern combination, stopping a given query once it hits 3 consecutive pages with no new matching results, then moves to the next keyword or pattern until the overall cap is reached. Applying a strict targetSeniority or targetTitles filter reduces the yield relative to a raw scan, since filtered-out leads don't count toward the cap β raise maxDecisionMakerEmails or widen the filter if you need more matches.
Integrate LinkedIn B2B Emails Scraper: Key Decision Maker Contacts and automate your workflow
LinkedIn B2B Emails Scraper: Key Decision Maker Contacts works with any language or tool that can send an HTTP request.
REST API integration
import requestsTOKEN = "YOUR_APIFY_TOKEN"ACTOR_ID = "API-Empire~linkedin-b2b-emails-scraper-key-decision-maker-contacts"run = requests.post(f"https://api.apify.com/v2/acts/{ACTOR_ID}/run-sync-get-dataset-items",params={"token": TOKEN},json={"decisionMakerKeywords": ["VP of Sales"], "emailMode": "b2b"},)for lead in run.json():print(lead["email"], lead["seniority"], lead["decisionMakerScore"])
Works in Python, Node.js, Go, Ruby, cURL.
Automation platforms (n8n, Make)
In n8n, use the official Apify node, point it at this Actor's ID, and pass the same input fields (decisionMakerKeywords, emailMode, targetSeniority, etc.) as the node's JSON input β the returned dataset items flow directly into downstream nodes like a CRM or email tool. In Make, the Apify app's "Run an Actor" module takes the same Actor ID and input JSON and can trigger on a schedule, feeding new decision-maker leads into a Google Sheets, HubSpot, or Slack module without custom code.
Is it legal to scrape LinkedIn?
Scraping publicly available data is generally permitted, but the emails and names this Actor returns are personal data, so applicable privacy law governs how you store and use them, not just whether you can collect them. LinkedIn B2B Emails Scraper: Key Decision Maker Contacts returns only data already surfaced in public Google search results β it does not log into LinkedIn or access private profiles. If you're in the EU/UK or handling EU/UK residents' data, GDPR requires a lawful basis (e.g. legitimate interest) for storing and using scraped contact data; CCPA imposes comparable obligations for California residents. Consult legal counsel for commercial use cases involving bulk personal data.
Frequently asked questions
Does this Actor work without a LinkedIn account?
Yes. It never logs into LinkedIn or uses a LinkedIn session β it searches Google for public LinkedIn result snippets, so no LinkedIn account, cookie, or API key is needed at any point.
How often is the scraped data updated?
Every run performs a live Google search at the moment it executes β results are not cached from a previous run, so each run reflects whatever Google's index returns for that query at that time.
How is key decision-maker status determined?
A regex classifier parses the "Name - Title - Company" pattern out of the Google result title (falling back to the description snippet), matches the parsed job title against keyword patterns for Founder, C-Suite, VP, Director, Manager and IC. If no seniority keyword is found anywhere in the result, the lead is bucketed Unknown with a score of 0 rather than being assumed to be an individual contributor β the Actor never asserts a seniority it did not observe. Every classified row carries seniorityEvidence (the exact substring matched) and titleSource (which field it came from) so the call is auditable. The score derives from a base value from a base value per bucket adjusted by modifier words like "senior" or "junior." It is a text-pattern classifier, not a claim of verified employment or title accuracy β always spot-check high-value leads.
What happens if a search returns no matching results?
If a keyword/pattern combination returns three consecutive empty pages, the Actor stops that query and moves to the next keyword or pattern rather than retrying indefinitely. A run can finish with fewer rows than maxDecisionMakerEmails if the underlying Google results run out or a filter excludes most matches β this is an empty or partial result, not an error. It is reported as an error only when the run collected nothing and more Google requests were blocked/failed than succeeded: in that case no page was actually read, so "no results" would not be a supportable conclusion and the run is marked FAILED instead.
Can this Actor return private or login-gated LinkedIn content?
No. It only returns what Google has already publicly indexed from LinkedIn's own public result snippets β it cannot access private profiles, connections-only content, or anything requiring a LinkedIn login.
Does this Actor work for AI agent workflows and LLM pipelines?
Yes. It is callable as an HTTP endpoint by any agent framework via the Apify API, and every response is typed JSON with stable field names β no HTML parsing step is needed before passing results to an LLM or downstream tool.
How does this Actor handle Google's and LinkedIn's anti-bot measures?
It uses browser impersonation (via impit) rather than a full headless browser, detects blocked/CAPTCHA responses by status code and body content, and automatically escalates from a direct connection to an Apify datacenter proxy (GOOGLE_SERP group) and then to a residential proxy on repeated blocks. This escalation can be disabled entirely via forceDirectConnection.
Does this Actor return data in a format LLMs can use directly?
Yes. Every row is typed, normalized JSON with stable field names β no HTML, no selectors, no parsing required. Pass it directly into an LLM context window, a vector store, or an agent tool call.
Can I use this Actor without managing proxies?
Yes. Apify Proxy (GOOGLE_SERP group, with residential fallback) is enabled by default and managed automatically β no proxy list, rotation logic, or IP management is required from you.
What happens if LinkedIn or Google changes its page structure?
The Actor is maintained, and its output schema β the same field names and types documented here β stays stable on your end even if the underlying scraping logic needs updating. No specific turnaround time is promised for any given fix.
Your feedback
Found a bug or missing a field? We want to know. Reach out through this Actor's Apify Store page or the Apify platform's built-in issue reporting for the fastest response β active maintenance keeps this Actor's schema stable as LinkedIn and Google's result pages evolve.