# LinkedIn Company Scraper — Company Data API, No Login | $1/1k (`glasswing/linkedin-company-scraper`) Actor

Scrape public LinkedIn company pages without an account: name, website, industry, company size, headquarters, founded, specialties, followers, logo, locations, similar pages and open jobs. By URL, slug, id or company name. No people data.

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

## Pricing

from $1.00 / 1,000 results

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

### What does LinkedIn Company Scraper do?

LinkedIn Company Scraper turns public LinkedIn company pages into clean, structured data: **name, website, industry, company size, headquarters and address, founded year, type, specialties, followers, logo, cover image, office locations, similar pages and open jobs**. It works as a **LinkedIn company data API** without an account: paste company URLs, the name from the page address (`stripe`), numeric company ids, or just type company names, and get one row per company as JSON, CSV or Excel.

It reads only what LinkedIn shows to visitors who are **not logged in**. No LinkedIn account, no cookies, no login, no browser. Company facts only: no employee lists, no people, no posts.

### Use cases for this LinkedIn company scraper

- **Lead generation and CRM enrichment:** add website, industry, size range, headquarters and follower count to a list of accounts.
- **Market mapping:** pull the companies LinkedIn lists as similar pages and affiliated pages to find competitors and subsidiaries.
- **Hiring signals:** `openJobsCount` shows how many jobs a company has open on LinkedIn right now.
- **Data cleaning:** turn company names from a spreadsheet into LinkedIn company ids, page URLs and websites.
- **AI agents:** call it with a company name or URL and get a self-describing row back in seconds.

### What data can LinkedIn Company Scraper extract?

| Field | Type | Description |
|---|---|---|
| `name` | string | Company name as shown on LinkedIn |
| `url` | string | The company's public LinkedIn page, `https://www.linkedin.com/company/<slug>/` |
| `companyId` | string | LinkedIn's numeric company id (the id LinkedIn's job search filters by) |
| `slug` | string | The company name in the page address |
| `tagline` | string | One-line tagline under the name, when the company set one |
| `description` | string | The company's own "About us" text |
| `website` | string | Company website |
| `industry` | string | LinkedIn industry, e.g. `Software Development` |
| `companySize` | string | Size range as LinkedIn shows it, e.g. `1,001-5,000 employees` |
| `companySizeMin` / `companySizeMax` | integer | The range as numbers (`companySizeMax` is empty for `10,001+`) |
| `employeesOnLinkedIn` | integer | How many LinkedIn members list the company as employer (a number, no names) |
| `headquarters` | string | Headquarters as shown, e.g. `Redmond, Washington` |
| `address` | object | Headquarters address: `street`, `city`, `region`, `postalCode`, `country` (ISO code) |
| `locations` | array | Office addresses from the Locations section, primary office first |
| `founded` | integer | Year founded |
| `type` | string | `Public Company`, `Privately Held`, `Nonprofit`, ... |
| `specialties` | array | Specialties the company lists |
| `followerCount` | integer | LinkedIn followers |
| `logoUrl` | string | Logo image URL |
| `coverImageUrl` | string | Cover (banner) image URL |
| `similarPages` | array | Names of the companies LinkedIn lists under "Similar pages" |
| `affiliatedPages` | array | Names of affiliated pages (subsidiaries, showcase pages) |
| `openJobsCount` | integer | Open jobs LinkedIn shows for the company, when it shows the number |
| `inputName` | string | The company name you typed, for rows found through **Company names** |
| `status` | string | `ok`, `not_found` or `error` (see below) |
| `error` | string | Plain reason when `status` is not `ok` |
| `scrapedAt` | string | ISO 8601 time of extraction |

Fields a company did not fill in on LinkedIn are left out of its row. In a 100-company test run every `ok` row had `name`, `companyId`, `industry`, `companySize`, `followerCount` and `employeesOnLinkedIn`; 98% had a website and a description, 84% specialties, 44% a founded year.

#### Result status (tri-state output)

| `status` | Meaning | Billed? |
|---|---|---|
| `ok` | The company page was read. | Yes |
| `not_found` | LinkedIn has no company page at that address, or no company matches the name you typed. | No |
| `error` | The page could not be read after several retries (for example LinkedIn kept showing its sign-in wall); `error` says why. | No |

### How to scrape LinkedIn company data

1. Click **Try for free** (or **Start**) - the prefilled example returns 6 well-known companies in under a minute.
2. Put your companies into **Companies**, one per line: `https://www.linkedin.com/company/stripe/`, `stripe` or `2135371`. Or type names into **Company names to look up**.
3. Set **Maximum results** and click **Start**.
4. Open the **Output** tab or export the dataset as JSON, CSV, Excel, XML or HTML.

