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

The LinkedIn Company Scraper turns company slugs or profile URLs into full firmographic records — exact employee headcount, followers, industry, size, type, founded year, headquarters, website and About text, plus open-role counts and similar pages — ideal for lead enrichment and market mapping.

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

## Pricing

from $2.00 / 1,000 company profiles

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/platform/actors/running/actors-in-store#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

### 🚀 LinkedIn Company Scraper

Turn a list of company names into complete firmographic records. Export to JSON, CSV or Excel.

Give it `stripe`, `vercel`, or any LinkedIn company profile URL, and it returns the full public profile — exact headcount, followers, industry, size, type, founding year, headquarters, website, specialties and About text — plus how many roles that company has open **right now**, and the similar and affiliated pages LinkedIn links to.

Built for lead enrichment, CRM hygiene, market mapping and account research.

### ✨ Features

- **The real employee count, not the band.** Everyone else parses the self-reported `"501-1,000 employees"` range. This scraper also returns the exact number LinkedIn counts today: **Stripe 17,030** against a published band of 5,001–10,000, **Vercel 1,012** against 501–1,000, **Microsoft 233,262**. You get both — the band for filtering, the real figure for scoring.
- **Live hiring signal on every row.** `openRoles` is how many jobs that company has advertised on LinkedIn worldwide at the moment you scrape — Stripe **901**, Vercel **113**, and a genuine **0** when a company isn't hiring. Nothing else in this category returns it, and "is this account growing" is usually the whole reason you're enriching.
- **Worldwide, not wherever the server sits.** Job counts are searched globally on purpose. A US-scoped count reports Stripe at 567 instead of 901, and Vercel at 99 instead of 113.
- **Similar and affiliated pages.** Every row carries the companies LinkedIn itself lists as similar — name, URL, slug, industry and location — so one run of known accounts becomes a lookalike list. Affiliated pages surface subsidiaries and showcase pages: Microsoft returns **47** of them, Vercel 4.
- **Showcase pages work too.** `linkedin.com/showcase/microsoft-azure` is accepted exactly like a company page.
- **Slugs or URLs, mixed freely.** `stripe`, `linkedin.com/company/stripe`, or `https://fr.linkedin.com/company/stripe/about/` — all one company, and duplicates are charged once.
- **Nulls are real.** A company with no logo gets `null`, not LinkedIn's grey placeholder. A company with no listed website gets `null`, not a guess. Nothing is invented to fill a column.
- **Tells you when a company can't be found.** A misspelled slug is named in the log and in `RUN_SUMMARY`, never silently dropped. If every company fails, the run fails loudly instead of reporting an empty success.
- **No proxy needed.** Runs clean without one; proxy support is there as a fallback for high volume, not a requirement.

### 🛠️ How It Works

1. **Enter companies** — a slug (`stripe`) or a profile URL (`https://www.linkedin.com/company/stripe`). The slug is the part of the URL after `/company/`.
2. **Run it.** Each company is fetched, parsed, and checked for open roles.
3. **Export** to JSON, CSV, Excel, or pull from the API.

That's the whole configuration. There's nothing to tune, because everything on the page comes back on every row.

### 📋 Output Fields

#### Identity

| Field            | Description                                                                         |
| ---------------- | ----------------------------------------------------------------------------------- |
| `companyName`    | Company name as shown on LinkedIn                                                   |
| `companySlug`    | The identifier in the profile URL — stable join key across runs                     |
| `companyId`      | Numeric LinkedIn organization ID                                                    |
| `companyUrl`     | Canonical profile URL, normalised so locale subdomains don't split a company in two |
| `companyLogo`    | Logo image URL, or `null` when the company has no logo                              |
| `companyTagline` | The one-line tagline under the company name                                         |

#### Firmographics

| Field                        | Description                                                     |
| ---------------------------- | --------------------------------------------------------------- |
| `companyEmployeesOnLinkedIn` | **Exact** employees LinkedIn counts on the profile today        |
| `companySize`                | Self-reported band, e.g. "5,001-10,000 employees"               |
| `companyEmployeeCount`       | Upper bound of that band, as a number, for sorting              |
| `companyFollowers`           | LinkedIn follower count                                         |
| `companyIndustry`            | Industry, e.g. "Software Development"                           |
| `companyType`                | Public Company, Privately Held, Nonprofit, ...                  |
| `companyFounded`             | Year founded                                                    |
| `companyHeadquarters`        | Headquarters location                                           |
| `companyWebsite`             | The company's own website, unwrapped from LinkedIn's redirector |
| `companySpecialties`         | Specialties the company lists                                   |
| `companyDescription`         | Full About text                                                 |

#### Hiring signal

| Field                   | Description                                                                 |
| ----------------------- | --------------------------------------------------------------------------- |
| `openRoles`             | Roles open on LinkedIn right now, worldwide. `0` means genuinely not hiring |
| `openRolesIsLowerBound` | `true` when LinkedIn reported "1,000+", so `openRoles` is a floor           |
| `companyJobsUrl`        | Direct link to those roles                                                  |

#### Related companies

