LinkedIn Company Employees Scraper : Public Contact Info
Pricing
$14.99/month + usage
LinkedIn Company Employees Scraper : Public Contact Info
Extract company employee data from LinkedIn at scale. Get names, job titles, departments, and locations with clean structured output for HR teams, recruiters, and analysts.
Pricing
$14.99/month + usage
Rating
0.0
(0)
Developer
Scrapio
Maintained by CommunityActor stats
2
Bookmarked
39
Total users
1
Monthly active users
14 days ago
Last modified
Categories
Share
LinkedIn Employee Scraper — Extract Contacts, Profiles and CRM Leads
LinkedIn Company Employees Scraper : Public Contact Info turns a company page into an outreach-ready list of employee contact profiles. Paste a LinkedIn company URL or a plain company name and get typed JSON rows: full name, job title, current company, location, and — for every profile that genuinely displays one — a public contact/social link plus a normalized CRM contact card. Unlike scraping frameworks that return raw HTML, this Actor returns typed JSON ready for your CRM, your database, or your outreach pipeline without any parsing. It never guesses or pattern-matches an email address; every contact field traces back to something LinkedIn's own public page actually rendered. This guide covers every input and output field plus how sales, recruiting, and data teams deploy it in production.
🧭 What Does LinkedIn Company Employees Scraper : Public Contact Info Do?
This Actor accepts LinkedIn company URLs or company-name keywords, discovers that company's employees from the public company page, its /people/ roster, its /about/ page, and a site:linkedin.com/in/ Google search fallback, then fetches each discoverable /in/<profile> page logged-out and extracts identity, headline, current company, location, and any genuinely displayed public contact or social link. No LinkedIn account, login, or cookie is required — every request runs against LinkedIn's public, logged-out pages. Results stream to your Apify dataset row by row as each profile is scraped.
Key capabilities:
- Resolve a company URL or bare company name into a working
https://www.linkedin.com/company/<slug>target. - Discover employee profile URLs from the company page,
/people/,/about/, and a Google SERP fallback, deduplicated and capped at your configured limit. - Fetch each profile logged-out and extract
fullname,headline,current_company,location,profile_picture_url, and detectedcompanies_detected. - Extract only genuinely displayed public contact/social links (
publicContactLinks,bestWebsiteUrl,twitterUrl) from LinkedIn's own "Websites" contact-info block — never guessed. - Build a normalized, ready-to-import
crmContactCardfor every row from already-scraped fields, with no fabricated data. - Detect Creator-mode follower counts and LinkedIn's own influencer badge (
is_creator,is_influencer,follower_count). - Filter output to only contacts with a reachable public link via
onlyWithContactLink.
⚡ Features & Capabilities
The Actor's capabilities split into what it scrapes and returns, and how it fits alongside the rest of the Scrapio LinkedIn suite.
Core features
- Dual discovery paths — company pages (
/,/people/,/about/) unioned with asite:linkedin.com/in/ "company name"Google search, so coverage isn't limited to whatever a single page renders. - Logged-out fetch only — no
li_atsession cookie, no login flow, no account credentials anywhere in the request path. - Genuine public-contact extraction —
publicContactLinksis scoped to the exactdata-section="websites"block LinkedIn server-renders on a profile's public page, decoded through LinkedIn's own/redir/redirect?url=wrapper, and classified intowebsite,twitter,github,youtube,instagram,facebook,medium,behance,dribbble,stackoverflow, orcalendly. It does not scan the whole page for incidental links, so a link mentioned in a post or certification is never misreported as contact info. - CRM-ready normalization —
crmContactCardpackagesfullName,jobTitle,company,companyUrl,profileUrl,location,personalWebsite,twitterUrl,source, andscrapedAtinto one importable object, built entirely from fields already on the row. - Backward-compatible base fields —
company_url,profile_url,fullname,first_name,last_name,headline,public_identifier,location,is_creator,is_influencer,follower_count,current_company,companies_detected,personal_website,recommendations_received,other_contact_details,contact_elementsare all preserved unchanged. - Permanent-block detection — an HTTP 999 response (LinkedIn's own anti-bot signal) is recognized and the profile is skipped immediately rather than burning retries on a request that will never succeed.
LinkedIn Company Employees Scraper : Public Contact Info within the Scrapio data stack
This Actor covers employee contact profiles for a single company at a time. For the company's own profile plus its similar/affiliated-company network, use LinkedIn Company About Scraper : Similar Companies & Affiliates. For monitoring what a company or person posts over time, use LinkedIn Post Scraper By Keyword or LinkedIn Scraper: Posts, Reactions, Comments & Engagement. To expand outward from one person's "People also viewed" network, use LinkedIn Profile Scraper By Similar Profile Finder. For a Google-search-pattern approach to phone/email discovery instead of on-profile public links, use LinkedIn B2B Emails Scraper By Phone & Email Finder.
Why do developers and data teams scrape LinkedIn?
Teams pull LinkedIn's public company and employee data for a narrow set of recurring, high-value workflows — not general web harvesting.
🏢 Sales prospecting and recruiting sourcing
Sales and BD teams feed a target-account list into companyUrlsOrKeywords, cap results with maxContactsPerCompany, and get back fullname, headline, current_company, and profile_url for every discoverable employee — enough to build an account-based outreach list without buying a separate contact database. Recruiters run the same workflow to pull a company's public roster by job title (headline) before reaching out about a role. Both teams lean on crmContactCard to drop rows directly into a CRM or applicant-tracking system, and on onlyWithContactLink to keep only the subset of contacts who publicly listed a personal site, Twitter/X, or GitHub — a warmer, non-LinkedIn-native way to reach someone.
📊 AI training data and RAG indexing
headline, recommendations_received, and crmContactCard are the highest-information text and structured fields here: headline captures a person's current role in their own words, and recommendations are freeform peer-written text — both useful for RAG retrieval over a company's talent graph. For training data, crmContactCard's fixed key set (fullName, jobTitle, company, profileUrl, personalWebsite) gives a consistent schema across every row regardless of how sparse an individual profile is, which matters more for model training than any single field's richness.
📱 Competitive and market intelligence
Track a competitor's current_company roster growth over repeated runs, or watch companies_detected to see which other organizations a competitor's employees list as affiliated companies — a proxy for partnerships, spin-outs, or hiring pipelines a competitor doesn't announce directly.
🔬 Research and academic use
Labor-market and organizational-network researchers use company rosters and job-title distributions (headline) to study hiring patterns, title inflation, or geographic distribution (location) across firms — scoped strictly to what LinkedIn already shows logged-out visitors, with no private data ever touched.
🎥 Product and SaaS development
Enrichment APIs and lead-generation directories build on top of crmContactCard and publicContactLinks to offer their own downstream contact-lookup or CRM-sync product, without having to build and maintain their own LinkedIn scraping and block-detection logic.
🍚 Input Parameters
No input field is required — the Actor will fail with a clear error message if companyUrlsOrKeywords is empty, since that is the only field it cannot run without.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
companyUrlsOrKeywords | No | array (stringList) | LinkedIn company URLs or plain company-name keywords, one per line. Also accepts the base actor's urls key. Minimum 1 item if provided. | ["https://www.linkedin.com/company/google"] |
maxContactsPerCompany | No | integer | Cap on employee contact cards discovered and built per company (1–10,000). Also accepts the base actor's max_employees key. Default 10. | 50 |
includePublicContactLinks | No | boolean | Scan each already-fetched profile page for genuinely displayed public contact/social links and populate publicContactLinks. Default true. | true |
includeCrmContactCard | No | boolean | Build the normalized crmContactCard outreach object on every row. Default true. | true |
onlyWithContactLink | No | boolean | Skip rows entirely when no public contact/social link was found. Default false. | false |
proxyConfiguration | No | object (proxy editor) | Apify Proxy configuration. Residential (US) is used by default if omitted; disabling it sends requests direct. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
Example input
{"companyUrlsOrKeywords": ["https://www.linkedin.com/company/openai","anthropic"],"maxContactsPerCompany": 50,"includePublicContactLinks": true,"includeCrmContactCard": true,"onlyWithContactLink": true,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "US"}}
Supported URL types and input formats
- Full company URL —
https://www.linkedin.com/company/google— parsed by matching/company/<slug>and normalized to a canonical company URL. - Bare company slug —
openai— a value with nolinkedin.comand no slash is treated directly as a company slug and expanded tohttps://www.linkedin.com/company/openai. - Plain company-name keyword —
Anthropic— when the entry can't be resolved as a company URL or slug, it's treated as a keyword and run through thesite:linkedin.com/in/ "Anthropic"Google search fallback instead of the company-page crawl. - Legacy dict entries of the shape
{"url": "..."}are still accepted for backward compatibility with the base actor.
📦 Output Format
Each row is one employee record pushed to your Apify dataset as soon as it's scraped — typed JSON, no HTML, no post-processing required. Rows that error out (blocked, timed out, or no data extracted) are still pushed for visibility but are not charged; only rows without an error key are billed under the row_result event. If you need to filter a downstream export to billed rows only, drop any row where error is present.
Output for employee contact profiles
{"company_url": "https://www.linkedin.com/company/acme-corp","profile_url": "https://www.linkedin.com/in/jordan-lee-example","fullname": "Jordan Lee","first_name": "Jordan","last_name": "Lee","headline": "Senior Product Marketing Manager at Acme Corp","public_identifier": "/in/jordan-lee-example","profile_picture_url": "https://media.licdn.com/dms/image/example.jpg","location": {"country": "United States","city": "Austin","full": "Austin, Texas, United States","country_code": "US"},"is_creator": true,"is_influencer": false,"follower_count": 4820,"created_timestamp": 1785000000,"show_follower_count": true,"current_company": "Acme Corp","companies_detected": [{"name": "Acme Corp", "slug": "acme-corp", "url": "https://www.linkedin.com/company/acme-corp"}],"personal_website": "https://jordanlee.dev","recommendations_received": [{"text": "Jordan is an outstanding partner to work with.", "author": "Alex Rivera", "author_url": "https://www.linkedin.com/in/alex-rivera-example"}],"other_contact_details": {"course_links": []},"contact_elements": {"profile_identity": {"profile_identifier": "https://www.linkedin.com/in/jordan-lee-example","profile_picture": "https://media.licdn.com/dms/image/example.jpg","profile_name_display": "Jordan Lee"},"auth_points": {"email_phone_input_present": false,"password_input_present": false,"login_form_action": ""},"learning_content": {"course_details": [],"course_titles": [],"all_courses_link": ""},"platform": {"corporate_logo_url": "","copyright": "LinkedIn Corporation © 2026","policy_links": ["https://www.linkedin.com/legal/privacy-policy"],"about_links": ["https://about.linkedin.com"],"privacy_links": ["https://www.linkedin.com/legal/privacy-policy"],"user_agreement_links": ["https://www.linkedin.com/legal/user-agreement"]},"language": {"selector_present": false,"locales": []}},"scrapedAt": "2026-07-25T14:02:11Z","publicContactLinks": [{"type": "website", "url": "https://jordanlee.dev"},{"type": "github", "url": "https://github.com/jordanleeexample"}],"hasPublicContactInfo": true,"bestWebsiteUrl": "https://jordanlee.dev","twitterUrl": null}
Output for public contact links and CRM contact cards
publicContactLinks and crmContactCard are the fields this variant adds on top of the base employee record — worth documenting on their own because they're what turns a roster into an outreach list.
{"publicContactLinks": [{"type": "website", "url": "https://jordanlee.dev"},{"type": "github", "url": "https://github.com/jordanleeexample"}],"hasPublicContactInfo": true,"crmContactCard": {"fullName": "Jordan Lee","jobTitle": "Senior Product Marketing Manager at Acme Corp","company": "Acme Corp","companyUrl": "https://www.linkedin.com/company/acme-corp","profileUrl": "https://www.linkedin.com/in/jordan-lee-example","location": "Austin, Texas, United States","personalWebsite": "https://jordanlee.dev","twitterUrl": null,"source": "linkedin_public_profile","scrapedAt": "2026-07-25T14:02:11Z"}}
When includeCrmContactCard is off, crmContactCard is null rather than omitted, so downstream schemas stay consistent whether the feature is on or off.
Schema stability and export options
Field names stay fixed release to release; new fields are additive, and the base actor's original field names (company_url, fullname, location, etc.) are preserved byte-for-byte for backward compatibility even as this variant adds publicContactLinks, crmContactCard, bestWebsiteUrl, twitterUrl, hasPublicContactInfo, and scrapedAt on top. Export the dataset in any format the Apify platform supports for a dataset — JSON, CSV, Excel, or via the API — directly from the Run's Dataset tab or the /v2/datasets/{id}/items API endpoint.
💡 LinkedIn Company Employees Scraper : Public Contact Info Strategy Guide
🎯 Strategy 1: Real-time enrichment pipeline
Trigger a run the moment a new company enters your CRM or ATS: call the Actor with companyUrlsOrKeywords set to that one company URL, onlyWithContactLink on if you only want directly reachable people, and maxContactsPerCompany capped to a small number for speed. Read crmContactCard off each dataset row and write fullName, jobTitle, company, profileUrl, and personalWebsite straight into your CRM's contact object. Because crmContactCard is already normalized, no field mapping is required between the Actor's output and your CRM schema.
🎯 Strategy 2: Scheduled monitoring and alerting
Set up an Apify Scheduler cron run against the same companyUrlsOrKeywords list on a recurring interval. Store each run's profile_url set and diff against the previous run: a profile_url that's new indicates a new discoverable employee, and a hasPublicContactInfo that flipped from false to true indicates someone just added a public website or social link. Alert on either delta rather than re-processing the full roster downstream.
🎯 Strategy 3: Bulk dataset build
For a research or lead-generation dataset spanning many companies, queue one Actor run per batch of companies (or one run with a long companyUrlsOrKeywords list) with maxContactsPerCompany set to your target roster size. Note the Actor processes companies and their profiles sequentially within a single run, so for large batches, launching several parallel runs via the Apify API — one per company or company group — completes the build faster than one run with a very long input list. Export each run's dataset as CSV and concatenate for the final dataset.
Strategy comparison at a glance
| Strategy | Best for | Run pattern | Output format |
|---|---|---|---|
| Real-time enrichment | Per-record CRM/ATS lookups | Single-company run, on demand | crmContactCard per row → CRM write |
| Scheduled monitoring | Tracking roster/contact-link changes | Recurring scheduled run, diffed | profile_url / hasPublicContactInfo delta |
| Bulk dataset build | Research or lead datasets at scale | Parallel runs across company batches | Dataset export → CSV/JSON |
🌴 Related LinkedIn Scrapers & Tools
Other Scrapio LinkedIn scrapers
| Scraper Name | What it extracts |
|---|---|
| LinkedIn Company About Scraper : Similar Companies & Affiliates | Company About page plus similar and affiliated companies |
| LinkedIn Post Scraper By Keyword | Company/profile posts with keyword and new-post monitoring |
| LinkedIn Profile Scraper By Similar Profile Finder | "People also viewed" network graph expansion |
| LinkedIn B2B Emails Scraper By Phone & Email Finder | Business emails and phone numbers via Google search patterns |
| LinkedIn Scraper: Posts, Reactions, Comments & Engagement | Company post reactions, comments, and engagement analytics |
Cross-platform contact/lead scrapers
| Scraper Name | What it extracts |
|---|---|
| Instagram Profile Scraper With Bio Link & Email Extraction | Instagram bio links and emails |
| Facebook User Search Scraper With Lead & Contact Enrichment | Facebook user search results with contact enrichment |
| Extract Emails Contacts Socials: Verified Phone & Email List | Emails, phones, and social links from any website |
Complementary adjacent tools
| Scraper Name | What it extracts |
|---|---|
| Facebook Page Posts Scraper With Lead & Contact List | Facebook business page posts with lead contact data |
How to integrate LinkedIn Company Employees Scraper : Public Contact Info with your stack
LinkedIn Company Employees Scraper : Public Contact Info works with any language or tool that can make an HTTP request through the Apify API, or with the official Apify SDKs shown below.
Python
from apify_client import ApifyClientimport csvclient = ApifyClient("APIFY_API_TOKEN")run_input = {"companyUrlsOrKeywords": ["https://www.linkedin.com/company/openai","https://www.linkedin.com/company/anthropic",],"maxContactsPerCompany": 50,"includePublicContactLinks": True,"includeCrmContactCard": True,"onlyWithContactLink": True,}run = client.actor("Scrapio/linkedin-company-employees-scraper-public-contact-info").call(run_input=run_input)rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())fields = ["fullname", "headline", "current_company", "profile_url", "bestWebsiteUrl", "twitterUrl"]with open("employee_contacts.csv", "w", newline="", encoding="utf-8") as f:writer = csv.DictWriter(f, fieldnames=fields)writer.writeheader()for row in rows:writer.writerow({k: row.get(k, "") for k in fields})print(f"Saved {len(rows)} contact rows to employee_contacts.csv")
Node.js
import { ApifyClient } from 'apify-client';import fs from 'fs';const client = new ApifyClient({ token: process.env.APIFY_API_TOKEN });const run = await client.actor('Scrapio/linkedin-company-employees-scraper-public-contact-info').call({companyUrlsOrKeywords: ['https://www.linkedin.com/company/openai'],maxContactsPerCompany: 50,includePublicContactLinks: true,includeCrmContactCard: true,});const { items } = await client.dataset(run.defaultDatasetId).listItems();fs.writeFileSync('contacts.json', JSON.stringify(items, null, 2));console.log(`Saved ${items.length} contact rows`);
Async and scheduled pipelines
For large or recurring jobs, don't wait on a synchronous call: start the run via the Apify API's async run endpoint and either poll the run's status or attach an Apify webhook on ACTOR.RUN.SUCCEEDED to trigger your downstream pipeline once the dataset is ready. For recurring monitoring, use the Apify platform's built-in Scheduler to re-run the same input on a cron schedule rather than managing your own timer.
🎯 Who Needs LinkedIn Company Employees Scraper : Public Contact Info? (Use Cases & Industries)
🏢 Sales and BD teams
A BD rep researching a target account pastes the company URL, sets onlyWithContactLink on, and gets back only the employees who publicly listed a website or social handle — a ready warm-outreach shortlist with crmContactCard.jobTitle and crmContactCard.profileUrl for personalization.
📊 Recruiters and talent sourcing teams
A recruiter pulls a target company's public roster filtered by headline for a specific title pattern, then reaches out via each candidate's profile_url — no separate directory subscription required, and no guessed email to bounce.
📱 Competitive intelligence analysts
Analysts re-run the Actor against a competitor's company URL periodically and track roster and companies_detected changes as a signal of headcount growth, new partnerships, or affiliated-company spin-outs.
🔬 Researchers
Labor-market and organizational-network researchers use company rosters, headline title text, and location distributions to study hiring patterns across firms — scoped to LinkedIn's own public, logged-out data.
🎥 Product and enrichment tool builders
Teams building a CRM-sync or lead-enrichment SaaS product ingest crmContactCard and publicContactLinks directly as their backend data source instead of building and maintaining their own LinkedIn crawler.
Is it legal to scrape LinkedIn?
Scraping publicly accessible LinkedIn data is generally lawful in the United States: in hiQ Labs, Inc. v. LinkedIn Corp. (9th Cir. 2019), the court held that scraping data a website makes publicly available, without bypassing an authentication wall, does not violate the Computer Fraud and Abuse Act. That precedent addresses the CFAA specifically — it does not resolve every legal question. Scraping in a way that breaches LinkedIn's Terms of Service can still expose you to civil contract-based claims from LinkedIn, separate from any criminal-law question. Because this Actor returns personal data — names, job titles, locations, and any public contact/social links — GDPR (if you process EU residents' data) and CCPA (if you process California residents' data) obligations apply to what you do with the output, including your lawful basis for processing and your retention practices. LinkedIn Company Employees Scraper : Public Contact Info 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 Company Employees Scraper : Public Contact Info work without a LinkedIn account?
Yes. Every request runs against LinkedIn's public, logged-out pages via a plain HTTP client — no LinkedIn account, login flow, or li_at session cookie is used or required anywhere in the Actor.
How does it handle LinkedIn's anti-scraping measures?
It routes requests through Apify Proxy (residential, US, by default), detects LinkedIn's authwall/login/challenge redirects and its HTTP 999 anti-bot response, and retries recoverable errors up to three times with increasing back-off. An HTTP 999 response is treated as a permanent block for that URL and is not retried, since retrying it wastes run time on a request LinkedIn will not fulfill.
Can I run it at scale without getting blocked?
You can queue many companies in one run or launch multiple runs in parallel via the API; there is no documented concurrency limit built into the Actor itself. Within a single run, companies and their employee profiles are processed sequentially with randomized delays between requests, and a residential proxy is used by default to reduce block rates. There is no published uptime or success-rate guarantee — block rates depend on LinkedIn's own anti-bot behavior at the time of the run.
How fresh is the data it returns?
Every profile is fetched live at run time — there is no caching layer. Each row carries a scrapedAt ISO-8601 UTC timestamp recording exactly when that profile was fetched.
Which fields work best for AI training and RAG indexing?
For RAG retrieval, headline and recommendations_received carry the most freeform, high-information text about a person's role and reputation. For training data, crmContactCard's fixed key set (fullName, jobTitle, company, profileUrl, personalWebsite) gives a consistent schema across every row. All fields return as typed primitives or nested JSON objects/arrays — no HTML parsing or normalization is required before passing them into an LLM context window.
Does this Actor comply with GDPR and CCPA?
The Actor itself only extracts data LinkedIn already displays to logged-out visitors — it does not store, sell, or process the data on your behalf beyond your Apify dataset. Because names, job titles, and public contact links are personal data, the lawful basis for storing, using, or contacting the people in your dataset under GDPR or CCPA sits with you as the operator, not with the Actor.
Does it work with Claude, ChatGPT, and other AI agent tools?
Yes, as an HTTP endpoint callable by any agent framework: start a run and read results through the Apify API (for example, the synchronous run-sync-get-dataset-items endpoint), or wire it into any orchestration tool that can call a REST API. Every response is typed JSON, so no HTML parsing step is needed before handing results to an LLM.
Are blocked or errored profile rows charged?
No. Rows that fail — blocked, timed out, or with no data extracted — are still pushed to the dataset for visibility (they carry an error field) but are pushed without the row_result charged event. Only rows without an error key are billed. Filter a dataset export on the absence of the error field to see billed rows only.
Does this Actor return a company's complete employee roster?
No, and no LinkedIn scraper honestly can. Discovery combines the company's own public pages with a Google SERP fallback, and LinkedIn does not expose a complete employee directory to logged-out visitors — coverage depends on how much of a roster LinkedIn and Google's index expose publicly, and publicContactLinks will be empty for most profiles since most people never add a public website or social link to their LinkedIn contact info.
ℹ️ Disclaimer
LinkedIn Company Employees Scraper : Public Contact Info extracts only publicly available data from LinkedIn. 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, including GDPR and CCPA, in their jurisdiction.