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

The LinkedIn Company Jobs Scraper extracts every open role at named companies worldwide, capturing job titles, locations, posted dates, salaries, seniority, and applicant counts, plus each company’s industry, size, followers, and website — ideal for recruitment and sales prospecting.

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

## Pricing

from $0.40 / 1,000 job listings

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 Jobs Scraper

Name the companies, get every job they're advertising on LinkedIn. Export to JSON, CSV or Excel.

Point it at `stripe`, `vercel`, or any LinkedIn company profile URL, and it returns that company's open roles worldwide — deduplicated, with the company's full LinkedIn profile attached to every row at no extra charge.

Built for recruiters tracking who's hiring, sales teams prospecting on hiring signals, and analysts watching competitor headcount.

### ✨ Features

- **Worldwide by default.** Most LinkedIn scrapers quietly return only the jobs in whatever country their server happens to sit in. This one searches globally: Stripe returns **901** open roles worldwide instead of the 567 a US-scoped search sees, and IBM returns **1,000+** instead of 552.
- **Goes past the 1,000-result limit.** LinkedIn serves at most 1,000 results per search, however many jobs actually match. When a company has more, the search is automatically re-run across narrower posting-date windows and merged. Measured on Deloitte: **1,000 → 1,500+ unique roles.**
- **Deduplicated, always.** Every role appears once, keyed on its LinkedIn job ID.
- **Full company profile on every row, free.** Industry, employee count, followers, website, headquarters, founded year, company type and description — included with every job, not charged separately.
- **Several companies per run.** Every company is resolved by name and reported individually.
- **Two levels of depth**, so you pay for what you need:
  - **Listing** — title, location, posted date, job URL, plus the whole company profile
  - **+ Full details** — description, posted salary parsed into min/max/currency/period, seniority, employment type, job function, industries, applicant count, apply type
- **Tells you when a company can't be found.** A misspelled slug is named in the log and in `RUN_SUMMARY`, never silently dropped.
- **Honest reporting.** Every run writes a `RUN_SUMMARY` with the open-role count LinkedIn reports per company, how many were returned, and whether anything was truncated and why.
- **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. **Optionally narrow** by keyword, location, or how recently the role was posted.
3. **Choose depth** — listings only, or open each posting for full details.
4. **Run it.** Companies with more than 1,000 open roles are automatically split and merged.
5. **Export** to JSON, CSV, Excel, or pull from the API.

### 📋 Output Fields

#### Job (every run)

| Field           | Description                                     |
| --------------- | ----------------------------------------------- |
| `jobId`         | LinkedIn job posting ID — the deduplication key |
| `jobUrl`        | Canonical LinkedIn job URL                      |
| `title`         | Job title                                       |
| `location`      | Job location                                    |
| `postedDate`    | Posting date (YYYY-MM-DD)                       |
| `postedTimeAgo` | Relative posting age, e.g. "1 week ago"         |
| `sourceQuery`   | Which search this role came from                |
| `scrapedAt`     | ISO 8601 scrape timestamp                       |

#### Company (every run, no extra charge)

| Field                  | Description                                               |
| ---------------------- | --------------------------------------------------------- |
| `companyId`            | Numeric LinkedIn company ID                               |
| `companySlug`          | Company slug — stable join key across runs                |
| `companyUrl`           | Company LinkedIn profile URL                              |
| `companyName`          | Company name                                              |
| `companyLogo`          | Company logo image                                        |
| `companyTagline`       | Company tagline                                           |
| `companyDescription`   | Company About text                                        |
| `companyIndustry`      | Company industry                                          |
| `companyWebsite`       | Company website                                           |
| `companyHeadquarters`  | Headquarters location                                     |
| `companySize`          | Employee band as published, e.g. "5,001-10,000 employees" |
| `companyEmployeeCount` | Upper bound of that band, as a number                     |
| `companyFollowers`     | LinkedIn follower count                                   |
| `companyFounded`       | Year founded                                              |
| `companySpecialties`   | Company specialties                                       |
| `companyType`          | Public Company, Privately Held, ...                       |

#### Full details (optional)

| Field                             | Description                                            |
| --------------------------------- | ------------------------------------------------------ |
| `description`                     | Full job description text                              |
| `salaryText`                      | Posted salary range as displayed                       |
| `salaryMin` / `salaryMax`         | Parsed salary bounds                                   |
| `salaryCurrency` / `salaryPeriod` | Currency, and `year` / `hour` / `month`                |
| `seniorityLevel`                  | Entry level, Mid-Senior level, ...                     |
| `employmentType`                  | Full-time, Part-time, Contract, ...                    |
| `jobFunction`                     | Job function                                           |
| `industries`                      | Industries                                             |
| `applicantCount`                  | Applicant count as a number                            |
| `numApplicantsCaption`            | Applicant caption as displayed                         |
| `applyType`                       | `easyApply` or `offsite` (external application)        |
| `jobTitle` / `jobLocation`        | Title and location from the posting page               |
| `criteria`                        | Original name/value criteria list                      |
| `similarJobs`                     | Similar roles LinkedIn surfaces alongside this posting |
| `peopleAlsoViewed`                | Roles that viewers of this posting also viewed         |

