LinkedIn Company Employees API | No Login, No Cookies avatar

LinkedIn Company Employees API | No Login, No Cookies

Pricing

from $0.01 / 1,000 employee founds

Go to Apify Store
LinkedIn Company Employees API | No Login, No Cookies

LinkedIn Company Employees API | No Login, No Cookies

LinkedIn Company Employees API: give a company name or LinkedIn URL and get the people who work there, with name, title, location and profile URL. Each person is checked against their public profile. No login, no cookies. Filter by job title and location.

Pricing

from $0.01 / 1,000 employee founds

Rating

0.0

(0)

Developer

John

John

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

2

Monthly active users

2 hours ago

Last modified

Share

LinkedIn Company Employees API | Verified Company Employee List

Get a company employee list from LinkedIn as clean JSON: the name, job title, location and profile URL of the people who work at a company, with each person checked against their public profile to confirm they still work there. Give it company names or LinkedIn company URLs. You don't need a LinkedIn account, a login or a session cookie.

It's built for the two jobs that need a list of who works where: account mapping for sales (the engineering leaders, finance team or founders at your target accounts) and talent mapping for recruiting (a competitor's team, before you start sourcing).

๐Ÿงฉ Part of the Alpha OSINT LinkedIn suite: no login, no cookies

Eight Actors that read only what LinkedIn shows to a signed-out visitor. None of them asks for your account, your password or an li_at session cookie, so none of them can get your LinkedIn account restricted. Each one takes what the previous one returns, so you can chain them into a full people-and-company workflow:

StepYou want toUse
1Find people by name, job title, company, school or location, no profile URL neededLinkedIn People Search API
2Turn profile URLs into full structured profiles: experience, education, followersLinkedIn Profile API
3Enrich the employer: industry, size, headquarters, specialties, follower countLinkedIn Company API
4List the people who work at a company, each checked against their public profileLinkedIn Company Employees API (this Actor)
5See what a company is hiring for, with salary data where LinkedIn publishes itLinkedIn Jobs API
6Search jobs as a guest with filters, total result counts and autocomplete idsLinkedIn Job Scraper
7Read what a person or company posts, with reactions, comments and sharesLinkedIn Posts API
8Map the skills people list to courses, learner reviews and full syllabiLinkedIn Learning API

A worked map of these chains, with live adoption and success-rate stats for every Actor, is at alphaosint.com/linkedin.

Get a company employee list from LinkedIn: what the API returns

One row per person, per company, so a run over twenty target accounts gives you a single LinkedIn employee list to sort, filter or load into your CRM:

  • Who they are: full name, headline, location, profile URL and profile slug.
  • Their role: current job title and employer. For a verified person, the title of the role at the company you asked about.
  • Whether they still work there: verified plus a matchReason that says how it was decided (see below).
  • The public profile, for verified people: about text, education, follower and connection counts, photo and LinkedIn member id, plus every position with dates on the few profiles whose work history LinkedIn shows to signed-out visitors.
  • Where each person came from: foundBy is the exact public search that found them, so a list can be audited and reproduced.

Each run also writes a RUN_SUMMARY record with, per company, how many people were found and verified, LinkedIn's own employee count for the company, and the coverage ratio between the two.

How to find employees of a company

There are two manual routes. The People tab on a company's page on LinkedIn lists the members who name the company as their employer, but only to signed-in members, a page at a time. A search engine query such as site:linkedin.com/in "Company Name" finds public profiles that mention the company, including people who left years ago.

This API runs the second route for you and then does the checking. It splits the search into role and city slices to reach past the first page of results, opens each person's public profile, and keeps only the people whose profile shows a current role at the company. It works like a LinkedIn employee scraper, except that with verification on, people who have moved on are dropped and never charged. The result is a list of employees at a company that you can download as JSON, CSV or Excel.

How verification works

Search results are a starting point, not proof: a person who left a company years ago still mentions it on their profile. With verifyEmployment on (the default), the API opens each person's public profile and looks for a current role at the company:

matchReasonMeaningverified
current-positionA current role on the profile links this company's LinkedIn pagetrue
current-companyThe profile's current employer links this company's pagetrue
company-nameNo link, but the current employer's name matches the company's closely. A weaker matchtrue
profile-unavailableThe public profile could not be opened, and the search result lists the company as the person's experience, so this is a search-level rownull
search-experienceNot opened, but the search result lists the company as the person's experience. Used with verifyEmployment off, and for the strongest leftovers when a company's open limit is reachednull

