LinkedIn Company Employees Scraper : Public Contact Info avatar

LinkedIn Company Employees Scraper : Public Contact Info

Pricing

$14.99/month + usage

Go to Apify Store
LinkedIn Company Employees Scraper : Public Contact Info

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

Scrapio

Maintained by Community

Actor stats

2

Bookmarked

39

Total users

1

Monthly active users

14 days ago

Last modified

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 detected companies_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 crmContactCard for 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 a site:linkedin.com/in/ "company name" Google search, so coverage isn't limited to whatever a single page renders.
  • Logged-out fetch only — no li_at session cookie, no login flow, no account credentials anywhere in the request path.
  • Genuine public-contact extractionpublicContactLinks is scoped to the exact data-section="websites" block LinkedIn server-renders on a profile's public page, decoded through LinkedIn's own /redir/redirect?url= wrapper, and classified into website, twitter, github, youtube, instagram, facebook, medium, behance, dribbble, stackoverflow, or calendly. 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 normalizationcrmContactCard packages fullName, jobTitle, company, companyUrl, profileUrl, location, personalWebsite, twitterUrl, source, and scrapedAt into one importable object, built entirely from fields already on the row.
  • Backward-compatible base fieldscompany_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_elements are 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.

ParameterRequiredTypeDescriptionExample Value
companyUrlsOrKeywordsNoarray (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"]
maxContactsPerCompanyNointegerCap on employee contact cards discovered and built per company (1–10,000). Also accepts the base actor's max_employees key. Default 10.50
includePublicContactLinksNobooleanScan each already-fetched profile page for genuinely displayed public contact/social links and populate publicContactLinks. Default true.true
includeCrmContactCardNobooleanBuild the normalized crmContactCard outreach object on every row. Default true.true
onlyWithContactLinkNobooleanSkip rows entirely when no public contact/social link was found. Default false.false
proxyConfigurationNoobject (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 URLhttps://www.linkedin.com/company/google — parsed by matching /company/<slug> and normalized to a canonical company URL.
  • Bare company slugopenai — a value with no linkedin.com and no slash is treated directly as a company slug and expanded to https://www.linkedin.com/company/openai.
  • Plain company-name keywordAnthropic — when the entry can't be resolved as a company URL or slug, it's treated as a keyword and run through the site: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
}

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

StrategyBest forRun patternOutput format
Real-time enrichmentPer-record CRM/ATS lookupsSingle-company run, on demandcrmContactCard per row → CRM write
Scheduled monitoringTracking roster/contact-link changesRecurring scheduled run, diffedprofile_url / hasPublicContactInfo delta
Bulk dataset buildResearch or lead datasets at scaleParallel runs across company batchesDataset export → CSV/JSON

Other Scrapio LinkedIn scrapers

Scraper NameWhat it extracts
LinkedIn Company About Scraper : Similar Companies & AffiliatesCompany About page plus similar and affiliated companies
LinkedIn Post Scraper By KeywordCompany/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 FinderBusiness emails and phone numbers via Google search patterns
LinkedIn Scraper: Posts, Reactions, Comments & EngagementCompany post reactions, comments, and engagement analytics

Cross-platform contact/lead scrapers

Scraper NameWhat it extracts
Instagram Profile Scraper With Bio Link & Email ExtractionInstagram bio links and emails
Facebook User Search Scraper With Lead & Contact EnrichmentFacebook user search results with contact enrichment
Extract Emails Contacts Socials: Verified Phone & Email ListEmails, phones, and social links from any website

Complementary adjacent tools

Scraper NameWhat it extracts
Facebook Page Posts Scraper With Lead & Contact ListFacebook 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 ApifyClient
import csv
client = 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.

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.