Salary is only present where the employer posts it — common in the US, rare elsewhere. Fields with no data are `null`, never invented.

### 📊 Sample Output Data

Listing depth — one row, the whole company profile included:

```json
{
    "jobId": "4425602946",
    "jobUrl": "https://www.linkedin.com/jobs/view/4425602946",
    "title": "Staff Product Manager, Global Expansion",
    "location": "Bengaluru, Karnataka, India",
    "postedDate": "2026-07-25",
    "postedTimeAgo": "1 week ago",
    "companyName": "Stripe",
    "companyId": "2135371",
    "companySlug": "stripe",
    "companyUrl": "https://www.linkedin.com/company/stripe",
    "companyTagline": "Help increase the GDP of the internet.",
    "companyIndustry": "Technology, Information and Internet",
    "companyWebsite": "https://stripe.com",
    "companyHeadquarters": "South San Francisco, California",
    "companySize": "5,001-10,000 employees",
    "companyEmployeeCount": 10000,
    "companyFollowers": 1612641,
    "companyFounded": "2010",
    "companyType": "Privately Held",
    "sourceQuery": "geoId=92000000&f_C=2135371",
    "scrapedAt": "2026-08-06T04:47:15.660Z"
}
```

With full details turned on, each row also carries the description, parsed salary, seniority and applicant count:

```json
{
    "jobId": "4432896820",
    "title": "Software Engineer, Dashboard",
    "companyName": "Vercel",
    "salaryText": "$130,000.00 - $300,000.00",
    "salaryMin": 130000,
    "salaryMax": 300000,
    "salaryCurrency": "$",
    "salaryPeriod": "year",
    "seniorityLevel": "Mid-Senior level",
    "employmentType": "Full-time",
    "jobFunction": "Engineering",
    "industries": "Software Development",
    "applicantCount": 200,
    "applyType": "offsite"
}
```

### 💰 Pricing

Pay only for what you extract. **No per-run start fee.**

| Event                                 | Price (Free plan) | Price (Gold plan) |
| ------------------------------------- | ----------------- | ----------------- |
| Job listing *(incl. company profile)* | $0.0008           | $0.0004           |
| Job with full details                 | $0.003            | $0.0012           |

A 200-role run costs about **$0.16** on the Free plan for listings, or **$0.60** with full details — **$0.08 / $0.24** on Gold.

### ❓ 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.

**Why did a company return nothing?**
Either the slug is wrong, or the company genuinely has no open roles matching your filters. Unresolvable companies are named explicitly in the log and in `RUN_SUMMARY`; if every company fails, the run fails loudly rather than reporting an empty success.

**Why don't I get all the roles at a very large employer?**
LinkedIn serves 1,000 results per search. Splitting across posting-date windows multiplies what's reachable but doesn't make it unlimited. Add a location or a keyword to narrow the search and run it again. `RUN_SUMMARY` tells you exactly when and why a run stopped short.

**Can I filter by remote, job type or experience level?**
Not here, deliberately. LinkedIn accepts those filters alongside a company filter and then ignores them — every value returns the company's full, unfiltered result set. Offering them would hand you unfiltered data that looks filtered. Keyword, location and posted-within all genuinely narrow, so those are what's exposed.

**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 job data is collected.

**I want to search by keyword across all companies instead.**
Use the [LinkedIn Jobs Search Scraper](https://apify.com/piotrv1001/linkedin-jobs-search-scraper). For a single posting's full details, use the [LinkedIn Job Details Scraper](https://apify.com/piotrv1001/linkedin-job-details-scraper).

# 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/.

## `keywords` (type: `string`):

Optional. Only return roles matching this text, e.g. "engineer" or "marketing". Leave empty for every open role.

## `location` (type: `string`):

Optional. Only return roles in this location, as written on LinkedIn — a country, region or city (e.g. "United States", "Greater London", "Berlin, Germany"). Leave empty to search worldwide.

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

Only return roles posted in this window.

## `scrapeJobDetails` (type: `boolean`):

Off by default. When on, each role is opened for its description, posted salary, seniority level, employment type, job function, industries, applicant count and apply type. Slower, and charged at the higher per-job rate.

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

Stop after this many jobs in total, across all companies.

## `autoFanOut` (type: `boolean`):

LinkedIn serves at most 1,000 results per search. When a company has more open roles than that, this automatically re-runs the search across narrower posting-date windows and merges the results, removing duplicates. Only affects companies large enough to hit the ceiling.

## `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",
    "vercel"
  ],
  "postedWithin": "",
  "scrapeJobDetails": false,
  "maxItems": 200,
  "autoFanOut": true,
  "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",
        "vercel"
    ]
};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

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