LinkedIn B2B Emails Scraper: Headcount Range Details avatar

LinkedIn B2B Emails Scraper: Headcount Range Details

Pricing

from $4.99 / 1,000 results

Go to Apify Store
LinkedIn B2B Emails Scraper: Headcount Range Details

LinkedIn B2B Emails Scraper: Headcount Range Details

LinkedIn B2B Emails Scraper extracts public LinkedIn profile data and discovers available business email addresses and contact details. Collect names, job titles, companies, profile URLs, emails, phone numbers, and more for B2B lead generation, sales prospecting, and CRM enrichment.

Pricing

from $4.99 / 1,000 results

Rating

0.0

(0)

Developer

Scrapier

Scrapier

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

LinkedIn B2B Email Scraper — Employee Profiles, Company Leads

LinkedIn B2B Emails Scraper: Headcount Range Details crawls a company's public people and about pages — no login required — to find real /in/ employee profile URLs, then enriches each with full name, headline, current company and location. Legacy B2B and personal modes still return email leads via Google SERP pattern matching. Every result ships as consistent, typed JSON — ready to pass to an LLM, load into a CRM, or feed a monitoring pipeline. Point it at a target account list and start building outreach-ready contact data today.

What is LinkedIn B2B Emails Scraper: Headcount Range Details?

It is a dual-mode LinkedIn lead-discovery Actor: its default Employees mode crawls a company's own /people/ and /about/ pages (no cookies, no LinkedIn account) to find genuine employee profile URLs, then fetches each profile and extracts full name, headline, current company and location. Its legacy B2B and Personal modes reuse the original Google-SERP corporate/personal email search, unchanged, for when you specifically need email addresses. No LinkedIn login or session cookie is required for any mode — company/profile pages are fetched as a public visitor, and legacy modes search Google directly.

  • Crawls company people/about pages for real employee profile URLs, with a Google-search fallback when a page yields none
  • Enriches each employee profile with full name, headline, current company and location
  • Runs 29 pre-built legacy B2B search patterns (contact@, info@, bio-email mentions, hiring/HR CTAs, and more) for corporate email discovery
  • Runs a legacy Personal mode with an optional email-domain allowlist (e.g. @gmail.com)
  • Accepts one or many company URLs, slugs, or plain-text keywords per run
  • Auto-escalates through direct → datacenter → residential proxy tiers when a legacy-mode request gets blocked

What data can you get with LinkedIn B2B Emails Scraper: Headcount Range Details?

The Actor returns one flat row schema shared across all three modes, distinguished by the leadType field.

Result TypeExtracted FieldsPrimary Use Case
Employee directory (leadType: "employee", default mode)fullname, headline, current_company, profile_url, location, keyword, pattern, title, url, description, network, scraped_at (email is always blank)Account-based prospecting, org discovery, outreach personalization
Legacy B2B corporate email (leadType: "b2b")email, pattern, keyword, title, url, description, network, location, scraped_at (fullname/headline/current_company/profile_url blank)Bulk corporate contact discovery for cold outreach
Legacy personal email (leadType: "personal")Same shape as B2B rows, optionally filtered to a domain allowlistPersonal-inbox contact discovery for smaller-business targets

Legacy B2B and personal email leads

When directoryMode is set to b2b or personal, the Actor runs Google-SERP searches combining your keyword with site:linkedin.com and one of 29 pattern templates (booking/reservation mentions, bio-email emoji, hiring/HR calls-to-action, contact@/info@ mentions, and similar). Each matched search result is parsed into a row carrying the extracted email, the pattern name that found it, and the source title/description/url. This is the only way to get an email value from this Actor — the default employee-directory mode never populates it, since public LinkedIn profile pages don't expose email addresses.

How does LinkedIn B2B Emails Scraper: Headcount Range Details differ from the official LinkedIn API?

LinkedIn's official developer platforms (Marketing Developer Platform, Talent Solutions API) return data only to companies approved into LinkedIn's Partner Program for a specific, pre-approved use case — they do not expose a general-purpose employee-directory or people-search endpoint to independent developers, and they do not return contact-email data at all.

FeatureLinkedIn's Official APILinkedIn B2B Emails Scraper
Access requirementApproved Partner Program membership for a specific use caseNo LinkedIn account, login, or API key needed
Employee/people directoryNot available to general developersCrawled directly from public company pages
Contact/email dataNot providedAvailable via legacy B2B/personal search modes
Setup processFormal partner application and reviewConfigure input JSON and start a run
Output shapeDefined by the approved partner product, varies by grantOne consistent JSON row schema across every mode

