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

Scrape LinkedIn company pages by URL, slug or name, with no login. Just add companies and get the tagline, description, industry, size, headquarters, every office address, followers, specialties, website and logo. Export to CSV or Excel, or run it on a schedule. $2.00 per 1,000 companies.

- **URL**: https://apify.com/boncross/linkedin-company-details-scraper.md
- **Developed by:** [BonCross API](https://apify.com/boncross) (community)
- **Categories:** Lead generation, Social media
- **Stats:** 4 total users, 3 monthly users, 75.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 company-details

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

### What is LinkedIn Company Scraper?

Type "Wise" into most tools and you get `/company/wise`, a printing company in Alpharetta, Georgia with 1,669 followers. LinkedIn Company Scraper gives you the London fintech, because it matches a name against LinkedIn's own company record and tells you which company it picked. You can hand it company URLs, slugs or plain names, in any mix, and you get one clean record per company. You don't sign in to LinkedIn.

What you can count on:

- **Names work, and you can audit them.** The log shows what each name matched and which candidates were passed over.
- **A list of 670 companies takes about two minutes.** Measured on 2 October 2026 at 330 to 370 companies a minute.
- **Nothing you asked for goes missing.** A company that can't be read is returned as a row with an `error` field that says why.
- **A wrong slug costs a quarter of a real one.** $0.0005 for a page with no company on it, against $0.002 for a company record.

**BonCross Verified** means we tested this actor against the live site before release and kept the record:

- 13 of 13 live checks on its inputs and filters passed on 8 October 2026
- 14 company inputs run on 7 October 2026, links, slugs and names: 9 companies, 5 error rows
- Charges matched the rows: 1 start, 9 companies, 4 checked

With it you can:

- Extract the company name, tagline, About text, website and logo
- Get the industry, company type, founding year and size band
- Read the employee count and follower count as numbers
- Get the headquarters with its street, postcode and country code, and the other office addresses listed on the page
- Collect LinkedIn's numeric company id and the page slug
- Load a long list from a file or a Google Sheet and cap it with one limit

It's mostly used to enrich a CRM or a lead list with size, industry and headquarters, to group prospects by sector or country, and to check that the company records in a database still match LinkedIn. Run it on a schedule and the follower counts become a growth series for a set of competitors.

### What company data do you get?

| | |
|---|---|
| 🏢 Company name and tagline | 🔗 LinkedIn URL, slug and company id |
| About description | 🌐 Website |
| Industry | Company size band and employee count |
| 📍 Headquarters, with street, postcode and country code | Each office address on the page |
| 👥 Follower count | Specialties, as a list |
| Company type and founding year | Logo |
| Whether the row came from a URL, slug or name | Scrape timestamp |

### How to scrape LinkedIn companies

1. [Get a free Apify account](https://console.apify.com/sign-up).
2. Open [LinkedIn Company Scraper](https://apify.com/boncross/linkedin-company-details-scraper).
3. Paste company URLs or slugs, or type company names. Mixing them is fine.
4. Set "Maximum companies" if you want a ceiling on the run.
5. Press Start, then download the records as Excel, CSV, JSON, XML or HTML.

That's the whole job. There's nothing to code and no LinkedIn login to supply.

### ⬇️ Input

Paste what you have. URLs, slugs and names are combined, and a company given twice is read once.

There's one page per company, so there's only one limit: "Maximum companies" caps what the run returns, and 0 (the default) means no cap.

**Two by URL or slug, one by name**

```json
{
  "companyUrls": ["https://www.linkedin.com/company/monzo", "xelix."],
  "companyNames": ["Wise"]
}
```

**A long list from a file or Google Sheet, capped at 500 companies**

```json
{
  "startUrls": [{ "url": "https://www.linkedin.com/company/wiseaccount" }],
  "maxItems": 500
}
```

| Field | Notes |
|---|---|
| `companyUrls` | Full company URLs or bare slugs. Paste the slug exactly: a trailing dot is part of it. |
| `companyNames` | Plain names. Each is matched to LinkedIn's own company record rather than by guessing a URL from the name. |
| `startUrls` | The same as `companyUrls`, pasted or loaded in bulk from a file or a Google Sheet. |
| `maxItems`, `delayMs`, `maxConcurrency` | Run ceiling (default 0, no limit), an optional extra pause before each request (default 0), and how many companies are read at once (default 8). |

#### Why a name beats a guessed URL

Slugs aren't names. `/company/wise` and `/company/wiseaccount` are different companies, and only one of them is the one you meant. When you give a name, the run looks it up in LinkedIn's company records and writes down its choice:

```
Company "Wise" -> Wise (1769571); 3 other candidate(s) ignored: WISE, Wisemonk, WiseTech Global
  "Wise" -> https://www.linkedin.com/company/wiseaccount
```

There's a catch you should know about. A name can be matched to its page only while the company has job postings on LinkedIn. If it has none, you get an error row that says so and asks for the URL or slug, billed `target-checked` ($0.0005). You don't get a lookalike.

If two companies share a name and you care which one you get, give the URL. A name finds the closest match. A URL is exact.

#### For developers

- `companyUrls` takes full URLs or bare slugs. Paste a slug exactly as LinkedIn has it: a trailing dot is part of it.
- `startUrls` does the same job as `companyUrls` and also loads a list from a file or a Google Sheet.
- `maxItems` is the only cap (default 0, no limit).
- `maxConcurrency` (default 8, from 1 to 8) is how many companies are read at once. `delayMs` (default 0) adds a pause before each request. Neither needs changing for a normal run.
- Records are written as they're read. If you stop a run early you keep what it had collected.
- Two runs of one input started at the same moment both finished in testing, with no company lost.

### ⬆️ Output

One record per company. `id` is LinkedIn's numeric company id, or the slug where the page doesn't show one.

```json
{
  "id": "1769571",
  "url": "https://www.linkedin.com/company/wiseaccount",
  "companyUrl": "https://www.linkedin.com/company/wiseaccount",
  "companySlug": "wiseaccount",
  "companyName": "Wise",
  "companyDescription": "Wise is a global technology company, building the best way to move money around the world. With the Wise account people and businesses can hold 40+ cu…",
  "companyWebsite": "https://wi.se/f4m4ed",
  "companyIndustry": "Financial Services",
  "companySize": "5,001-10,000 employees",
  "companyHeadquarters": "London",
  "companyAddressParts": { "street": "The Tea Building", "city": "London", "region": null, "postcode": "E1 6JJ", "countryCode": "GB" },
  "companyType": "Public Company",
  "companyFounded": "2011",
  "companySpecialties": ["money transfer", "currency exchange", "foreign currency", "fintech", "…"],
  "companyId": "1769571",
  "companyEmployeesCount": 11701,
  "companySlogan": "160+ countries. 40+ currencies. Money for here, there and everywhere.",
  "companyFollowers": 683681,
  "companyLocations": [
    "The Tea Building 56 Shoreditch High Street London, E1 6JJ, GB",
    "W 26th Street New York City, US",
    "Váci út 80 Budapest, Budapest 1133, HU",
    "…"
  ],
  "companyLogo": "https://media.licdn.com/dms/image/v2/C4E0BAQGi4FxUQN6fqw/company-logo_200_200/company-logo_200_200/0/1677655590999/wiseaccount_logo?e=2147483647&v=beta&t=UF_3Kpsw-V2H1VtVd55ZU4SoS8f0_7GyWXjsHREja60",
  "inputSource": "name",
  "scrapedAt": "2026-09-13T23:36:28.817Z"
}
```

`inputSource` is `url`, `slug`, `startUrl` or `name`. A field the company hasn't filled in on LinkedIn is absent from its record. There's no `companyFounded` if the page has no founding year.

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

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, per run | $0.001 | $0.001 | $0.001 | $0.001 |
| `company-detail`, per company returned | $0.002 | $0.0018 | $0.0016 | $0.0014 |
| `target-checked`, per company LinkedIn answered with no company data (no such page, a generic page for a slug that is not quite right, an empty page, or a name that matches no company) | $0.0005 | $0.0005 | $0.0005 | $0.0005 |

Enterprise plans pay the Business price.

**$2.00 per 1,000 companies** on the Free plan, $1.40 on Business. Proxy usage and platform usage are inside that price.

- 500 companies: $0.001 + 500 × $0.002 = **$1.001** ($0.70 on Business).
- 520 slugs of which 20 turn out to be wrong: $0.001 + 500 × $0.002 + 20 × $0.0005 = **$1.011** ($0.71 on Business).

A company LinkedIn never answered isn't charged at all. Neither is an input that isn't a company page URL.

The $5 of credits that comes with Apify's Free plan each month covers about 2,500 companies before you pay anything.

### How many companies, how fast, and the limits

| Run | Result |
|---|---|
| 15 companies by URL or slug | 14 records in 6 to 13 seconds |
| 670 companies | 670 records in 1 minute 48 seconds to 2 minutes 3 seconds (330 to 370 a minute) |
| Same input, two runs started at the same moment | both finished, no company lost |

Whole runs on Apify, 2 October 2026. At that pace an hour covers roughly 20,000 companies.

What it won't give you:

- **Anything the page doesn't show.** All fields are read from the public company page. A company that hides a field on LinkedIn doesn't have it here.
- **A name match for a company with no job postings.** Give its URL or slug.
- **Employees.** LinkedIn shows a handful on the page and keeps the full list behind a login. This actor returns none.
- **Recent updates.** A company's posts are a separate actor, [LinkedIn Company Posts Scraper](https://apify.com/boncross/linkedin-company-posts-scraper).
- **Headcount.** The follower and employee counts are LinkedIn's. Its employee count is the number of members who list the company, which isn't the same thing as headcount.

### FAQ

#### What happens to a company that can't be read?

You get an error row for it, with an `error` field giving the reason: no such page, a generic page for a slug that's not quite right, or LinkedIn refusing the request. A company LinkedIn answered with no company data bills `target-checked` only. One LinkedIn never answered is free. A URL that isn't a company page (a school or a profile, say) and a name that matches no company also come back as error rows: the URL isn't charged, and the name bills `target-checked`.

#### Why did a slug return the wrong company?

Because the slug belongs to someone else. Put the name in "Company names" and let the run match it, or copy the slug from the company's LinkedIn address bar.

#### Why is a field empty?

The company left it empty on LinkedIn. What the public page doesn't show isn't available here.

#### Do I need proxies of my own, or a LinkedIn account?

No to both. The records come from pages LinkedIn serves to a logged-out visitor, so no session of yours is ever at risk. Proxy usage is included in the price.

#### Can I track a company over time?

Schedule the same list weekly or monthly and compare `companyFollowers` and `companyEmployeesCount` between datasets. The actor doesn't keep history for you, so keep the datasets.

#### Is scraping LinkedIn legal?

This actor reads only public pages, takes no account access and collects no private data. Public data scraping is generally lawful in the UK, EU and US, and hiQ v LinkedIn is the usual reference. You remain responsible for how you use what you collect, including under GDPR where the data identifies a person.

### Enrich a CRM, a sheet or an agent

Most of this data ends up beside a list you already hold. Apify's integrations send each finished dataset to Google Sheets, Airbyte, Make or Zapier, and a webhook can tell your own system when a run is done.

Calling it from code is one request: `POST https://api.apify.com/v2/acts/boncross~linkedin-company-details-scraper/run-sync-get-dataset-items` with the input JSON as the body. Short lists come back in the response. For long ones, start a run and read the dataset when it finishes. The `apify-client` packages on NPM and PyPI wrap both.

Through the Apify MCP server (`mcp.apify.com`) an AI agent can call the actor as a tool: give it a company name mid-conversation and it gets the record back, ready to summarise what the company does before drafting outreach.

### More from BonCross

- [LinkedIn Company Posts Scraper](https://apify.com/boncross/linkedin-company-posts-scraper): The latest posts from any LinkedIn company page, with no login.
- [LinkedIn Jobs Scraper](https://apify.com/boncross/linkedin-jobs-scraper): LinkedIn jobs from keywords and locations or search URLs, no login needed.
- [LinkedIn Post Scraper](https://apify.com/boncross/linkedin-post-details-scraper): Any public LinkedIn post by URL, with no login.
- [Marriott Hotel Details Scraper](https://apify.com/boncross/marriott-hotel-details): Everything a Marriott property publishes: address, coordinates, phones, brand, guest…
- [Marriott Hotel Search Scraper](https://apify.com/boncross/marriott-hotel-search): Every Marriott hotel for a destination and dates.
- [Marriott Reviews Scraper](https://apify.com/boncross/marriott-reviews): Guest reviews for any Marriott hotel.

### Your feedback

If a name matched the wrong company, we'd like to see it. Post the name and what you expected on the Issues tab in Apify Console, along with anything else that looks off. BonCross reads each report and answers there.

# Changelog

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

# Actor input Schema

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

LinkedIn company pages, as full URLs or bare slugs. A slug can end in a dot: `xelix.` is a real slug and dropping the dot returns a different page, so paste it exactly as LinkedIn shows it.

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

Plain company names, e.g. "Monzo". Each is resolved through LinkedIn's own search suggestions, so you do not need a URL. Names are not unique, so the run log states what every name resolved to and lists the other candidates it matched.

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

The same thing as Company URLs, in the format Apify's scheduler and integrations pass links in.

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

A ceiling on the companies this run returns. Nothing past it is fetched or charged for. Leave at 0 for no limit.

## `delayMs` (type: `integer`):

Extra pause before each request, jittered by about 30 percent either way. The run already keeps to a request rate measured safe for LinkedIn, so the default is 0; raise it only if a run reports refusals.

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

How many targets are read at once. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.

## `restartAttempt` (type: `integer`):

Set by the actor when it restarts itself in a fresh container after being refused. Leave it alone.

## Actor input object example

```json
{
  "companyUrls": [
    "https://www.linkedin.com/company/monzo"
  ],
  "companyNames": [],
  "startUrls": [],
  "maxItems": 0,
  "delayMs": 0,
  "maxConcurrency": 8,
  "restartAttempt": 0
}
```

# Actor output Schema

## `dataset` (type: `string`):

One record per LinkedIn company page.

## `stats` (type: `string`):

Counts for the run, and what every company name resolved to.

# 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/monzo"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/linkedin-company-details-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/monzo"] }

# Run the Actor and wait for it to finish
run = client.actor("boncross/linkedin-company-details-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/monzo"
  ]
}' |
apify call boncross/linkedin-company-details-scraper --silent --output-dataset

```

## MCP server setup

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