# LinkedIn Company Scraper (`lightmoon/linkedin-company-scraper`) Actor

Scrape LinkedIn company pages to CSV, Excel or JSON: website, industry, size, employee count, headquarters address, founded year and followers. From $1.35 per 1,000 companies. Build lead lists, enrich a CRM or size a market by country. No account, no cookies.

- **URL**: https://apify.com/lightmoon/linkedin-company-scraper.md
- **Developed by:** [Stable](https://apify.com/lightmoon) (community)
- **Categories:** Business, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.35 / 1,000 companies

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

Paste a list of LinkedIn company pages and get back a table: website, industry,
size, employee count, headquarters address, founding year, followers — and the
company's recent posts if you want them.

No LinkedIn account. No cookie, session or password. One request per company.

> **Unofficial.** This Actor is not affiliated with, endorsed by or sponsored by LinkedIn or Microsoft. It reads only publicly available pages, does not log in and does not bypass any access control. All product names and trademarks belong to their respective owners.

### One row, from a real run

```json
{
  "slug": "stripe",
  "name": "Stripe",
  "linkedinUrl": "https://www.linkedin.com/company/stripe",
  "website": "https://stripe.com",
  "tagline": "Help increase the GDP of the internet.",
  "description": "Stripe builds programmable financial services. Millions of companies…",
  "industry": "Technology, Information and Internet",
  "companySize": "5,001-10,000 employees",
  "employeesOnLinkedIn": 17085,
  "followers": 1648475,
  "founded": "2010",
  "companyType": "Privately Held",
  "headquarters": "South San Francisco, California",
  "addressStreet": "354 Oyster Point Blvd",
  "addressCity": "South San Francisco",
  "addressRegion": "California",
  "addressPostalCode": "94080",
  "addressCountry": "US",
  "logo": "https://media.licdn.com/dms/image/v2/…/company-logo_200_200",
  "postsAvailable": 5,
  "scrapedAt": "2026-08-22T09:14:00+00:00"
}
```

**21 fields on every company**, 23 with posts switched on.

### Two employee numbers, and they are different facts

LinkedIn shows a **size band the company chose for itself** and, separately, the
**number of LinkedIn members who list it as their employer**. For Stripe that is
`5,001-10,000 employees` and `17,085`. Both are in every row, named apart, and
neither is turned into the other — a midpoint we invented would be our number,
not LinkedIn's.

Filter on the member count when you want companies of a real working size;
read the band when you want what the company says about itself.

### How complete the data is

Measured over ten company pages that answered, from four countries, picked to be
awkward on purpose — European, Central Asian, a consumer brand, a small firm:

| Field | Present on |
|---|---|
| Name, website, followers | **100%** |
| Industry, size band, headquarters, company type, description, logo | **90%** |
| Employee count on LinkedIn | **90%** |
| Street address | 80% |
| Recent posts | 80% |
| Founding year | 70% |
| Tagline | 60% |

Fields that are absent come back absent, not blank — an empty column you sort by
is worse than a missing one you can ask about.

### What it is for

**Lead lists.** Website, industry, size and country in one table, ready for
outreach. Add *Only companies that publish a website* and the dead ends are gone
before you see them.

**CRM enrichment.** Feed the LinkedIn URLs you already hold; get back the size,
the address and the founding year to fill the gaps.

**Market sizing.** One run per country or industry, then count. `companySize`
gives the band, `employeesOnLinkedIn` gives the headcount signal, `followers`
gives the audience.

**Watching accounts.** Switch posts on and you have what each target company has
been announcing, with dates, next to its profile.

### Limits, stated plainly

- **A company's name is not always its address.** Back Market lives at
  `back-market`; `backmarket` is a 404. Copy the part of the URL after
  `/company/`. Addresses that do not resolve come back in the run summary as a
  list you can fix — and they are never charged for.
- **No employee list.** The people who work at a company are behind the LinkedIn
  login, and this listing does not go there. What you get is the *count*, not
  the names.
- **No phone numbers.** LinkedIn's public company page does not carry one.
- **Search is not included.** This reads the companies you name. It does not
  find companies matching a query.
- **Free Apify plan:** works. The size of a run is limited by your own Apify
  usage, not by this actor.

### What it costs

Pay per event, and there is one paid event: **a company stored**.

| | GOLD per 1,000 |
|---|---|
| **Company** | **$1.35** |

**You are not billed for:** an address that turned out not to be a company page,
a company dropped by any of the filters, or a duplicate line in your list.

- A 500-company list: **$0.68**.
- A 5,000-company list: **$6.75**.
- Apify's $5 of monthly free credit: about **1,600 companies**.

One company is one request, and a hundred of them finish in a couple of minutes.

### Every run explains itself

Each run writes a `RUN_SUMMARY` next to the dataset: companies stored and
charged, addresses that were not company pages, entries that could not be read,
which filter dropped how many, traffic used, and whether LinkedIn slowed the run
down at any point.

An empty dataset always says why it is empty.

### Questions

**Do I need a LinkedIn account or cookies?** No. This reads the public company
page LinkedIn serves to a visitor who is not signed in.

**Can I get the employees of a company?** No — that is behind the login. You get
how many there are, not who they are.

**Why do the two employee numbers disagree?** Because they measure different
things: one is the band the company selected, the other counts members who list
that company as their employer. Both are useful; neither is a mistake.

**Can I paste a company's name instead of its LinkedIn address?** No, and the
run will tell you so rather than guessing: a wrong guess produces a 404 that
looks like a missing company.

**How fresh is the data?** Fetched when you press Start. Nothing is cached.

# Actor input Schema

## `companies` (type: `array`):

One per line: `https://www.linkedin.com/company/stripe/`, `linkedin.com/company/stripe`, or just `stripe`. **A company's name is not always its address** — Back Market lives at `back-market`. Open the company on LinkedIn and copy the part of the URL after /company/.

## `maxCompanies` (type: `integer`):

0 means no limit. Free-plan runs are capped by your own Apify usage, so start small.

## `includePosts` (type: `boolean`):

The posts arrive on the same page, so they cost no extra request and nothing extra to you. They are off by default only because they are long: a lead list is easier to read without them.

## `maxPostsPerCompany` (type: `integer`):

How many of the most recent posts to keep when the switch above is on.

## `minEmployees` (type: `integer`):

Counted as the number of LinkedIn members who list the company as their employer — not the size band the company chose for itself. Both are in every row. A company with no member count is not treated as zero: it is skipped and reported separately.

## `maxEmployees` (type: `integer`):

Leave empty for no upper bound. Same counter as the field above — LinkedIn members who list the company as their employer.

## `industries` (type: `array`):

Matched as text against the industry LinkedIn shows — `software`, `manufacturing`, `financial`. One per line; a company matching any line is kept.

## `countries` (type: `array`):

Two-letter country codes as LinkedIn writes them in the address: `DE`, `US`, `GB`.

## `onlyWithWebsite` (type: `boolean`):

Useful when the output feeds outreach: a company with no site on LinkedIn is usually a dead end.

## Actor input object example

```json
{
  "companies": [
    "stripe",
    "https://www.linkedin.com/company/figma/"
  ],
  "maxCompanies": 100,
  "includePosts": false,
  "maxPostsPerCompany": 5,
  "minEmployees": 50,
  "maxEmployees": 500,
  "industries": [
    "software",
    "financial services"
  ],
  "countries": [
    "DE",
    "AT"
  ],
  "onlyWithWebsite": false
}
```

# Actor output Schema

## `companies` (type: `string`):

No description

## `addresses` (type: `string`):

No description

## `profile` (type: `string`):

No description

## `posts` (type: `string`):

No description

## `all` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "companies": [
        "stripe",
        "monzo-bank"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lightmoon/linkedin-company-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "companies": [
        "stripe",
        "monzo-bank",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("lightmoon/linkedin-company-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companies": [
    "stripe",
    "monzo-bank"
  ]
}' |
apify call lightmoon/linkedin-company-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lightmoon/linkedin-company-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/k72hFGxSRpxRXxeJh/builds/lhTLob0dUG5sNEU4Z/openapi.json