Profiles are opened in order of evidence: people listed on the company page first, then people whose search result reads "Experience:

Some company names are also job titles or common phrases ("AI Engineer", say), and the search then matches people who merely hold that title. Once 20 profiles have been read for a company and fewer than 10% of them work there, the API stops opening profiles for that company, returns the verified people plus the unopened people whose result lists the company as their experience, and records stoppedReason: "low match rate". Use the company's LinkedIn URL and titleKeywords for such names. A role that links a different company page with the same name (two companies called "Atlas", say) never counts as a match.

Coverage: what to expect

This API finds people through public search results for site:linkedin.com/in pages, then checks them against LinkedIn. A search returns only about ten people, so the number of searches scales with the company's size on LinkedIn: about a dozen for a company of up to 500 people (the company name plus ten role slices), and about 30 slices (roles such as engineer, account executive or head of, plus office cities) above that. Only people whose search result names the company are opened and checked. It can only find the people search engines have indexed, so it will rarely return a company's full headcount:

  • Smaller companies get the highest coverage. For a company with a few dozen people, most of the team is usually indexed.
  • Large companies return a slice. For a company with tens of thousands of employees, expect hundreds, not thousands. Narrow with titleKeywords and locations to get the slice you need, or raise maxSearchQueriesPerCompany.
  • Every run reports its own coverage against the employee count LinkedIn shows on the company page, in the run log and in RUN_SUMMARY, so you never have to guess.

There are no LinkedIn-internal filters: seniority codes, function codes, years in role and similar Sales Navigator filters are not available to a signed-out visitor. Use titleKeywords for seniority and function instead ("director", "vp", "head of", "engineer").

Use cases

  • Account mapping for sales: list the sales, marketing or engineering leaders at each of your target accounts, up to 50 companies in one run, then hand the profile URLs to your outreach tool.
  • Talent mapping for recruiting: see who is on a competitor's data team and in which cities, before you open a search.
  • Team maps: see how many engineers, designers or recruiters a company shows publicly, and where they sit.
  • Investment research: check the founding team and senior hires of a startup before a call.
  • CRM hygiene: confirm that the contacts you hold at an account still show a current role there. A contact who does not appear in a run is "not seen", which is not proof they left.

Talent mapping: see who works on a competitor's team

Talent mapping is the research a recruiter does before opening a search: who holds the roles you want to hire for, at which companies, and where they are based. Give the API the companies you recruit from, plus the titles and cities you are hiring for:

{
"companies": ["https://www.linkedin.com/company/stripe", "https://www.linkedin.com/company/intercom"],
"titleKeywords": ["data engineer", "analytics engineer"],
"locations": ["Dublin"],
"maxResultsPerCompany": 100
}

Each row gives the person's name, current title, location and profile URL, checked against their public profile, so people who have already moved on stay out of your pipeline. Treat the list as a starting map rather than a full roster: public search reaches part of a large team (see Coverage above), and LinkedIn shows work history to signed-out visitors on only a few profiles.

Account mapping: the decision makers at each target account

In sales, account mapping means knowing who you would talk to at each target account before you reach out. Put up to 50 accounts in companies and the seniority or function words you sell to in titleKeywords ("vp", "head of", "director", "procurement"). The run returns the people public search finds in those roles at each account, one row per person, with titles and profile links. It does not return reporting lines or contact details.

For a guided version inside Claude, the account mapping skill further down this page chains this API with company lookups and sorts the people it finds into role buckets for each account.

Input

FieldTypeRequiredDefaultWhat it does
companiesarray of stringsyesLinkedIn company URLs or company names, up to 50 per run
titleKeywordsarray of stringsnoemptyNarrow to these job titles, up to 20. Each one is also its own search. Empty searches built-in role slices, more for larger companies
locationsarray of stringsnoemptyReturn only people in these cities, regions or countries, up to 10. Every search names the place, and a person whose public profile shows a different location is left out. Use the place name as LinkedIn writes it (Dublin, London, United States). Empty searches everywhere
maxResultsPerCompanyintegerno100People to return per company, 1 to 1,000
verifyEmploymentbooleannotrueOpen each profile and confirm a current role. Off returns a faster, search-level list
maxSearchQueriesPerCompanyintegerno40Cap on search slices per company (1 to 100). More slices reach more of a large company
maxAgeDaysintegernoper record typeServe results fetched within this many days from the shared cache, 0 to 90. 0 always fetches fresh. Left empty, the cache keeps profiles up to 7 days, company pages up to 30 days and searches up to 1 day

