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

Paste LinkedIn company URLs, get every open job at each company with full description, salary, seniority, applicants and company data. Filter by job title words, location and date. No login.

- **URL**: https://apify.com/claygenius/linkedin-company-jobs-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 Jobs Scraper

Paste LinkedIn company links, get **every open job at each company**: title, location, exact posted date, **full job description**, salary when published, seniority, employment type, job function, applicant count, apply method and the recruiter when shown, plus the company's domain, industry and size on every row. No login, no browser, very low cost per result.

Built for hiring signals and account research: give it your target accounts and see exactly what each one is hiring for, or only the roles you care about ("marketing", "account executive", "engineer").

### Features

- 🏢 **Company in, jobs out**: paste `linkedin.com/company/telnyx`, `/company/telnyx/jobs/`, `/about/`, a regional host, or just the slug (`telnyx`)
- ✅ **Every job, not a sample**: the Actor reads the company's open-job total first and keeps paging until it has them all (LinkedIn serves up to 1,000 per search)
- 🔎 **Filter by words in the job title**: keep only jobs whose **title** contains `marketing`, `account executive`, … and skip titles with `intern`, `senior`, … LinkedIn's own keyword search also matches descriptions (one company's "marketing" search returned 26 sales and engineering jobs), so titles are checked word by word
- 🌍 **Location and date filters**: only jobs in `United States`, `London`, `Germany`…, and only jobs posted in the past 24 hours, week or month
- 📄 **Full job details**: plain-text and HTML description, salary, seniority, employment type, job function, industries, applicant count, external vs Easy Apply, closed flag, job poster. Switch off for a fast list of titles and links
- 🏷️ **Company data on every row**: name, LinkedIn ID, logo, website, **domain**, industry, size band, employees on LinkedIn, headquarters and total open jobs
- 📊 **Per-company summary**: the key-value store record `COMPANY_SUMMARY` lists each company's open-job total and how many jobs were saved, including companies with **zero** matching jobs, so "not hiring" is an answer, not a missing row
- ✅ **Standard field names**: `id`, `link`, `companyName`, `salaryInfo`, `postedAt`, `descriptionText`, `industries`, `applicantsCount`, `companyEmployeesCount`, `applyMethod`, the same as the LinkedIn Jobs Scraper, so rows merge in one sheet
- 🧾 **Failure report**: companies that do not exist or could not be fetched are listed in `FAILED_URLS`, never silently dropped
- ✅ **No login required**: reads public LinkedIn pages, so no account can get banned

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `companyUrls` | array | 2 example companies | LinkedIn company URLs or slugs, one per line. Duplicates are fetched once. `/school/` pages are not supported |
| `jobTitleWords` | array | empty | Keep only jobs whose title contains any of these words. Whole words, not case-sensitive. Empty = every job |
| `excludeTitleWords` | array | empty | Drop jobs whose title contains any of these words. Wins over `jobTitleWords` |
| `location` | string | empty | Only jobs in this place (`United States`, `London`). Empty = worldwide |
| `postedWithin` | select | Any time | Past 24 hours, past week or past month |
| `maxJobsPerCompany` | integer | `0` | Stop after this many jobs per company. `0` = all |
| `fetchJobDetails` | boolean | `true` | Full description and criteria. One extra request per job. Off = title, location, date and link only |
| `proxyConfig` | proxy | Residential | Residential is the default; datacenter IPs get blocked quickly |

#### Example input

```json
{
  "companyUrls": [
    "https://www.linkedin.com/company/telnyx/jobs/",
    "https://www.linkedin.com/company/hubspot",
    "stripe"
  ],
  "jobTitleWords": ["marketing", "marketer"],
  "excludeTitleWords": ["intern"],
  "location": "United States",
  "postedWithin": "r604800",
  "maxJobsPerCompany": 0,
  "fetchJobDetails": true
}
```

### Output

One record per job. Fields LinkedIn does not show for a job are `null`.

```json
{
  "id": "4466413547",
  "title": "Founding Account Executive, Singapore",
  "location": "Singapore",
  "postedAt": "2026-09-12",
  "link": "https://www.linkedin.com/jobs/view/4466413547",
  "postedRelative": "2 weeks ago",
  "salaryInfo": null,
  "applicantsCount": "36 applicants",
  "applyMethod": "external",
  "isClosed": false,
  "seniorityLevel": "Associate",
  "employmentType": "Full-time",
  "jobFunction": null,
  "industries": "Software Development",
  "jobPosterName": null,
  "jobPosterTitle": null,
  "jobPosterProfileUrl": null,
  "descriptionText": "About Telnyx\n\nTelnyx is an industry leader that's not just imagining the future of global connectivity...",
  "descriptionHtml": "<strong>About Telnyx<br><br></strong><em>Telnyx is an industry leader...",
  "matchedWords": [],
  "companyName": "Telnyx",
  "companyId": "3349412",
  "companyLinkedinUrl": "https://www.linkedin.com/company/telnyx",
  "companyLogo": "https://media.licdn.com/dms/image/v2/.../telnyx_logo",
  "companyWebsite": "http://www.telnyx.com",
  "companyDomain": "telnyx.com",
  "companyIndustry": "Software Development",
  "companyEmployeesCount": "201-500 employees",
  "companyEmployeesOnLinkedin": 415,
  "companyHeadquarters": "Austin, Texas",
  "companyOpenJobsCount": 71,
  "jobsSearchUrl": "https://www.linkedin.com/jobs/search?f_C=3349412&geoId=92000000",
  "inputUrl": "https://www.linkedin.com/company/telnyx/jobs/",
  "scrapedAt": "2026-10-01T01:50:11.708Z"
}
```