The official route makes sense if you already hold an approved LinkedIn partnership for a qualifying product. For everyone else researching target accounts or building outreach lists from public data, this Actor is the practical path in.

How to scrape LinkedIn with LinkedIn B2B Emails Scraper: Headcount Range Details?

  1. Open the Actor on its Apify Console page (search linkedin-b2b-emails-scraper-headcount-range-details).
  2. Paste one or more LinkedIn company URLs into Company URLs — no field is required, so you can also leave it empty and add Keywords as company-name search terms instead.
  3. Leave Directory Mode on employees (default) for profile discovery, or switch it to b2b/personal and set Keywords, Location Filter, and Maximum Total Results for legacy email search.
  4. Click Start.
  5. Open the dataset and export as JSON or CSV — use the Employee Directory view for profile rows or B2B Corporate Emails (legacy) for email rows.

Example request body for the default mode:

{
"companyUrls": ["https://www.linkedin.com/company/google", "microsoft"],
"maxEmployees": 25,
"proxyEnabled": true
}

How to run multiple queries in one job

Add every company URL (or fallback keyword) to the companyUrls/legacyFallbackKeywords array — the Actor processes each target in turn within a single run, applying maxEmployees (or maxResults in legacy modes) per target rather than to the whole batch. Targets are processed sequentially, one after another, not in parallel; the source code contains no documented concurrency setting for this loop.

⬇️ Input

No parameter is required — every field below has a working default.

ParameterRequiredTypeDescriptionExample Value
companyUrlsNoarrayLinkedIn company URLs or slugs to crawl for employees; supersedes legacyFallbackKeywords for discovery["https://www.linkedin.com/company/google", "microsoft"]
legacyFallbackKeywordsNoarrayCompany-name search terms used when companyUrls is empty, or as the query keyword in legacy b2b/personal modes["marketing"]
directoryModeNostring (enum)employees (default) = real crawl + enrichment; b2b = legacy corporate patterns; personal = legacy domain filter"employees"
maxEmployeesNointeger (1–10000)Cap on employee profiles discovered and enriched per target (employees mode); default 1025
emailDomainFilterNoarrayPersonal mode only: filter results to these domains["@gmail.com", "@outlook.com"]
searchPatternsNoarrayB2B mode only: which named patterns from b2b_patterns.py to run; empty = all 29["contact_at_domain", "business_development"]
sourceNetworkNostring (enum)Target platform for legacy modes, locked to LinkedIn.com"LinkedIn.com"
locationFilterNostringGeographic filter appended to legacy-mode search queries; empty = global"London"
maxResultsNointeger (1–50000)Legacy modes only: total email cap across all keywords/patterns; default 1050
patternResultCapNointeger (1–5000)Legacy B2B mode only: email cap per search pattern; default 1515
proxyEnabledNobooleanEnable proxy for all requests — company pages, profile pages, and Google Search; default truetrue
proxyConfigurationNoobjectProxy override; residential recommended for employees mode, GOOGLE_SERP used automatically for legacy modes{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}

Example JSON input:

