# LinkedIn Company Data — Size, Employee Count & Hiring Signals (`nick.cheng/linkedin-company-scraper`) Actor

LinkedIn company data by URL or name: industry, company size, employee count on LinkedIn, followers, HQ, website, founded, specialties — plus the latest job openings as a hiring signal. Bulk lists from CSV or Google Sheets. No login, no cookies. $0.004 per company on every plan.

- **URL**: https://apify.com/nick.cheng/linkedin-company-scraper.md
- **Developed by:** [Nicholas Cheng](https://apify.com/nick.cheng) (community)
- **Categories:** Lead generation, Business, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 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

**Give it LinkedIn company pages or names, get company data back — plus who they are hiring.** Industry, size bracket, employees on LinkedIn, followers, headquarters, website, company type, founded year, specialties, logo, and LinkedIn's numeric company ID. Tick `includeJobs` for the company's latest open roles. No login, no cookies, no LinkedIn account involved.

**You are charged only for companies that came back.** A company page that does not exist produces an explanatory row and costs nothing; two inputs that land on the same company are charged once.

| | |
|---|---|
| **Input** | Company page links (`linkedin.com/company/…`, `/showcase/`, `/school/`) or names, or a CSV / Google Sheet of them |
| **Output** | One row per company, plus up to ~10 latest job openings if you ask |
| **Price** | **$0.004 per company — the same on every Apify plan**; job openings included |
| **Login** | None |

### What you get

See the field list and a real example on the [LinkedIn Company & Profile Scraper](https://apify.com/nick.cheng/linkedin-company-profile-scraper) page — this Actor is its companies-only mode.

- `companySize` is LinkedIn's size bracket; `employeesOnLinkedIn` is how many members list the company. Different numbers, both useful.
- `companyId` survives renames; store it. Renamed companies are followed to their new page.
- `latestJobs` (with `includeJobs`): newest open roles — `title`, `location`, `postedAt`, `url`. A sample of recent postings, not a total count.

### Input

| Option | Notes |
|---|---|
| `companyUrls` | Links or names. De-duplicated |
| `includeJobs` | Also return the latest open jobs. No extra charge |
| `listUrl` | Public `.csv` / `.txt` or a Google Sheet shared as "Anyone with the link"; LinkedIn company links are read from any column |
| `maxConcurrency` | 1–5 (default 2). The Actor paces itself and backs off on its own |
| `maxItems` | Hard cap on rows |

### What this Actor cannot do

- **No company search** — LinkedIn requires login for it. You bring the links or names.
- **No employee lists** — also login-only.
- **No emails or phone numbers.**
- For public profiles of people, use the [LinkedIn Profile Scraper](https://apify.com/nick.cheng/linkedin-profile-scraper).

### How it stays working

Pages are fetched the way a logged-out browser fetches them; fields come from the structured data LinkedIn publishes on company pages. No account is involved, so nothing gets restricted. If LinkedIn pushes back on one network exit, the Actor switches exits for a while and retries the pages it was not served, slowly, at the end of the run.

# Actor input Schema

## `companyUrls` (type: `array`):

LinkedIn company pages to look up: full links (https://www.linkedin.com/company/stripe/) or just the name from the link (stripe). Showcase and school pages work too.

## `includeJobs` (type: `boolean`):

For each company, also return its latest open jobs on LinkedIn (up to about 10: title, location, posting date, link) — a hiring signal. Included in the per-company price; one extra request per company.

## `listUrl` (type: `string`):

Link to a long list: a public .csv or .txt file, or a Google Sheet shared as "Anyone with the link". LinkedIn company and profile links are read from any column; other cells are ignored.

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

How many pages are fetched at the same time (1–5). The Actor paces itself and slows down on its own when LinkedIn pushes back; pages that are not served on the first pass are retried slowly at the end.

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

Hard ceiling on rows for the whole run, companies and profiles together. Leave at 0 for no limit.

## Actor input object example

```json
{
  "companyUrls": [
    "https://www.linkedin.com/company/stripe/",
    "duolingo"
  ],
  "includeJobs": false,
  "maxConcurrency": 2,
  "maxItems": 0
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "companyUrls": [
        "https://www.linkedin.com/company/stripe/",
        "duolingo"
    ]
};

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nick.cheng/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/pJRq0qQQr2BZV0lrq/builds/3h1fghIHAkrOh463M/openapi.json