To automate it, use the **API** tab (Node.js, Python, curl), a **Schedule**, or the Apify MCP server.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` (**Companies**) | array of strings | 6 example companies | Company URLs (any country site, `/about/` and other sub-pages work), slugs like `tata-consultancy-services`, or numeric company ids. Other text is looked up as a company name. |
| `companyNames` | array of strings | - | Company names to look up with LinkedIn's public company search. The example companies are skipped when you use this. |
| `maxItems` | integer | `20` | Stop after this many rows |
| `proxyConfiguration` | object | Apify Proxy (datacenter) on | LinkedIn slows down one IP after about 60 pages; the datacenter proxy spreads the requests. No residential proxy needed. |

Example input:

```json
{
    "startUrls": [
        "https://www.linkedin.com/company/stripe/",
        "posthog",
        "1035"
    ],
    "companyNames": ["Revolut", "Tata Consultancy Services"],
    "maxItems": 20
}
```

### Output

A real row from a run on the Apify platform (29 Sep 2026; `description`, `specialties` and image URLs shortened here):

```json
{
    "url": "https://www.linkedin.com/company/posthog/",
    "status": "ok",
    "scrapedAt": "2026-09-29T18:53:01.901Z",
    "companyId": "37415928",
    "slug": "posthog",
    "name": "PostHog",
    "tagline": "Make your product self-driving. Get started with npx @posthog/wizard",
    "description": "At PostHog, we're working to increase the number of successful products in the world. ...",
    "website": "https://posthog.com/",
    "industry": "Software Development",
    "companySize": "51-200 employees",
    "companySizeMin": 51,
    "companySizeMax": 200,
    "employeesOnLinkedIn": 231,
    "headquarters": "San Francisco",
    "address": { "city": "San Francisco", "country": "US" },
    "locations": ["San Francisco, US"],
    "founded": 2020,
    "type": "Privately Held",
    "specialties": ["analytics", "open source", "product analytics", "session replay", "error tracking"],
    "followerCount": 57479,
    "logoUrl": "https://media.licdn.com/dms/image/v2/D560BAQGQUyE_CXUxIw/company-logo_200_200/...",
    "coverImageUrl": "https://media.licdn.com/dms/image/v2/D563DAQEA7rvhEksP6g/image-scale_191_1128/...",
    "similarPages": ["ElevenLabs", "Linear", "Buffer", "Camunda", "Supabase", "Haus", "Ashby", "Todoist", "GitLab", "Checkly"]
}
```

Rows that are not data explain themselves and are free:

```json
[
    { "url": "https://www.linkedin.com/company/this-company-does-not-exist-zz9q/", "status": "not_found", "error": "HTTP 404: page does not exist" },
    { "url": "https://www.linkedin.com/jobs-guest/api/typeaheadHits?typeaheadType=COMPANY&query=zzqqxxnonexistentco", "status": "not_found", "error": "LinkedIn has no company matching \"zzqqxxnonexistentco\"." }
]
```

### Speed and reliability (real runs)

All numbers are from runs on the Apify platform at the default 1,024 MB with the default datacenter proxy.

| Run | Companies | Time | Result |
|---|---|---|---|
| Default input (no arguments) | 6 | about 10 s | 6 `ok` |
| 100 company slugs from 20+ countries | 100 | 59 s | 91 `ok`, 9 `not_found` (slugs that do not exist), 0 `error` |
| Mixed input: renamed URL, numeric id, typed names, `/about/` URL | 9 | 6 s | 6 `ok`, 3 `not_found` |
| 40 typed company names (US, Europe, Asia, Latin America, Africa) | 40 | 44 s | 40 `ok` |
| 15 more typed names, some for companies with no open jobs | 15 | 21 s | 13 `ok`, 2 `not_found` (Grab, Dangote Group) |

Before building it, we measured 147 requests to 49 companies from Apify's datacenter: 97% returned the company page on the first attempt, the rest were renamed pages (followed automatically) and a few HTTP 429 slow-downs, which the Actor retries from another IP.

### How much does it cost to scrape LinkedIn company data?

Pay per event, platform compute and proxy included:

| Event | Price |
|---|---|
| Actor start | $0.005 per run |
| Result (`status: ok` company) | $0.001 per company ($1 per 1,000) |

Examples: the default 6-company run costs $0.011; 1,000 companies cost $1.005; 10,000 companies $10.005. Rows with status `not_found` or `error` are never billed. Cap spending with **Maximum results** and the run's **Max total charge**; the Actor stops cleanly when either is reached.

### Tips

- Page URLs, slugs and ids are the fastest input (one request per company). A typed name needs three requests (search, company id, page), so it takes a little longer; the result costs the same.
- Check `inputName` against `name` for looked-up names. The Actor takes LinkedIn's first suggestion that starts with the name you typed, which is usually the main company page. For a group with many country pages (for example "Banco Santander"), LinkedIn's first suggestion can be one country's page; paste the exact company URL when that matters.
- Put many companies into one run instead of many small runs; you pay the start fee once.

### Limitations

- Company-level facts only. Employee lists, member profiles, people's names, e-mails and phone numbers, and company posts are out of scope by design.
- LinkedIn shows logged-out visitors company pages only by their name address (`/company/stripe/`). A numeric id is turned into that address through the company's open jobs on LinkedIn; a company with no open jobs gives an `error` row that asks for the URL instead.
- A typed name is found through the same open jobs. When the company has none, the Actor tries the page address that matches the name (for example `/company/toyota/`) and keeps only a page with the right company id. If the company's address is something else entirely (Grab's page is `/company/grabapp/`), the row is `not_found`; paste the URL instead. In our tests 53 of 55 typed names were found.
- `openJobsCount`, `founded`, `tagline` and `specialties` appear only when LinkedIn shows them for that company.
- `employeesOnLinkedIn` counts LinkedIn members who list the company, which differs from the headcount the company reports; `companySize` is the range the company chose.
- Values are in English; showcase pages (`/showcase/...`) and school pages are not supported.
- Results reflect the public page at the time of the run. If LinkedIn changes its layout, rows come back as `error` until the Actor is updated; report it in the **Issues** tab.

### FAQ

**Do I need a LinkedIn account, cookies or a proxy?** No. The Actor reads the public company pages LinkedIn shows to anonymous visitors; the datacenter proxy it uses is included in the price.

**Is it legal to scrape LinkedIn company pages?** It collects only company information LinkedIn publishes to visitors who are not signed in, and no member data. You are responsible for how you use the data; read the notice below and LinkedIn's terms.

**Can an AI agent call it?** Yes. With no input at all it returns 6 companies in seconds. Agents can pass company URLs, slugs, ids or names as plain strings, and every row says whether it is data (`ok`), an empty answer (`not_found`) or a failure (`error`).

**How fresh is the data?** Every run reads LinkedIn live; nothing is cached.

**Why did I get fewer rows than Maximum results?** You gave fewer companies, several inputs led to the same company page (it is returned once), or the run's charge limit was reached. The run log says which.

### Related Actors

- [LinkedIn Jobs Scraper](https://apify.com/glasswing/linkedin-jobs-scraper) - use it for the job postings themselves: title, location, salary, seniority and the full description, filtered by company, keyword and date.
- [LinkedIn Jobs Scraper — Hiring Leads with Emails](https://apify.com/glasswing/linkedin-leads) - use it when you need hiring-manager contact emails for companies that are hiring.

### Legal and data-protection notice

This Actor extracts only company information that LinkedIn publishes to visitors who are not signed in. It does not log in, does not work around access controls, and does not extract member data such as names, profile links, photos, e-mail addresses or phone numbers; the "Employees at" block and company posts on the page are skipped. Company descriptions are written by the companies themselves. Personal data is protected by the GDPR in the European Union and by other laws worldwide, so do not use any personal data without a legitimate reason. You are responsible for complying with LinkedIn's terms of service and applicable law when you use the extracted data.

This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by LinkedIn Corporation. LinkedIn is a trademark of LinkedIn Corporation; all trademarks belong to their respective owners.

# Changelog

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

# Actor input Schema

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

One company per line: a LinkedIn company URL from any country site (https://www.linkedin.com/company/stripe/, sub-pages like /about/ work too), just the name from the page address (`stripe`, `tata-consultancy-services`), or a numeric LinkedIn company id (`2135371`). Any other text is looked up as a company name. The example is skipped automatically when you fill in company names below.

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

Company names as you would type them into LinkedIn (`Tata Consultancy Services`, `Revolut`). Each name is matched with LinkedIn's public company search: an exact name match first, otherwise LinkedIn's top suggestion. The row's `inputName` shows what you typed, so you can check the match.

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

Stop after this many rows have been saved. Each saved company with status `ok` is one billable result; `not_found` and `error` rows are free.

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

Apify Proxy (datacenter, the default group) is on by default: LinkedIn slows down one IP after about 60 company pages, and the Actor spreads requests over datacenter IPs. Residential proxies are not needed.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.linkedin.com/company/microsoft/",
    "https://www.linkedin.com/company/stripe/",
    "https://www.linkedin.com/company/apify/",
    "https://www.linkedin.com/company/spotify/",
    "https://www.linkedin.com/company/shopify/",
    "https://www.linkedin.com/company/siemens/"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "startUrls": [
        "https://www.linkedin.com/company/microsoft/",
        "https://www.linkedin.com/company/stripe/",
        "https://www.linkedin.com/company/apify/",
        "https://www.linkedin.com/company/spotify/",
        "https://www.linkedin.com/company/shopify/",
        "https://www.linkedin.com/company/siemens/"
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("glasswing/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 = {
    "startUrls": [
        "https://www.linkedin.com/company/microsoft/",
        "https://www.linkedin.com/company/stripe/",
        "https://www.linkedin.com/company/apify/",
        "https://www.linkedin.com/company/spotify/",
        "https://www.linkedin.com/company/shopify/",
        "https://www.linkedin.com/company/siemens/",
    ],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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