| Field             | Description                                                                                       |
| ----------------- | ------------------------------------------------------------------------------------------------- |
| `similarPages`    | Companies LinkedIn lists as similar — `name`, `companyUrl`, `companySlug`, `industry`, `location` |
| `affiliatedPages` | Showcase pages and subsidiaries, in the same shape                                                |

Plus `scrapedAt`, an ISO 8601 timestamp on every row. Fields with no data are `null`, never invented.

### 📊 Sample Output Data

```json
{
    "companyName": "Vercel",
    "companySlug": "vercel",
    "companyId": "16181286",
    "companyUrl": "https://www.linkedin.com/company/vercel",
    "companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQHsF1EIN5BnIw/company-logo_200_200/vercel_logo",
    "companyTagline": "Agentic Infrastructure for every app and agent. Creators of AI SDK, Next.js, Turborepo, and v0.",
    "companyDescription": "Vercel is the platform where humans and AI agents build, ship, and scale software together…",
    "companyIndustry": "Software Development",
    "companyWebsite": "https://vercel.com",
    "companyHeadquarters": "San Francisco, California",
    "companySize": "501-1,000 employees",
    "companyEmployeeCount": 1000,
    "companyEmployeesOnLinkedIn": 1012,
    "companyFollowers": 250192,
    "companyFounded": "2015",
    "companySpecialties": "Next.js, Developer Velocity, Open Source, Developer Experience, React, and Web Development",
    "companyType": "Privately Held",
    "openRoles": 113,
    "openRolesIsLowerBound": false,
    "companyJobsUrl": "https://www.linkedin.com/jobs/search?f_C=16181286&geoId=92000000",
    "similarPages": [
        {
            "name": "Supabase",
            "companyUrl": "https://www.linkedin.com/company/supabase",
            "companySlug": "supabase",
            "industry": "IT Services and IT Consulting",
            "location": null
        }
    ],
    "affiliatedPages": [
        {
            "name": "v0 by Vercel",
            "companyUrl": "https://www.linkedin.com/company/v0dev",
            "companySlug": "v0dev",
            "industry": "Software Development",
            "location": null
        }
    ],
    "scrapedAt": "2026-08-06T06:42:36.164Z"
}
```

### 💰 Pricing

Pay only for what you extract. **No per-run start fee**, and nothing is charged for a company that couldn't be scraped.

| Event           | Free plan | Gold plan |
| --------------- | --------- | --------- |
| Company profile | $0.004    | $0.002    |

Enriching 1,000 companies costs **$4.00** on the Free plan, **$2.00** on Gold — every field above included, nothing tiered or held back.

### ❓ FAQ

**Where do I find a company's slug?**
It's the part of the LinkedIn profile URL after `/company/`. For `https://www.linkedin.com/company/stripe`, the slug is `stripe`. You can paste the whole URL instead — it's accepted as-is.

**What's the difference between `companyEmployeesOnLinkedIn` and `companySize`?**
`companySize` is the band someone at the company typed in, sometimes years ago. `companyEmployeesOnLinkedIn` is how many people list that company as their employer today. They often disagree sharply — Stripe publishes 5,001–10,000 and counts 17,030 — and the second number is the one that moves.

**Why is `openRoles` sometimes `null` instead of a number?**
`0` means the company genuinely has nothing open. `null` means the count couldn't be read for that company — rare, and it never blocks the profile itself.

**What does `openRolesIsLowerBound: true` mean?**
LinkedIn stops counting at 1,000 and prints "1,000+" past that, without saying by how much. Rather than dress that up as a total, it's reported as the floor it is.

**Why did a company return nothing?**
Either the slug is wrong, or LinkedIn served an interstitial instead of the profile. Either way the company is named explicitly in the log and in `RUN_SUMMARY`.

**Do I need a proxy?**
No. Leave it off unless you're running at high volume and start seeing failures.

**Do I need a LinkedIn account or cookies?**
No. Only publicly visible company data is collected.

**I want the actual job listings, not just the count.**
Use the [LinkedIn Company Jobs Scraper](https://apify.com/piotrv1001/linkedin-company-jobs-scraper) for every open role at named companies, or the [LinkedIn Jobs Search Scraper](https://apify.com/piotrv1001/linkedin-jobs-search-scraper) to search by keyword across all companies.

# Actor input Schema

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

One or more companies, as a slug ("stripe") or a profile URL ("https://www.linkedin.com/company/stripe"). The slug is the part of the URL after /company/. Showcase pages work too.

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

Stop after this many companies. Anything past the limit is reported in the log rather than dropped silently.

## `proxyConfiguration` (type: `object`):

Optional. Not required — leave off unless you are running at high volume and start seeing failures.

## Actor input object example

```json
{
  "companies": [
    "stripe",
    "notionhq",
    "vercel"
  ],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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",
        "notionhq",
        "vercel"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/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",
        "notionhq",
        "vercel",
    ] }

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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",
    "notionhq",
    "vercel"
  ]
}' |
apify call piotrv1001/linkedin-company-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=piotrv1001/linkedin-company-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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