{
"companyUrls": ["https://www.linkedin.com/company/google"],
"directoryMode": "employees",
"maxEmployees": 20,
"proxyEnabled": true,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

Common pitfall: leaving directoryMode on its default employees value while expecting an email in every row. Employee-directory rows always leave email blank — public profile pages don't expose it. Set directoryMode to "b2b" or "personal" and provide legacyFallbackKeywords if you specifically need email addresses.

⬆️ Output

Results are pushed to the dataset as one flat, typed JSON row per lead, in real time as they're found. Export as JSON, CSV, Excel, or any other format the Apify dataset supports.

Scraped results

[
{
"fullname": "Jane Doe",
"headline": "Senior Software Engineer at Google",
"current_company": "Google",
"profile_url": "https://www.linkedin.com/in/janedoe",
"email": "",
"keyword": "https://www.linkedin.com/company/google",
"pattern": "company_people_page",
"leadType": "employee",
"title": "Jane Doe",
"url": "https://www.linkedin.com/in/janedoe",
"description": "Senior Software Engineer at Google",
"network": "LinkedIn.com",
"location": "Mountain View, California, United States",
"scraped_at": "2026-07-20T15:00:00Z"
},
{
"fullname": "Marco Rossi",
"headline": "Head of Partnerships at Google",
"current_company": "Google",
"profile_url": "https://www.linkedin.com/in/marcorossi",
"email": "",
"keyword": "https://www.linkedin.com/company/google",
"pattern": "google_company_search",
"leadType": "employee",
"title": "Marco Rossi",
"url": "https://www.linkedin.com/in/marcorossi",
"description": "Head of Partnerships at Google",
"network": "LinkedIn.com",
"location": "London, England, United Kingdom",
"scraped_at": "2026-07-20T15:01:12Z"
},
{
"fullname": "",
"headline": "",
"current_company": "",
"profile_url": "https://www.linkedin.com/in/blockedprofile",
"email": "",
"keyword": "https://www.linkedin.com/company/google",
"pattern": "company_people_page",
"leadType": "employee",
"title": "",
"url": "https://www.linkedin.com/in/blockedprofile",
"description": "",
"network": "LinkedIn.com",
"location": "",
"scraped_at": "2026-07-20T15:02:03Z",
"error": "Login required or blocked"
},
{
"fullname": "",
"headline": "",
"current_company": "",
"profile_url": "",
"email": "sales@example.com",
"keyword": "marketing agency",
"pattern": "contact_at_domain",
"leadType": "b2b",
"title": "Example Marketing Agency | LinkedIn",
"url": "https://www.linkedin.com/company/example-marketing",
"description": "Contact us at sales@example.com for partnership inquiries.",
"network": "LinkedIn.com",
"location": "",
"scraped_at": "2026-07-20T15:03:47Z"
}
]

The third row shows a blocked/failed profile fetch — it still produces a row (with error set and enrichment fields blank) so partial runs are never silently dropped.

How can I use the data extracted with LinkedIn B2B Emails Scraper: Headcount Range Details?

  • B2B sales and lead generation: feed fullname, headline, current_company and profile_url from target-account employee crawls straight into a CRM or spreadsheet as a starter prospect list, and fall back to legacy B2B mode when you need an email value to reach them directly.
  • Outbound outreach: personalize LinkedIn InMail or email copy using each lead's real headline and current_company, instead of sending generic templates to a purchased list.
  • AI engineers and LLM developers: run the Actor from an agent, pass the returned JSON rows as grounding context, and let the model draft account summaries or outreach messages from real, current profile data.
  • Account-based marketing (ABM): point companyUrls at your target-account list and pull every discoverable employee per account to build a per-account contact map before a campaign launch.

How do you monitor employee changes at a company over time?

The Actor doesn't currently return a headcount or company-size field, so there is nothing to track under that name — but re-running it against the same companyUrls on a schedule does let you track something genuinely useful: who's currently listed at a target company, and what changed since the last run. Monitoring discipline here means treating each run's dataset as a dated snapshot of a company's discoverable employees, not a one-off pull. Store each run's dataset, then diff on profile_url as the join key: a profile_url appearing for the first time is a new hire or newly discoverable employee; a headline or current_company value that changed for an existing profile_url signals a promotion, role change, or departure; a profile_url that disappears entirely may mean the person has left or their profile is no longer discoverable from the company's people/about pages. Compare the scraped_at timestamps between runs to confirm which snapshot is newer before drawing conclusions. A practical workflow: schedule a weekly run across your target-account list, load each run's dataset into a table keyed on profile_url, and alert your sales or recruiting team whenever a headline/current_company diff appears for a contact you already track — that diff is usually the trigger for a timely outreach or a re-qualification of the account. Set this up with Apify's built-in Scheduler to trigger runs automatically on a cron interval; the Actor has no built-in diffing, so the comparison step happens in whatever system stores your dataset exports.

Integrate LinkedIn B2B Emails Scraper: Headcount Range Details and automate your workflow

LinkedIn B2B Emails Scraper: Headcount Range Details works with any language or tool that can send an HTTP request.

REST API with Python

import requests
ACTOR_ID = "your-username~linkedin-b2b-emails-scraper-headcount-range-details"
TOKEN = "YOUR_APIFY_TOKEN"
payload = {"companyUrls": ["https://www.linkedin.com/company/google"], "maxEmployees": 20}
resp = requests.post(
f"https://api.apify.com/v2/acts/{ACTOR_ID}/run-sync-get-dataset-items",
params={"token": TOKEN},
json=payload,
)
leads = resp.json()
print(leads[0]["fullname"], leads[0]["current_company"])

Replace ACTOR_ID with the exact ID shown on this Actor's Apify Console page.

MCP for query-grounded AI agents

This Actor, like any public Apify Actor, can be added as a callable tool through Apify's Actors MCP Server (mcp.apify.com), letting an MCP-compatible client — Claude, or any other MCP-aware agent framework — call it directly and receive structured JSON leads to ground its response.

Scheduled monitoring and delivery

Use Apify's built-in Scheduler to trigger runs on a recurring cron interval against the same companyUrls, then read each run's dataset through the Apify API to compare against the previous run. The Actor has no built-in webhook delivery of its own — Apify's platform-level webhooks can be attached to a run if you need push notification on completion.

Scraping publicly accessible LinkedIn pages is generally permitted — this Actor returns only what any visitor can already see without logging in, whether that's a company's people page or a Google search result. However, an email address tied to a name is personal data under GDPR and CCPA even when found on a business page, so collecting and storing it carries real compliance obligations: you need a lawful basis to process it, and data subjects retain rights over it regardless of where you found it. Bulk collection for AI training carries a different risk profile than pulling a short-lived list for one-off outreach monitoring — treat them differently in your own compliance review. Consult your legal team for commercial use cases involving bulk data storage.

Frequently asked questions

Does this scraper require a LinkedIn login?

No. Employee-directory discovery fetches public company and profile pages without cookies or a session; legacy B2B/personal modes search Google directly. No LinkedIn account is ever required.

Will employee-directory rows include an email address?

No. email is always blank in the default employees mode because public LinkedIn profile pages don't expose it. Set directoryMode to "b2b" or "personal" if you need an email value.

How is the "headcount range" data actually sourced?

It isn't — despite the Actor's name, no headcount or company-size field is produced anywhere in its output. What it actually returns is per-employee profile data (fullname, headline, current_company, location) discovered by crawling a company's people/about pages, plus legacy corporate/personal email leads. If you need employee counts derived from what this Actor returns, you'd have to count distinct profile_url rows per target yourself, and that count reflects only what's discoverable from public pages — not the company's real total headcount.

How many results does this Actor return per query?

In employees mode, up to maxEmployees (1–10,000, default 10) profiles per company/keyword target. In legacy b2b/personal modes, up to maxResults (1–50,000, default 10) total emails per run, with patternResultCap (1–5,000, default 15) capping emails collected per individual B2B pattern.

How does this Actor handle LinkedIn's anti-bot measures?

It sends browser-like headers and retries with randomized delays, detects HTTP 999 (LinkedIn's block response) and login/authwall redirects, and skips a blocked profile rather than looping forever. Legacy modes additionally escalate through direct → datacenter (GOOGLE_SERP) → residential proxy tiers when a Google search request is blocked; employee-directory mode uses a single configured proxy (residential by default) without tiered escalation.

Set directoryMode to "employees" (the default) for profile discovery, or to "b2b"/"personal" for the legacy Google-SERP email search. Providing companyUrls with no directoryMode set also runs employee-directory mode.

How do I use this Actor to monitor employee changes at a company over time?

Schedule repeated runs against the same companyUrls, keyed on profile_url, and diff headline/current_company between runs to catch new hires, role changes, and departures. See the monitoring section above for the full workflow.

Does this Actor work with Claude, ChatGPT, and AI agent frameworks?

Yes. It's callable as a standard HTTP endpoint via the Apify API from any agent framework, and it can also be registered as a tool through Apify's Actors MCP Server for MCP-compatible clients.

Can I use this Actor without managing proxies or LinkedIn credentials?

Yes. No LinkedIn account or credential of any kind is needed. Proxy is handled automatically — proxyEnabled defaults to true with a residential proxy for employee-directory requests and Apify's GOOGLE_SERP proxy for legacy search — you only need an Apify account to run it.

Does locationFilter work in employee-directory mode?

No. locationFilter only affects legacy b2b/personal search queries. In employee-directory mode, location is extracted directly from each profile instead, so the filter is ignored.

Your feedback

Found a bug or a field that doesn't match what's documented here? Let us know through the Actor's Issues tab on Apify so it can be fixed. Feedback on missing fields or edge cases helps keep this README accurate.