# LinkedIn Company Scraper & Monitor ($1/1K) (`hydedata/linkedin-company-scraper`) Actor

No login or cookies. Get LinkedIn company website, industry, size, exact employee count, HQ address, offices, followers and recent posts. Look up by URL, name or website, find companies that are hiring, add open job counts, and monitor headcount and post changes with Slack or Discord alerts.

- **URL**: https://apify.com/hydedata/linkedin-company-scraper.md
- **Developed by:** [Jacob Hyde](https://apify.com/hydedata) (community)
- **Features:** Limited permissions
- **Stats:** 10 total users, 7 monthly users, 93.6% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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.

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 & Monitor

Scrape LinkedIn company pages: website, industry, size, exact employee count, headquarters address,
every office, followers, recent posts and similar companies. No LinkedIn account, login or cookies
needed. $1 per 1,000 companies.

Start from LinkedIn URLs, **company names** or **website domains**. Or let it **find companies that
are hiring** for a job keyword in a location. Turn on **monitor mode** and schedule it to get only the
companies that changed: headcount up or down, new posts, a new tagline or HQ. It can send those
changes straight to Slack or Discord.

### What you get

For every company:

| Field | Example |
| --- | --- |
| Name, tagline and About text | Stripe, "Help increase the GDP of the internet." |
| Website and its domain | https://stripe.com, stripe.com |
| Industry | Technology, Information and Internet |
| Company size range, as numbers too | 5,001-10,000 employees (5001, 10000) |
| Employees on LinkedIn (exact) | 16,694 |
| Followers | 1,796,602 |
| Company type and founded year | Privately Held, 2010 |
| Specialties | IVF, Egg Freezing, Genetic Testing |
| Headquarters: street, city, state, postal code, country | 354 Oyster Point Blvd, South San Francisco, California, 94080, US |
| Every office, with a directions link | 14 offices for Stripe |
| Logo and cover image | image URLs |
| LinkedIn company ID, slug and page URL | 2135371, stripe |
| Jobs link | linkedin.com/jobs/stripe-jobs-worldwide?f_C=2135371 |
| Products listed on LinkedIn | Stripe, Payment Processing Software |
| Affiliated pages (subsidiaries, showcase pages) | Stripe Partner Ecosystem |
| Similar companies, with industry and location | Atlassian, Software Development, Sydney |
| Recent posts | see below |

**Recent posts** are included at no extra cost: the latest posts (about 10) with text, the exact
date and time they went up, reactions, comments, images, video and whether it's a reshare. You can
turn them off to keep rows small.

**Open jobs** (add-on): how many jobs the company has open on LinkedIn worldwide, and its latest 10
with title, location, date and link. A quick hiring signal for sales and recruiting lists.

Only company data is collected. Employee lists, people's names, profiles and contact details aren't.

### Ready-made examples

Open one, change the input to yours, and run it:

- [Find LinkedIn company pages from website domains](https://apify.com/hydedata/linkedin-company-scraper/examples/linkedin-company-data-from-website-domains)
- [LinkedIn company lookup by name](https://apify.com/hydedata/linkedin-company-scraper/examples/linkedin-company-lookup-by-name)
- [Find companies hiring on LinkedIn, with open job counts](https://apify.com/hydedata/linkedin-company-scraper/examples/find-companies-hiring-on-linkedin)
- [LinkedIn company posts scraper](https://apify.com/hydedata/linkedin-company-scraper/examples/linkedin-company-posts-scraper)
- [LinkedIn company headcount and post monitor](https://apify.com/hydedata/linkedin-company-scraper/examples/linkedin-company-headcount-monitor)

### How to use it

#### Company URLs, slugs or IDs

Paste LinkedIn company or showcase page URLs, one per line. The slug alone (`stripe`) and the numeric
company ID or URN (`2135371`, `urn:li:organization:2135371`) work too. A company that renamed its
LinkedIn URL is followed to the new one.

```json
{
  "companies": [
    "https://www.linkedin.com/company/stripe",
    "hubspot",
    "urn:li:organization:13018048"
  ]
}
```

#### Company names

```json
{
  "companyNames": ["Spring Fertility", "Siemens", "HubSpot"]
}
```

Each match is checked on the company's page and says how sure it is in `matchConfidence`:

- **high**: exactly one company on LinkedIn has that name.
- **medium**: several companies share the name (there are a lot of "Joe's Pizza"). The best known
  is picked, and the others are listed in `alternatives` so you can check.
- **low**: no exact name match; the closest one is used.

#### Company websites

Turn a list of domains into LinkedIn company data:

```json
{
  "websites": ["clay.com", "notion.so", "https://www.gusto.com"]
}
```

A website match is high confidence when the LinkedIn page lists that website, or the site the domain
redirects to. It's medium when the company's own homepage links that LinkedIn page, or the page lists
the same brand under another ending (figma.com and figma.bot).

#### Find companies that are hiring

Build a company list from LinkedIn's public job search: every company with open jobs for a keyword in
a location, scraped and filtered.

```json
{
  "hiringKeywords": ["data engineer", "machine learning engineer"],
  "hiringLocations": ["Austin, TX", "Denver, CO"],
  "postedWithin": "week",
  "maxCompaniesPerSearch": 50,
  "companySizes": ["51-200", "201-500"],
  "includeOpenJobs": true
}
```

Each row says which keyword and location found the company. A company found by two searches is
delivered once.

#### Filters

Checked on each company's page before you're charged. Companies that don't match are dropped for free.

- Industry contains (e.g. Software, Hospitals)
- Company size range
- At least or at most this many employees
- Headquarters in a city, state, country or country code
- Company type (public, privately held, nonprofit and more)
- At least this many followers

#### Monitor mode: changes only

Turn on **Monitor mode** and add a Schedule (e.g. daily). The first run returns every company as the
baseline. After that, each run returns only companies that changed, with a `changes` list:

```json
{
  "name": "Stripe",
  "monitorStatus": "changed",
  "changes": [
    { "field": "employeeCount", "previous": 16193, "current": 16694, "change": 501, "changePercent": 3.09 },
    { "field": "tagline", "previous": "Old tagline", "current": "Help increase the GDP of the internet." }
  ],
  "newPosts": [{ "url": "https://www.linkedin.com/posts/stripe_...", "postedAt": "2026-10-29T19:33:43.119Z", "text": "..." }]
}
```

Pick what counts as a change: profile edits (name, tagline, website, industry, size, type, HQ,
specialties, About), employee count (at least 1% by default), new posts, follower count, and offices
added or removed. Companies with no change aren't output and only cost a small check fee.

To keep a full table every run instead, turn on **Also output unchanged companies**.

#### Alerts in Slack or Discord

Paste a Discord or Slack incoming webhook URL in **Send results to a webhook**. Each run posts its
companies there; in monitor mode each one says what changed ("Employees 16,193 → 16,694 (+3.09%), 1
new post"). Any other URL gets the rows as JSON. Quiet monitor runs send nothing.

#### Coming from another LinkedIn company scraper

Input field names from other LinkedIn company scrapers work as is: `companyUrls`, `searches`,
`identifier`, `urls`, `startUrls`, `maxItems` and more.

### Pricing

Pay per result. Platform usage is included.

| Event | Price |
| --- | --- |
| Company | $0.001 ($1 per 1,000) |
| Open jobs add-on, per company | $0.001 |
| Hiring search, once per keyword and location per run | $0.003 |
| Monitor check of a company with no change | $0.0002 |

You're never charged for:

- Inputs that weren't found or couldn't be read. They come back as rows with `status` and `error`,
  so a list of 500 maps back to its input.
- Companies your filters drop.
- The same company twice in one run.

With a spending limit, the run stops at the limit and never goes over it.

### Output

Results are in the run's dataset. Download them as JSON, CSV, Excel or HTML, or get them through the
Apify API, Make, Zapier or n8n. The dataset has views for an overview, company details, hiring,
posts, monitor changes and lookups.

### Tips

- Datacenter proxies (the default) work well. Switch to residential only if runs keep getting
  rate-limited.
- Names are matched with LinkedIn's own company search. A company with no open jobs can't always
  be found by name without signing in. Use its URL or its website instead.
- The page shows a company's latest posts, so a company that posts more than about 10 times between
  monitor runs will have some posts missing from `newPosts`. Schedule more often for very active ones.
- LinkedIn rounds big open job counts ("1,000+", "5,000+"). `openJobsCountIsMinimum` is true when
  the real count is higher.

### FAQ

**Do I need a LinkedIn account or cookies?** No. Everything comes from pages LinkedIn shows to
logged-out visitors.

**Is it legal to scrape LinkedIn company pages?** This Actor only reads public company information that
LinkedIn shows to anyone without signing in. It doesn't collect personal profiles or employee data.
Check the rules that apply to your use of the data.

**Why is the employee count different from the size range?** The size range is what the company
picked. The employee count is how many people on LinkedIn list the company as their employer, which
is often higher or lower.

# Changelog

This Actor's version history is a separate document: https://apify.com/hydedata/linkedin-company-scraper/changelog.md

# Actor input Schema

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

One company per line: a LinkedIn company or showcase page URL (https://www.linkedin.com/company/stripe), its slug (stripe), or its numeric ID or URN (2135371, urn:li:organization:2135371). Names and website domains pasted here work too and are looked up.

## `companyNames` (type: `array`):

Company names to look up on LinkedIn (e.g. Spring Fertility, Siemens). Each row says how sure the match is (high when exactly one company has that name) and lists other companies the name could mean.

## `websites` (type: `array`):

Website domains or URLs (e.g. clay.com, https://www.notion.so). The Actor finds the LinkedIn page whose website matches, so a list of domains turns into LinkedIn company data.

## `hiringKeywords` (type: `array`):

Job titles or keywords, as you'd type them on LinkedIn (e.g. data engineer, nurse). Each keyword runs in every location below. Companies hiring for it are collected and scraped.

## `hiringLocations` (type: `array`):

Cities, states or countries, as you'd type them on LinkedIn (e.g. Austin, TX or Germany). Leave empty to search worldwide.

## `postedWithin` (type: `string`):

Only count companies with a job posted in this window. "Past week" finds companies hiring right now.

## `maxCompaniesPerSearch` (type: `integer`):

Upper limit of companies delivered per hiring search.

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

The company's latest posts (about 10): text, date, reactions, comments, images and video. Included at no extra cost.

## `includeOpenJobs` (type: `boolean`):

Also get how many jobs the company has open on LinkedIn worldwide and its latest 10 (title, location, date, link). LinkedIn rounds big counts (1,000+, 5,000+). Charged per company that gets it.

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

Keep companies whose LinkedIn industry contains any of these words (e.g. Software, Hospitals, Financial Services).

## `companySizes` (type: `array`):

Keep companies in these LinkedIn size ranges.

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

Uses the number of people on LinkedIn who work there, or the size range when the page has no count.

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

Uses the number of people on LinkedIn who work there, or the size range when the page has no count.

## `headquartersIn` (type: `array`):

Keep companies headquartered in any of these: a city, state or country name (e.g. Texas, London), or a two-letter country code (US, DE).

## `companyTypes` (type: `array`):

Keep companies of these types.

## `minFollowers` (type: `integer`):

Keep companies with at least this many LinkedIn followers.

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

Upper limit of companies delivered by the whole run. Leave empty for no limit.

## `monitorMode` (type: `boolean`):

Remembers each company from run to run and only outputs the ones that changed, with what changed: headcount, new posts, profile edits. Use with a Schedule. The first run returns every company as the baseline. Companies with no change aren't output and cost a small check fee instead of a full company.

## `trackChanges` (type: `array`):

What counts as a change in monitor mode.

## `minEmployeeChangePercent` (type: `number`):

Report employee count changes of at least this percent. 0 reports every change.

## `minFollowerChangePercent` (type: `number`):

Report follower count changes of at least this percent, when follower count is watched.

## `includeUnchanged` (type: `boolean`):

In monitor mode, output every company each run, marked changed or unchanged. Every row is charged as a company.

## `notifyWebhookUrl` (type: `string`):

Paste a Discord or Slack incoming webhook URL to get each run's companies as a message. In monitor mode each company says what changed (e.g. Employees 16,694 → 17,020 (+2%), 2 new posts). Any other URL gets the rows as JSON. Only sent when the run delivers something, so quiet monitor runs stay silent.

## `stateStoreName` (type: `string`):

Named key-value store that keeps monitor memory between runs. Use different names to run independent monitors.

## `stateRetentionDays` (type: `integer`):

Companies not checked for this many days are dropped from monitor memory.

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

Company pages fetched at the same time, each on its own proxy IP. Lower it if runs get rate-limited.

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

Apify datacenter proxies work for LinkedIn's public company pages. Switch to RESIDENTIAL only if runs keep getting rate-limited.

## Actor input object example

```json
{
  "companies": [
    "https://www.linkedin.com/company/stripe",
    "hubspot"
  ],
  "postedWithin": "any",
  "maxCompaniesPerSearch": 25,
  "includePosts": true,
  "includeOpenJobs": false,
  "monitorMode": false,
  "trackChanges": [
    "profile",
    "employees",
    "posts"
  ],
  "minEmployeeChangePercent": 1,
  "minFollowerChangePercent": 5,
  "includeUnchanged": false,
  "stateStoreName": "linkedin-company-monitor-state",
  "stateRetentionDays": 90,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Dataset items, one per company or unmatched input. Field meanings are in the dataset schema.

# 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": [
        "https://www.linkedin.com/company/stripe",
        "hubspot"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

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