# LinkedIn Company Scraper - Employees, Followers & Posts (`eiv/linkedin-company-scraper`) Actor

Scrape LinkedIn company pages by URL, name, website domain or ID: followers, employee count, size, industry, HQ and every office address, website, specialties, latest posts with engagement, similar companies and open jobs. No login or cookies. $2 per 1,000 companies.

- **URL**: https://apify.com/eiv/linkedin-company-scraper.md
- **Developed by:** [Eimantas V](https://apify.com/eiv) (community)
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 company scrapeds

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**LinkedIn Company Scraper** extracts company profiles from **LinkedIn**: followers, employee count, company size, industry, head office and every office address, website, specialties, founding year, the latest posts with reactions and comments, and similar companies. Paste LinkedIn company URLs, company names, website domains or LinkedIn company IDs, and get one clean row per company. No login, no cookies, no browser, from **$1.50 per 1,000 companies**.

```json
{
    "name": "Apify",
    "linkedinUrl": "https://www.linkedin.com/company/apify/",
    "companyId": "10608457",
    "industry": "Technology, Information and Internet",
    "companySize": "201-500 employees",
    "employeeCount": 274,
    "followerCount": 41613,
    "headquarters": "Prague",
    "hqCountryCode": "CZ",
    "website": "https://apify.com/",
    "foundedYear": 2016,
    "lastPostAt": "2026-10-11T08:23:58.905Z",
    "postsPerMonth": 74.9,
    "avgPostReactions": 24
}
```

**Benchmark: 116 companies in 73 seconds, one request per company, nothing failed except a mistyped URL.**

### What does LinkedIn Company Scraper do?

It opens the public LinkedIn page of each company you list and returns everything LinkedIn shows logged-out visitors, as structured data ready for a CRM, a spreadsheet or an AI agent. Sales and recruiting teams use it to enrich lead lists with firmographics; analysts use it to track competitors' followers, headcount, offices and posting activity; growth teams use the similar-companies option to build lookalike lists.

- **Any input you have.** LinkedIn company URLs (any country version), vanity names like `stripe`, company names like `Ernst & Young`, website domains like `hubspot.com` (the Actor finds the LinkedIn page the website links to) or numeric LinkedIn company IDs.
- **Firmographics in one row.** Exact follower and employee counts, size range as numbers, industry, type, founding year, specialties, website domain and the head office split into street, city, region, postal code and country.
- **Every office.** All locations the company lists (Microsoft has 45), head office marked, with map links. The **Offices** view gives one row per office.
- **Activity and hiring signals.** The latest posts with exact publish times, reactions and comments, plus posting rate, average engagement and, if you want it, the number of open jobs on LinkedIn.
- **Lookalike companies.** LinkedIn's "Similar pages" and affiliated pages come with every company. Turn on **Also scrape similar companies** to scrape them too and grow a list of competitors or leads.
- **Only pay for results.** Companies that do not exist, inputs that need a login, and a second input naming a company already returned get an uncharged error row.
- **Built for automation.** Run it on a schedule, call it from the API, or connect it to Make, Zapier, n8n, Google Sheets or an AI agent through Apify's MCP server.

### Why it is fast and cheap

LinkedIn renders company pages on its server for visitors who are not logged in, so one ordinary web request returns the whole profile: no browser, no login, no cookies of yours. The Actor reads LinkedIn's own structured page data, spreads requests over Apify's addresses, and slows down by itself when LinkedIn asks it to, so a long list does not stall and there is no proxy to configure.

### What data can you extract from LinkedIn?

| Field | Example | What it is |
|---|---|---|
| `name` | `Stripe` | Company name |
| `linkedinUrl` | `https://www.linkedin.com/company/stripe/` | The company's LinkedIn page |
| `companyId` | `2135371` | LinkedIn's numeric company ID |
| `tagline`, `description` | `Help increase the GDP of the internet.` | Slogan and About text |
| `website`, `websiteDomain` | `https://stripe.com`, `stripe.com` | Website, and its domain for CRM matching |
| `industry` | `Technology, Information and Internet` | LinkedIn industry |
| `companySize`, `companySizeMin`, `companySizeMax` | `5,001-10,000 employees`, `5001`, `10000` | Size range, also as numbers |
| `employeeCount` | `16694` | Members who list the company as their employer |
| `followerCount` | `1762106` | Exact LinkedIn followers |
| `headquarters`, `hqStreet`, `hqCity`, `hqRegion`, `hqPostalCode`, `hqCountryCode` | `South San Francisco`, `US` | Head office, split into parts |
| `companyType`, `foundedYear` | `Privately Held`, `2010` | Organization type and founding year |
| `specialties` | `["Payments", "Fintech"]` | Listed specialties |
| `logoUrl`, `coverImageUrl` | image URLs | Logo and banner |
| `locations`, `locationCount` | 14 offices | Every office with address parts and a map link |
| `products` | `[{"name": "Apify", "category": "Marketplace Platforms"}]` | Products listed on LinkedIn |
| `recentPosts` | text, `publishedAt`, `reactions`, `comments`, `mediaType` | The latest posts (up to 10) |
| `lastPostAt`, `postsPerMonth`, `avgPostReactions`, `avgPostComments`, `engagementRate` | `2026-10-09T18:46:46Z`, `12.4` | Activity and engagement, computed from the posts |
| `similarCompanies`, `affiliatedCompanies` | `[{"name": "n8n", "industry": "Software Development"}]` | LinkedIn's similar pages, and subsidiaries/brands |
| `employees` | `[{"name": "...", "headline": "..."}]` | Optional: the few employees LinkedIn shows on the page |
| `openJobs`, `openJobsText`, `jobsUrl` | `412`, `"412"` | Optional: open jobs on LinkedIn, and the job search link |
| `input` | `hubspot.com` | What you entered, so rows join back to your list |
| `similarTo` | LinkedIn URL | For similar companies: which of your companies listed it |

### How to scrape LinkedIn company data

1. Click **Try for free** and paste your companies into **Companies**, one per line: URLs, names, domains or IDs, mixed as you like.
2. Set **Max companies**. You pay per company, so this is also your cost cap.
3. Turn on the extras you want: latest posts (5 by default), employee previews, the open jobs count, similar companies.
4. Click **Start**. A typical list runs at about 1.5 companies per second; 1,000 companies take around 10 minutes.
5. Open the **Output** tab (views: Overview, Firmographics, Posts and hiring, Offices, Similar companies), or download JSON, CSV, Excel or HTML.

### How much does it cost to scrape LinkedIn companies?

You pay per company returned, and the price drops on higher Apify plans:

| Apify plan | Per 1,000 companies |
|---|---|
| Free | $2.50 |
| Starter | $2.00 |
| Scale | $1.70 |
| Business | $1.50 |

- 1,000 companies on the Starter plan cost **$2.00**, posts, offices and similar companies included.
- 10,000 companies on the Business plan cost **$15**, with the open jobs count and employee previews at no extra charge.
- A run also costs **$0.00005** to start. Name and domain lookups are included in the company's price.
- Never charged: companies that are not found, school pages (login only), rate-limited inputs, and a second input that names a company already returned in the same run.
- The Free plan's $5 monthly credit covers about **2,000 companies**.

### Input

```json
{
    "targets": [
        "https://www.linkedin.com/company/stripe",
        "notionhq",
        "Ernst & Young",
        "hubspot.com",
        "1035"
    ],
    "maxItems": 1000,
    "maxPostsPerCompany": 5,
    "includeEmployees": false,
    "includeJobCount": true,
    "expandSimilarCompanies": false
}
```

| Field | Default | Notes |
|---|---|---|
| Companies | Apify and Microsoft (example) | URLs, vanity names, company names, website domains or company IDs, one per line |
| Max companies | 10,000 | Total, similar companies included: your cost cap |
| Latest posts per company | 5 | 0-10; the activity fields always use all posts LinkedIn shows |
| Include employee previews | off | The few employees on the page; personal data, so off by default |
| Include open jobs count | off | One extra request per company, no extra charge |
| Also scrape similar companies | off | Up to 10 per company, one level deep, each charged as a company |
| Concurrency | 6 | The Actor slows down by itself when LinkedIn rate-limits |

#### How names and domains are matched

- A **website domain** is matched through the LinkedIn link on the company's own homepage. If the site has none, the Actor searches LinkedIn for the name and keeps only a company whose LinkedIn website is that domain.
- A **company name** goes to LinkedIn's own company search: an exact name wins, otherwise LinkedIn's top suggestion, which knows brands and former names ("Ernst & Young" returns EY). The log says when a name matched a different spelling; check `name` in the results, or use URLs for exact control.
- A **single word** such as `stripe` is tried as a vanity name first, then searched as a name.

### Output

Each company is one row in the dataset. The **Overview** view shows the key columns; every export includes all fields.

```json
{
    "recordType": "company",
    "input": "https://www.linkedin.com/company/apify",
    "name": "Apify",
    "linkedinUrl": "https://www.linkedin.com/company/apify/",
    "companyId": "10608457",
    "universalName": "apify",
    "pageType": "company",
    "tagline": "Thousands of Actors to automate your business, get real-time web data, and equip your AI agents.",
    "website": "https://apify.com/",
    "websiteDomain": "apify.com",
    "industry": "Technology, Information and Internet",
    "companySize": "201-500 employees",
    "companySizeMin": 201,
    "companySizeMax": 500,
    "employeeCount": 274,
    "followerCount": 41613,
    "headquarters": "Prague",
    "hqStreet": "Vodickova 704/36",
    "hqCity": "Prague",
    "hqPostalCode": "11100",
    "hqCountryCode": "CZ",
    "companyType": "Privately Held",
    "foundedYear": 2016,
    "specialties": ["Web scraping", "Browser automation", "AI agents", "API integration"],
    "locationCount": 2,
    "locations": [
        { "isHeadquarters": true, "address": "Vodickova 704/36, Prague, 11100, CZ", "street": "Vodickova 704/36", "city": "Prague", "region": null, "postalCode": "11100", "countryCode": "CZ", "mapsUrl": "https://www.bing.com/maps?where=Vodickova+704%2F36+Prague+11100+CZ" }
    ],
    "lastPostAt": "2026-10-11T08:23:58.905Z",
    "postsPerMonth": 74.9,
    "avgPostReactions": 24,
    "avgPostComments": 2,
    "engagementRate": 0.0625,
    "recentPosts": [
        { "postId": "7514964000107831296", "url": "https://www.linkedin.com/posts/apify_agents-do-their-best-work-with-the-right-activity-7514964000107831296-T5FE", "text": "Agents do their best work with the right tools...", "publishedAt": "2026-10-11T08:23:58.905Z", "reactions": 9, "comments": 0, "mediaType": "image", "linkUrl": null, "linkTitle": null }
    ],
    "similarCompanies": [
        { "name": "n8n", "linkedinUrl": "https://www.linkedin.com/company/n8n/", "universalName": "n8n", "industry": "Software Development", "location": "Berlin, BE" }
    ],
    "jobsUrl": "https://www.linkedin.com/jobs/search?f_C=10608457&geoId=92000000",
    "similarTo": null,
    "scrapedAt": "2026-10-12T06:58:39.160Z"
}
```

An input that cannot be read becomes a row with `"recordType": "error"` and an `errorCode` instead of failing the whole run:

| `errorCode` | Meaning |
|---|---|
| `NOT_FOUND` | No LinkedIn page at that URL, no company with that name, or no LinkedIn page for that domain |
| `DUPLICATE` | Another input already returned the same company (e.g. its URL and its domain); returned and charged once |
| `LOGIN_REQUIRED` | A school (university) page: LinkedIn shows those only to signed-in members |
| `RATE_LIMITED` / `BLOCKED` | LinkedIn refused every address the run tried; run it again later |

Error rows are never charged.

### Tips and limits

- **URLs are the fastest and most exact input.** Names and domains cost one or two extra lookups (not extra charges) and depend on LinkedIn's search and the company's website.
- **Similar companies are a quick way to build lead lists:** 30 companies with the option on returned 116 companies in about a minute.
- **What logged-out LinkedIn does not show:** funding rounds, phone numbers, the full employee list, the complete post history and school pages. The Actor returns what the public page shows, including the latest posts (up to 10).
- **Open jobs** are LinkedIn's count, exact below its display cap ("2,000+" for the largest employers; `openJobs` is then 2000).
- **Hit your spending limit?** The run stops cleanly at your maximum cost per run and keeps everything it collected. Raise the limit in the run options to get more.

### FAQ

#### Is it legal to scrape LinkedIn company pages?

This Actor collects only data that LinkedIn shows publicly on company pages, without logging in. Company data is not personal data, but post texts and the optional employee previews can contain it, which laws such as the GDPR protect: process it only for a legitimate purpose, and ask a lawyer if you are unsure. LinkedIn is a trademark of LinkedIn Corporation; this Actor is not affiliated with or endorsed by LinkedIn.

#### Do I need a LinkedIn account or cookies?

No. Nothing is logged in and no account of yours is used, so there is nothing to get restricted.

#### Can I use it through the API or with Make, Zapier and n8n?

Yes. Every run can be started through the [Apify API](https://docs.apify.com/api/v2) and returns the dataset as JSON, CSV or Excel. Schedules, webhooks and integrations for Make, Zapier, n8n and Google Sheets are on the **Integrations** tab. Feed the URLs from another Actor's dataset into **Start URLs**.

#### Can AI agents use it?

Yes. Agents connected to [Apify's MCP server](https://mcp.apify.com) can find and run this Actor as a tool, with the same per-company pricing. Names and domains as input make it easy for an agent to look up a company it only knows by name or website.

#### Why did I get fewer companies than I entered?

Check the error rows: a mistyped URL or name returns `NOT_FOUND`, and two inputs for the same company return it once (`DUPLICATE`). Otherwise the run reached **Max companies**, your maximum cost per run, or its timeout; the log says which, and nothing collected before that is lost.

### Related scrapers

- [LinkedIn Jobs Scraper - Salaries, Applicants & Companies](https://apify.com/eiv/linkedin-jobs-scraper): every open job of these companies, with salaries and applicant counts.
- [LinkedIn Ad Library Scraper - Ads, Impressions & Targeting](https://apify.com/eiv/linkedin-ad-library-scraper): the ads a company runs on LinkedIn, with impressions and targeting.
- [Company Job Postings & Hiring Signals Scraper](https://apify.com/eiv/company-jobs-scraper): open roles straight from companies' own job boards (Greenhouse, Lever, Ashby and more).
- [Website Tech Stack & Lead Enrichment Scraper](https://apify.com/eiv/website-intelligence-scraper): the technologies and contact details behind each company's website.

### Support

Missing a field, or found a company that does not work? Open an issue on the **Issues** tab with the input you used, and it will be looked at quickly.

# Actor input Schema

## `targets` (type: `array`):

One per line, in any of these forms: a LinkedIn company or showcase page URL (linkedin.com/company/stripe), a vanity name (stripe), a company name (Stripe), a website domain (stripe.com: the Actor finds the LinkedIn page the website links to) or a LinkedIn company id (2135371). Names and domains take one or two extra lookups; only the company itself is charged.

## `startUrls` (type: `array`):

The same companies in the URL-list shape other Actors output, so a previous Actor's results (for example LinkedIn job or company URLs) can be fed straight in. Use this or the field above.

## `maxItems` (type: `integer`):

Stop after this many companies in total, including similar companies when that option is on. You pay per company, so this is also your cost cap for the run.

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

How many of the company's latest posts to include, with text, date, reactions, comments and media type. LinkedIn shows logged-out visitors up to 10. Free: they come with the company page. The posting-rate and engagement fields always use every post shown. 0 leaves the posts out.

## `includeEmployees` (type: `boolean`):

Add the few employees LinkedIn shows on the company page (name, headline, profile URL). Free: same page. Off by default because it is personal data; turn it on only if you have a lawful reason to process it.

## `includeJobCount` (type: `boolean`):

Add how many jobs the company has open on LinkedIn (a hiring signal), from LinkedIn's public job search. One extra request per company, no extra charge. LinkedIn shows exact counts up to its display cap, then e.g. "2,000+".

## `expandSimilarCompanies` (type: `boolean`):

After your companies, also scrape the companies LinkedIn lists under "Similar pages" on each of them (up to 10 each, one level deep): a quick way to grow a list of competitors or lookalike leads. Each one is a normal charged result; "Max companies" caps the total.

## `maxConcurrency` (type: `integer`):

How many companies are fetched at the same time. The Actor spreads requests over several addresses and slows down by itself when LinkedIn rate-limits, so the default rarely needs changing.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for one response before giving up on it.

## `maxRetries` (type: `integer`):

Retries for dropped connections and server errors on one address. Refusals from LinkedIn move to another address instead. Timeouts are not retried.

## Actor input object example

```json
{
  "targets": [
    "https://www.linkedin.com/company/apify",
    "https://www.linkedin.com/company/microsoft"
  ],
  "maxItems": 10000,
  "maxPostsPerCompany": 5,
  "includeEmployees": false,
  "includeJobCount": false,
  "expandSimilarCompanies": false,
  "maxConcurrency": 6,
  "requestTimeoutSecs": 30,
  "maxRetries": 2
}
```

# Actor output Schema

## `results` (type: `string`):

One row per company (recordType "company"), plus one uncharged row per input that could not be read (recordType "error").

## `firmographics` (type: `string`):

Type, founding year, size range, employee count, industry, specialties, domain and head office address per company.

## `offices` (type: `string`):

One row per office location, head office marked.

## `summary` (type: `string`):

Totals for the run: inputs, companies, failures, why it stopped, requests, megabytes and which addresses answered.

# 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 = {
    "targets": [
        "https://www.linkedin.com/company/apify",
        "https://www.linkedin.com/company/microsoft"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("eiv/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 = { "targets": [
        "https://www.linkedin.com/company/apify",
        "https://www.linkedin.com/company/microsoft",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("eiv/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 '{
  "targets": [
    "https://www.linkedin.com/company/apify",
    "https://www.linkedin.com/company/microsoft"
  ]
}' |
apify call eiv/linkedin-company-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,eiv/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/ccMHTbooeLd63nyKz/builds/89wBiSDPjfcHdSEae/openapi.json