Example input, the engineering and recruiting teams at two companies in Dublin:

{
"companies": ["https://www.linkedin.com/company/stripe", "Intercom"],
"titleKeywords": ["engineer", "recruiter"],
"locations": ["Dublin"],
"maxResultsPerCompany": 50,
"verifyEmployment": true
}

Example output

The examples below use a synthetic person ("Jane Doe") and a made-up company. Here is a verified row, with the about text shortened. positions and a page-read currentTitle appear only on profiles whose experience section LinkedIn shows to signed-out visitors; for most people it hides job titles, and headline and currentTitle then come from the person's search result headline:

{
"result_type": "employee",
"companyName": "Example Company",
"companySlug": "example-company",
"companyUrl": "https://www.linkedin.com/company/example-company",
"profileUrl": "https://www.linkedin.com/in/example-profile",
"slug": "example-profile",
"fullName": "Jane Doe",
"headline": "Senior Software Engineer at Example Company",
"location": "Dublin, County Dublin, Ireland",
"currentTitle": "Senior Software Engineer",
"currentCompany": "Example Company",
"verified": true,
"matchReason": "current-position",
"foundBy": "site:linkedin.com/in \"Example Company\" engineer",
"fromCache": false,
"fetched_at": "2026-10-03T11:07:28Z",
"about": "Backend engineer working on data pipelines.",
"education": [
{
"organizationName": "Example University",
"organizationUrl": "https://www.linkedin.com/school/example-university/",
"startDate": "2012",
"endDate": "2016"
}
],
"followers": 1250,
"connections": 500,
"memberId": "000000000"
}

A company that cannot be matched produces an error row. It is never charged as a person; like every stored row, it carries only the small dataset-item event:

{
"result_type": "error",
"error_type": "CompanyNotFound",
"error_message": "No LinkedIn company page matches this name. Try the company's LinkedIn URL instead.",
"requestedCompany": "Example Company That Does Not Exist",
"fetched_at": "2026-10-03T11:07:28Z"
}

Output fields

FieldTypeDescription
result_typestringemployee (one person at a requested company) or error (a company that could not be resolved or searched, never charged as a person)
companyNamestringName of the company this person was found for
companySlugstringThe company's LinkedIn handle, the last part of its company page URL
companyUrlstringThe company's public LinkedIn page
profileUrlstringPublic LinkedIn profile URL, with tracking parameters removed
slugstringThe profile's public identifier. Stable per person and a good key for removing duplicates or comparing runs
fullNamestringThe person's name as shown on their public profile or search result
headlinestringThe professional headline shown under the person's name
locationstringCity or area from the public profile, when the profile was opened
currentTitlestringJob title of the person's current role; for a verified person, the role at this company
currentCompanystringEmployer of the current role
verifiedboolean or nulltrue when the public profile confirms a current role at this company; null when the profile was not opened (verifyEmployment off, or a per-company limit was reached) or could not be opened
matchReasonstringHow employment was decided: current-position, current-company, company-name, profile-unavailable, not-checked or search-experience
foundBystringThe public search that found this person, or company-page for people listed on the company's own page
fromCachebooleantrue when the row was served from the shared result cache
fetched_atstringISO 8601 UTC timestamp of when the data behind this row was fetched
aboutstringThe person's public About text. Verified rows only
positionsarrayWork history on the public profile, with title, company, dates, location and whether it is current. Verified rows only, and only where LinkedIn shows it
educationarraySchools on the public profile, with dates where shown. Verified rows only
followersintegerFollower count on the public profile. Verified rows only
connectionsintegerConnection count on the public profile (LinkedIn caps the public number at 500). Verified rows only
photoUrlstringPublic profile photo, when the person has one. Verified rows only
memberIdstringLinkedIn's numeric member id. Verified rows only
requestedCompanystringError rows only: the company entry the row is about, exactly as given
error_typestringError rows only: CompanyNotFound, CompanyPageUnavailable, SearchUnavailable or InvalidInput
error_messagestringError rows only: why the row is an error, in plain words

