# LinkedIn Company Scraper ⚡ Advanced Data, Best Value (`claygenius/linkedin-company-scraper`) Actor

Paste LinkedIn company URLs, get logo, exact employee count, size band, followers, website, domain, industry, HQ address, founding year, specialties and office locations. No login, no browser.

- **URL**: https://apify.com/claygenius/linkedin-company-scraper.md
- **Developed by:** [Muhammad Shamshad Aslam](https://apify.com/claygenius) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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 by URL

Paste LinkedIn company links, get the **full public company profile** for each one: logo, cover image, **exact number of employees on LinkedIn**, company size band, followers, **how many jobs they have open right now**, website and **domain**, industry, headquarters address, company type, founding year, specialties, every office location, and lookalike companies. No login, no browser, one request per company, so it is fast and very low cost per result.

Built for account research and enrichment: drop in company URLs from a spreadsheet, a CRM, a Clay table, or the `companyLinkedinUrl` column of the LinkedIn Jobs Scraper, and get clean firmographics back.

### Features

- 🔗 **Any LinkedIn company link format**: `linkedin.com/company/stripe`, `/company/stripe/about/`, `/company/stripe/jobs`, regional hosts (`uk.linkedin.com`, `de.linkedin.com`), showcase pages, or just the slug (`stripe`)
- 🖼️ **Logo and cover image**: direct image URLs, ready to drop into a CRM or a sheet
- 👥 **Headcount, two ways**: the exact `employeesOnLinkedin` count plus LinkedIn's size band (`companySize`) split into numeric `employeeCountMin` / `employeeCountMax` for easy filtering
- 📈 **Followers**: the page's follower count as a number
- 💼 **Is the company hiring?** `openJobsCount` (open jobs on LinkedIn, worldwide), `isHiring` true/false, and `jobsUrl`, a ready-made LinkedIn job search for that company you can paste into the LinkedIn Jobs Scraper to get every job
- 🔎 **Hiring for a specific role?** Give words like `marketing` or `account executive` and get, per company, how many open jobs have them **in the title**, plus each matching job's title, location, posted date and link. Checks real titles, not LinkedIn's keyword search, which also matches descriptions
- 🌐 **Website and domain**: the real site URL (LinkedIn's redirect wrapper removed) and a clean `domain` for matching
- 🏢 **Firmographics**: industry, company type, founding year, specialties, tagline and full description
- 📍 **Headquarters address**: street, city, region, postal code and country as separate fields, plus every office location LinkedIn lists
- 🧲 **Lookalike companies**: `similarPages` with name, industry, location and LinkedIn URL, and `affiliatedPages` for subsidiaries and showcase pages
- 🆔 **LinkedIn company ID**: the numeric organization ID, stable even when a company changes its slug
- ✅ **Duplicate-free**: the same company pasted twice, or as both `/about` and `/jobs`, is fetched once
- 🧾 **Failure report**: URLs that do not exist, were blocked, or are not company pages are listed in the key-value store record `FAILED_URLS`, never silently dropped
- ✅ **No login required**: reads the public company page, so no account can get banned

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `companyUrls` | array | 3 example companies | LinkedIn company URLs or slugs, one per line. Duplicates are fetched once. `/school/` pages are not supported |
| `includeOpenJobs` | boolean | `true` | Add `openJobsCount`, `openJobsCountText`, `isHiring` and `jobsUrl`. One extra request per company |
| `jobTitleWords` | array | empty | Words to look for in job titles. Whole words, not case-sensitive, any word counts. Adds `matchingJobsCount`, `hasMatchingJobs`, `matchingJobsCapped`, `matchingJobs` |
| `maxMatchingJobs` | integer | `25` | Stop after this many matching jobs per company. `0` = all |
| `includeSimilarPages` | boolean | `true` | Include `similarPages` and `affiliatedPages`. No extra requests either way |
| `proxyConfig` | proxy | Residential | Residential is the default; datacenter IPs get blocked quickly |

#### Example input

```json
{
  "companyUrls": [
    "https://www.linkedin.com/company/stripe",
    "https://uk.linkedin.com/company/hubspot/about/",
    "notionhq"
  ],
  "includeOpenJobs": true,
  "jobTitleWords": ["marketing", "marketer"],
  "maxMatchingJobs": 25,
  "includeSimilarPages": true
}
```

### Output

One record per unique company. Fields that the company has not filled in on LinkedIn are `null` (or an empty list).

```json
{
  "companyId": "2135371",
  "companyName": "Stripe",
  "linkedinUrl": "https://www.linkedin.com/company/stripe",
  "tagline": "Help increase the GDP of the internet.",
  "description": "Stripe builds programmable financial services. Millions of companies...",
  "logo": "https://media.licdn.com/dms/image/v2/.../company-logo_200_200/.../stripe_logo",
  "coverImage": "https://media.licdn.com/dms/image/v2/.../stripe_cover",
  "website": "https://stripe.com",
  "domain": "stripe.com",
  "industry": "Technology, Information and Internet",
  "companySize": "5,001-10,000 employees",
  "employeeCountMin": 5001,
  "employeeCountMax": 10000,
  "employeesOnLinkedin": 16622,
  "followers": 1741582,
  "openJobsCount": 1000,
  "openJobsCountText": "1,000+",
  "isHiring": true,
  "jobsUrl": "https://www.linkedin.com/jobs/search?f_C=2135371&geoId=92000000",
  "jobTitleWords": ["marketing", "marketer"],
  "matchingJobsCount": 25,
  "hasMatchingJobs": true,
  "matchingJobsCapped": true,
  "matchingJobs": [
    { "jobId": "4454549349", "title": "Product Marketing Manager", "location": "New York, United States", "postedAt": "2026-09-14", "jobUrl": "https://www.linkedin.com/jobs/view/4454549349", "matchedWords": ["marketing"] }
  ],
  "headquarters": "South San Francisco, California",
  "hqStreet": "354 Oyster Point Blvd",
  "hqCity": "South San Francisco",
  "hqRegion": "California",
  "hqPostalCode": "94080",
  "hqCountry": "US",
  "companyType": "Privately Held",
  "founded": 2010,
  "specialties": [],
  "locations": [
    { "address": "354 Oyster Point Blvd, South San Francisco, California 94080, US", "isPrimary": true },
    { "address": "1 Wilton Park, Wilton Terrace, Dublin, County Dublin D02 FX04, IE", "isPrimary": false }
  ],
  "locationsCount": 14,
  "similarPages": [
    { "name": "Atlassian", "industry": "Software Development", "location": "Sydney, NSW", "linkedinUrl": "https://www.linkedin.com/company/atlassian" }
  ],
  "affiliatedPages": [
    { "name": "Stripe Support", "industry": "Technology, Information and Internet", "location": null, "linkedinUrl": "https://www.linkedin.com/showcase/stripe-support/" }
  ],
  "slug": "stripe",
  "inputUrl": "https://www.linkedin.com/company/stripe",
  "scrapedAt": "2026-09-30T12:00:00.000Z"
}
```

#### Field notes

- **`employeesOnLinkedin` vs `companySize`**: `employeesOnLinkedin` is the number of LinkedIn members who list the company as their employer. `companySize` is the band the company picked for itself. They often differ: large firms usually have more LinkedIn members than their band suggests (ex-employees and contractors), small firms fewer. Use the band for segmenting and the exact count for sorting.
- **`employeeCountMax`** is `null` for the top band (`10,001+ employees`).
- **`openJobsCount`** counts open jobs on LinkedIn worldwide. LinkedIn caps the display for very large employers, so `"2,000+"` in `openJobsCountText` becomes `2000`. `0` means LinkedIn found no open jobs. `null` means the lookup failed (listed under `jobsFailed` in `FAILED_URLS`), so it is unknown, not zero. Only jobs posted on LinkedIn are counted, not jobs that exist only on the company's own careers site. Showcase pages usually show `0`, because jobs are posted under the parent company.
- **`matchingJobs`** only lists jobs whose **title** contains one of `jobTitleWords`. LinkedIn's own keyword search also matches job descriptions (searching one company for "marketing" returned 26 sales and engineering jobs that only mention marketing in the text), so titles are checked word by word. The same role posted in several cities counts once per city, because LinkedIn lists each as its own job. `matchingJobsCapped: true` means `maxMatchingJobs` was reached and there may be more. `null` means the search failed (listed under `titleFailed` in `FAILED_URLS`).
- **`founded`** is a number (year). **`specialties`** is a list of strings.
- **`hqCountry`** is a two-letter country code.
- **`companyId`** may be `null` for showcase pages.
- Image URLs are served by LinkedIn's CDN and carry a signed token. Download them if you need permanent copies.

### Use cases

- **Account enrichment**: add headcount, industry, domain and HQ to a list of company LinkedIn URLs in Clay, Google Sheets or your CRM
- **Hiring signals**: find which accounts on your list are hiring right now and how much, then pull the jobs with `jobsUrl`
- **Lead scoring and segmentation**: filter by `employeeCountMin` / `employeeCountMax`, industry, country or founding year
- **Logo enrichment**: get logos for a customer list, a partner page or a CRM
- **Lookalike prospecting**: use `similarPages` to expand a list of ideal customers
- **Domain matching**: turn LinkedIn company URLs into clean domains for email finders
- **Market mapping**: see every office location for a list of competitors

### Works well with

- **LinkedIn Jobs Scraper**: find hiring companies from a job search, then feed their `companyLinkedinUrl` here for the full profile. Or go the other way: paste the `jobsUrl` from this Actor into its `searchUrls` to get every open job at a company
- **LinkedIn Job Description Scraper**: full details for job URLs you already have

### FAQ

**Do I need a LinkedIn account?** No. The Actor reads the public company page that anyone can see without logging in.

**Why is a company missing from the results?** Check the `FAILED_URLS` record in the run's key-value store. `notFound` means the slug does not exist on LinkedIn, often a typo or a company that renamed its page. `blocked` means LinkedIn refused the request; run those again.

**Can I pass a website domain instead of a LinkedIn URL?** No. The input must be a LinkedIn company URL or slug.

# Actor input Schema

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

One or more LinkedIn company page URLs or slugs. Any format works: linkedin.com/company/stripe, /company/stripe/about/, regional hosts (uk.linkedin.com), showcase pages, or just the slug (stripe). Duplicates are fetched once. School pages (/school/) are not supported.

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

Adds openJobsCount (number of open jobs on LinkedIn, worldwide), isHiring (true/false) and jobsUrl (a LinkedIn job search for this company; paste it into the LinkedIn Jobs Scraper to get every job). One extra request per company.

## `jobTitleWords` (type: `array`):

Check whether each company has open jobs whose TITLE contains any of these words, e.g. marketing, or account executive. Whole words, not case-sensitive: 'marketing' matches "Product Marketing Manager" but not "Growth Marketer", so add both words if you want both. Adds matchingJobsCount, hasMatchingJobs and the matching jobs (title, location, date, link). Leave empty to skip.

## `maxMatchingJobs` (type: `integer`):

Stop after this many matching jobs per company. 0 = all of them (up to LinkedIn's 1,000-result limit per word). Lower is faster for big employers.

## `includeSimilarPages` (type: `boolean`):

Adds similarPages (companies LinkedIn shows as similar, with industry and location) and affiliatedPages (subsidiaries and showcase pages). Useful for finding lookalike accounts. No extra requests either way.

## `proxyConfig` (type: `object`):

Residential proxies recommended. LinkedIn blocks datacenter IPs quickly on company pages.

## Actor input object example

```json
{
  "companyUrls": [
    "https://www.linkedin.com/company/stripe",
    "https://www.linkedin.com/company/hubspot/about/",
    "notionhq"
  ],
  "includeOpenJobs": true,
  "jobTitleWords": [
    "marketing",
    "marketer"
  ],
  "maxMatchingJobs": 25,
  "includeSimilarPages": true,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Company profiles with logo, headcount, followers, website, industry, HQ and locations

# 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",
        "https://www.linkedin.com/company/hubspot/about/",
        "notionhq"
    ],
    "includeOpenJobs": true,
    "jobTitleWords": [
        "marketing",
        "marketer"
    ],
    "maxMatchingJobs": 25,
    "includeSimilarPages": true,
    "proxyConfig": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("claygenius/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",
        "https://www.linkedin.com/company/hubspot/about/",
        "notionhq",
    ],
    "includeOpenJobs": True,
    "jobTitleWords": [
        "marketing",
        "marketer",
    ],
    "maxMatchingJobs": 25,
    "includeSimilarPages": True,
    "proxyConfig": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("claygenius/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",
    "https://www.linkedin.com/company/hubspot/about/",
    "notionhq"
  ],
  "includeOpenJobs": true,
  "jobTitleWords": [
    "marketing",
    "marketer"
  ],
  "maxMatchingJobs": 25,
  "includeSimilarPages": true,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call claygenius/linkedin-company-scraper --silent --output-dataset

```

## MCP server setup

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