#### Per-company summary (`COMPANY_SUMMARY`)

```json
[
  { "inputUrl": "https://www.linkedin.com/company/telnyx/jobs/", "companyName": "Telnyx", "openJobsCount": 71, "jobsSaved": 71, "status": "ok" },
  { "inputUrl": "https://www.linkedin.com/company/andrews-biernacki-davis", "companyName": "ANDREWS BIERNACKI DAVIS", "openJobsCount": 0, "jobsSaved": 0, "status": "ok" }
]
```

#### Field notes

- **`postedAt`** is the exact date from the listing. `postedRelative` is LinkedIn's "2 weeks ago" text.
- **`matchedWords`** lists which of your `jobTitleWords` the title contains (empty when you did not filter).
- **`companyOpenJobsCount`** is the company's total under your location and date filters, before title filtering. LinkedIn shows `1,000+` for very large employers, stored as `1000`.
- **One posting per city**: LinkedIn lists the same role in five cities as five jobs, each with its own `id`, so each is its own row.
- **Over 1,000 jobs**: LinkedIn serves at most 1,000 results per search. For very large employers, narrow with `location`, `postedWithin` or `jobTitleWords`.
- **`status`** in `COMPANY_SUMMARY`: `ok`, `partial` (a page failed part-way, the jobs found so far were kept), `not_found`, `failed`.
- Only jobs posted **on LinkedIn** are included, not jobs that exist only on a company's own careers site.

### Use cases

- **Hiring signals for sales**: see which target accounts are hiring for the role you sell to (a new "Head of Marketing" or a batch of SDRs)
- **Competitor tracking**: every open role at your competitors, refreshed on a schedule
- **Recruiting research**: what a company hires for, where, at what seniority and with what salary
- **Account enrichment**: add live job openings to accounts in Clay, Google Sheets or your CRM

### Works well with

- **LinkedIn Company Scraper**: firmographics, logo, headcount and a quick hiring check for a list of companies
- **LinkedIn Jobs Scraper**: jobs from a keyword or location search instead of a company list

### FAQ

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

**Why does a company show 0 jobs?** It has no open jobs on LinkedIn under your filters. Check `COMPANY_SUMMARY`: `openJobsCount` is the total before title filtering, so `openJobsCount: 40, jobsSaved: 0` means it is hiring, just not for the titles you asked for.

**Can I pass a website domain instead of a LinkedIn URL?** No. Use the LinkedIn Company Scraper's output, or find the company's LinkedIn page first.

# Actor input Schema

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

One or more LinkedIn company URLs or slugs. Any format works: linkedin.com/company/telnyx, /company/telnyx/jobs/, /company/telnyx/about/, regional hosts (uk.linkedin.com), or just the slug (telnyx). Duplicates are fetched once.

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

Keep only 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 if you want both. Leave empty for every job.

## `excludeTitleWords` (type: `array`):

Drop jobs whose title contains any of these words, e.g. intern or contract. Same whole-word rule. Wins over the list above.

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

Only jobs in this place, as you would type it on LinkedIn: United States, London, Germany. Leave empty for worldwide.

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

Only jobs posted in this period.

## `maxJobsPerCompany` (type: `integer`):

Stop after this many jobs per company. 0 or empty = all of them (LinkedIn serves up to 1,000 per search).

## `fetchJobDetails` (type: `boolean`):

Adds the full description, salary, seniority, employment type, job function, industries, applicant count, apply method and job poster. One extra request per job. Turn off for a fast list of titles, locations, dates and links only.

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

Residential proxies recommended. LinkedIn blocks datacenter IPs quickly.

## Actor input object example

```json
{
  "companyUrls": [
    "https://www.linkedin.com/company/telnyx/jobs/",
    "https://www.linkedin.com/company/hubspot"
  ],
  "jobTitleWords": [
    "engineer",
    "marketing"
  ],
  "excludeTitleWords": [],
  "location": "",
  "postedWithin": "",
  "maxJobsPerCompany": 10,
  "fetchJobDetails": true,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `jobs` (type: `string`):

Open jobs with title, location, posted date, full description, criteria and company data

# 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/telnyx/jobs/",
        "https://www.linkedin.com/company/hubspot"
    ],
    "jobTitleWords": [
        "engineer",
        "marketing"
    ],
    "maxJobsPerCompany": 10,
    "fetchJobDetails": true,
    "proxyConfig": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("claygenius/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 = {
    "companyUrls": [
        "https://www.linkedin.com/company/telnyx/jobs/",
        "https://www.linkedin.com/company/hubspot",
    ],
    "jobTitleWords": [
        "engineer",
        "marketing",
    ],
    "maxJobsPerCompany": 10,
    "fetchJobDetails": True,
    "proxyConfig": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

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

```

## MCP server setup

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