Not available from public pages: email addresses, phone numbers, and anything LinkedIn shows only to signed-in members. Connection counts above 500 show as 500, LinkedIn's public cap.

Two pay-per-event charges, and you pay one or the other for a person, never both:

  • Employee verified: the person's public profile confirms a current role at the company, with their full public profile in the row.
  • Employee found: a person delivered from search alone, because checks were off, a per-company limit was reached, or the profile could not be opened. Only people whose search result lists the company as their experience. A person whose profile shows they work elsewhere is never returned or charged.

Each run also carries two small platform events: one Actor start, and one dataset item for every row stored, error rows included. Search requests and profile page reads are never charged by themselves, and people dropped as former employees produce no row and no charge. Current rates are on the Pricing tab of the Store page. Set a maximum cost per run and the API stops cleanly when it is reached.

Freshness and the shared cache

Results may be served from a shared cache when the same profile, company page or search was fetched recently: up to 7 days for profiles, 30 days for company pages and 1 day for searches. Cached rows carry fromCache: true and the original fetched_at, and are charged the same as fresh ones. Set maxAgeDays to 0 to always fetch fresh, or to a smaller number to tighten the window.

Other runs add to the shared cache all the time, so two cached runs of the same company a few minutes apart can differ by a few people. A person whose own headline says they have left ("Former ...", "Retired") is not returned, even when their profile still lists the company.

How to get started

  1. Open LinkedIn Company Employees API on Apify Store.
  2. Add one or more companies, as LinkedIn URLs or names.
  3. Optionally narrow with job titles and locations.
  4. Set maxResultsPerCompany, and keep verifyEmployment on for confirmed, full rows.
  5. Run it, then download the dataset or open the Employees view.

To call it from code, the example repo with a Python and MCP walkthrough has a quick start script and the setup steps for Claude, Cursor and other MCP clients.

View on Apify Store

Use the LinkedIn Company Employees API from Claude with MCP

Add this API as a tool in Claude Code (free trial), Claude Cowork (free trial), or any other MCP client through the hosted Apify MCP server. Your assistant can then call it as a LinkedIn scraper MCP tool whenever a question needs the people at a company:

https://mcp.apify.com/?tools=actors,docs,johnvc/linkedin-company-employees-api

Here actors and docs are the standard tool categories, and the third entry is this API. Then ask in plain language, for example "list the data engineers at Databricks in San Francisco, with their titles and profile links".

Apify's MCP integration docs: https://docs.apify.com/platform/integrations/mcp

๐Ÿ’ธ Pay per run with crypto (x402)

The LinkedIn Company Employees API supports agentic payments via the x402 protocol. AI agents and MCP clients can pay for runs in USDC (on Base) with no Apify account or API token needed: point your agent at the Apify MCP server and it can discover, pay for, and run this Actor autonomously. Read the Apify x402 announcement for details.

Agent skill: account mapping in Claude

Install a ready-made Claude skill that chains this API with the LinkedIn Company API, the LinkedIn Profile API and Apify's Google Search Results Scraper:

  • Account mapping: give it target accounts or an ideal customer profile, and it returns the current people in the roles you name at each account, sorted into role buckets with coverage per account. It collects no contact details.

Install with: npx skills add johnisanerd/claude-skill-account-mapping

๐Ÿ”Œ Integrations: keep your account and talent maps up to date

One run gives you today's list. Teams change, so put the run on a schedule and send its rows to the tools you already use. The Apify platform integrations do both without a server of your own.

Tasks and schedules: a monthly refresh

  1. Create a task. A saved task is this API plus a saved input. Make one per list you keep, for example "Target accounts: engineering leaders" with your account URLs in companies and titleKeywords set to "head of engineering" and "engineering manager".
  2. Attach a schedule. In Schedules, create a schedule with a cron expression and add your tasks to it: 0 7 1 * * runs at 7 AM on the 1st of each month, and 0 9 * * 1 runs on Mondays at 9 AM. One schedule can trigger many tasks.
  3. Compare runs. Match each run's rows on slug against the previous run to see who is newly seen at each account. Treat a person who does not appear as "not seen this run", not as "left": the list is partial, and someone can still work there without showing up in public search.

n8n, Make and Zapier

In n8n, install the community node n8n-nodes-linkedin-company-employees-api (see the n8n section below). A typical flow: a Schedule Trigger once a month, the node with your accounts and job titles, a Filter on verified, then one row per person in Google Sheets, HubSpot or Airtable. Make and Zapier run the same flow through Apify's native integrations, which have steps to run an Actor and read its dataset.

Supabase: keep a history of who you have seen

To keep every run in your own database, run the API from Python and upsert the rows into a Supabase table keyed on company and person:

from apify_client import ApifyClient
from supabase import create_client
apify = ApifyClient("YOUR_APIFY_TOKEN")
supabase = create_client("https://YOUR_PROJECT.supabase.co", "YOUR_SERVICE_ROLE_KEY")
run = apify.actor("johnvc/linkedin-company-employees-api").call(
run_input={
"companies": ["https://www.linkedin.com/company/stripe"],
"titleKeywords": ["head of", "director"],
"maxResultsPerCompany": 50,
}
)
rows = [
{
"company_slug": item["companySlug"],
"person_slug": item["slug"],
"full_name": item.get("fullName"),
"current_title": item.get("currentTitle"),
"location": item.get("location"),
"profile_url": item["profileUrl"],
"verified": item.get("verified"),
"fetched_at": item["fetched_at"],
}
for item in apify.dataset(run["defaultDatasetId"]).iterate_items()
if item["result_type"] == "employee"
]
supabase.table("company_people").upsert(rows, on_conflict="company_slug,person_slug").execute()

MCP and AI agents

Through the Apify MCP server, Claude, Cursor and other agents can run this API as a tool (setup in the MCP section above). Ask "who leads engineering at our five target accounts in London?" and the agent runs the search and answers from the rows.

Webhooks

For anything custom, an Apify webhook on ACTOR.RUN.SUCCEEDED calls your endpoint when a run finishes, for example to start lead scoring or routing in your own system.

Pair the people this API finds with the rest of the account picture:

Comparison point: some employee tools on the Store list only the people LinkedIn features on a company page, for example artificially/linkedin-employees-scraper, which its own description puts at 1 to 4 people per company. This API searches by role and city and checks each person against their public profile.

๐Ÿชข Use this from n8n

Available as an n8n community node, n8n-nodes-linkedin-company-employees-api. In n8n: Settings, Community Nodes, install n8n-nodes-linkedin-company-employees-api, then use it in any workflow (it also works as an AI Agent tool).

๐Ÿค– Ask an AI assistant about this API

Open a ready-to-send prompt about the LinkedIn Company Employees API in the AI of your choice:

Frequently asked questions

How can I find a list of employees at a company?

Add the company's LinkedIn URL or name to companies and run the API. It searches for the company's people, opens each public profile, and returns the ones whose profile shows a current role there, with title, location and profile URL. A run usually takes a few minutes.

How do I find out who works at a company?

The manual route is a search engine query such as site:linkedin.com/in "Company Name", read one result at a time. This API runs those searches for you across role and city slices, then drops anyone whose profile shows they have moved on. "How to find employees of a company" above has the details.

How can I verify that someone currently works for a company?

With verifyEmployment on, the API opens the person's public profile and looks for a current role at the company. verified: true means it found one, and matchReason says how: current-position and current-company mean the role links the company's LinkedIn page, while company-name is a weaker match on the employer's name. This is a check of what a public profile shows, not an employment verification or a background check, so do not use it for decisions about a person's hiring, credit, housing or insurance.

What is the difference between verified and found?

A verified person's public profile shows a current role at the company. A found person comes from search results without that confirmation, either because checks were off or because their profile could not be opened, and only when the search result lists the company as their experience. People whose profile shows they have moved on are never returned and never charged.

Can I find company employees without a LinkedIn account?

Yes. The API reads only LinkedIn's public pages, the same ones a signed-out visitor sees. It never asks for your account, password or session cookie.

Will LinkedIn ban you for scraping?

Your LinkedIn account is never involved: the API does not sign in and never asks for a cookie, so there is nothing of yours for LinkedIn to restrict.

Can I filter LinkedIn employees by job title, location, or seniority?

By job title and location, yes: titleKeywords narrows to roles and locations to cities, regions or countries, and each keyword and place adds its own searches. LinkedIn's internal seniority and function filters, the ones Sales Navigator uses, are not public, so use title words such as "director", "vp", "head of", "engineer" or "recruiter" instead.

How can I see all the employees of a company on LinkedIn?

Public search reaches the people search engines have indexed: most of a small team and a slice of a large one. Each run reports its coverage against LinkedIn's own employee count in the RUN_SUMMARY record. To reach more people at a big company, add titleKeywords and locations, or raise maxSearchQueriesPerCompany.

Is there a way to find out how many employees a company has?

The RUN_SUMMARY record shows the employee count LinkedIn displays on the company page, next to the number of people the run found. For company size, industry and headcount across many companies, use the LinkedIn Company API.

Is there a way to export a company's LinkedIn employee list?

Yes. Every run writes a dataset you can download as JSON, CSV or Excel, or read through the API. The Employees view is a flat table of name, title, company, location, verified flag and profile URL.

Are there free tools to find a company's employees on LinkedIn?

Apify's free plan includes monthly platform credits, which cover small runs of this API. You pay per person returned, never per search, so a test on one or two companies costs very little. Current rates are on the Pricing tab.

Does it return email addresses or phone numbers?

No. Contact details are not on LinkedIn's public pages, and this API returns only public data.

What does a company name do differently from a URL?

A URL is exact. A name is matched to its LinkedIn company page through a public search and a similarity score that also weighs follower counts, which keeps "Anthropic" from matching a same-named fund. If a name cannot be matched with confidence you get a CompanyNotFound error row, with no person charge, and can retry with the URL.

Is this an official LinkedIn API?

No. This API is not affiliated with, endorsed by, or connected to LinkedIn. It reads the public pages LinkedIn shows to signed-out visitors and is an independent tool.

Should I use an API or a web scraper to get a company employee list?

An API returns structured data from a defined endpoint, while a web scraper reads web pages and pulls the data out. LinkedIn's own developer APIs are limited to approved partners for most data, and they are not built for listing who works at another company. This Actor reads public pages the way a scraper does and hands back the result the way an API does: clean JSON rows from one call.

Can I use the LinkedIn Company Employees API from my own code?

Yes. The Apify API starts runs, schedules them and returns the dataset, and the apify-client package exists for Python and Node.js. The API tab has ready-made snippets, and the example repo has a Python quick start.

Can I use it as a LinkedIn scraper MCP tool in Claude or Cursor?

Yes. Add https://mcp.apify.com/?tools=actors,docs,johnvc/linkedin-company-employees-api to any MCP client through the hosted Apify MCP server: for example Claude Code (free trial), Claude Cowork (free trial) or Cursor. The Apify MCP docs cover setup for each client.

Can ChatGPT or Claude list a company's employees?

On their own, chat assistants answer from training data or a quick web search, which usually means a few well-known names. Connected to this API through MCP (see the previous question), the assistant runs a search for the company and answers from the rows it gets back.

Can I schedule the scraper to refresh an employee list every month?

Yes. Save your input as a task, then add it to a schedule from the Actor's Actions menu, then Schedule. 0 7 1 * * runs at 7 AM on the 1st of each month and 0 9 * * 1 on Mondays at 9 AM, and one schedule can trigger many tasks. Compare runs by slug; a person missing from one run is "not seen", not proof they left. The Integrations section above has the full recipe.

Can I integrate this LinkedIn employee scraper with other apps?

Yes. Through Apify integrations it connects to Make, Zapier, n8n, Slack, Google Sheets and more, and a webhook on ACTOR.RUN.SUCCEEDED starts your own code when a run finishes. The Integrations section above has recipes.

How else can I collect LinkedIn data for the same accounts?

Use the LinkedIn Company API for company size and industry, the LinkedIn People Search API to find people by name, school or job title across companies, and the LinkedIn Jobs API for open roles. Related Tools above lists more.


๐ŸŒ About Alpha OSINT

This Actor is part of Alpha OSINT, toolset of financial and operations data sources and APIs. See the LinkedIn Company Employees API source page for related tools and use cases. For support or requests for this actor, please start a ticket directly on our support page.

Last Updated: 2026.10.04