# LinkedIn Company Jobs Scraper 🏢 (every open role, one company) (`tagadanar/linkedin-company-jobs`) Actor

Every live job posting for a company on LinkedIn, with full descriptions. Give a company name, LinkedIn URL, or numeric company ID and get all its current openings in clean JSON: title, location, posting date, seniority, and the link to apply. Track a competitor's hiring, no login, no API key.

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

## Pricing

from $1.40 / 1,000 job scrapeds

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

See every role a company currently has open on LinkedIn. Give a company name, its LinkedIn URL, or its numeric LinkedIn company ID, and get back every live job posting: title, location, posting date, and the direct link to apply. Switch on full descriptions and every row also carries the complete job text, seniority level, employment type, job function, industry and the current applicant count.

This is the tool for watching one company's hiring, not searching all of LinkedIn by keyword. A recruiter tracking a client, a sales rep watching a target account, or a job seeker following a short list of employers all want the same thing: every current opening at a specific company, refreshed on demand.

No login. No cookies to paste. No API key. One clear price per job, with platform usage already included.

This actor scrapes public job postings and the hiring company only. It does not collect personal profiles, applicants, or the individual who posted the job.

### How company resolution works

LinkedIn's job search filters by a numeric company ID, not by name, so the actor has to find that ID first:

- **A numeric ID** (e.g. `1035`) is used as-is.
- **A LinkedIn URL** that already names the company (a company page like `https://www.linkedin.com/company/microsoft/`, or a jobs search URL with a company filter already in it) is read directly: no extra lookup needed.
- **A bare name** (e.g. `Microsoft`) is resolved automatically: the actor runs one LinkedIn jobs search for that name and looks at which company's postings dominate the results, then confirms that company's numeric ID from its own LinkedIn page.

Every output row carries `inputCompany` (what you typed), `resolvedCompanyId`, `resolvedCompanyName`, `resolutionMethod` (how it was matched) and, for a name-based match, `resolutionConfidence` (the share of the search results that belonged to the winning company, 0 to 1). Check these on the first run with a new name; if the match is not what you meant, paste the company's LinkedIn URL or numeric ID instead and it will be used exactly, with no search or guessing involved.

### What you get

One record per job posting:

| Field | Description |
| --- | --- |
| `jobId` | LinkedIn job posting ID |
| `title` | Job title |
| `jobUrl` | Direct link to the public job posting |
| `companyName` | Hiring company as shown on the job card |
| `companyUrl` | The company's LinkedIn page |
| `companySlug` | Company handle from its URL |
| `companyLogoUrl` | Company logo image |
| `location` | Location as shown on the posting |
| `postedAt` | Posting age in the site's own words (e.g. "2 days ago") |
| `postedDate` | Posting date as ISO `YYYY-MM-DD` |
| `isNew` | Flagged as newly posted by LinkedIn |
| `benefits` | Any badge on the card (e.g. "Actively Hiring") |
| `inputCompany` | The company exactly as you entered it |
| `resolvedCompanyId` | The numeric LinkedIn company ID the search actually ran against |
| `resolvedCompanyName` | The resolved company's name |
| `resolutionMethod` | `id`, `url-f_C`, `url-numeric-path`, `url-company-page`, or `name-search` |
| `resolutionConfidence` | For `name-search` only: how dominant the matched company was in the search results (0 to 1) |
| `source` | `linkedin.com` |
| `scrapedAt` | When the row was collected (ISO) |

With **Add full job descriptions** switched on, every row also gets:

| Field | Description |
| --- | --- |
| `description` | Full job description text |
| `descriptionHtml` | The same description with its original formatting |
| `seniorityLevel` | e.g. Entry level, Mid-Senior level, Director |
| `employmentType` | Full-time, Part-time, Contract, and so on |
| `jobFunction` | The job function LinkedIn assigns |
| `industries` | The hiring company's industry |
| `applicantsCount` | How many people have applied so far |
| `applicantsCaption` | Applicant count in the site's own words |

Descriptions are billed as a small extra, and only when the extra data is actually found. A posting with nothing extra to return costs you nothing beyond the base job.

### Who uses this

- **Recruiters and staffing agencies:** watch a client's open roles and how they change week to week.
- **Sales and lead-gen teams:** a growing headcount at a target account is a buying signal. Track how many roles a prospect has open and in which functions before you reach out.
- **Competitive intelligence:** see exactly what a competitor is hiring for, and in which locations, as a proxy for where they are investing.
- **Job seekers and career coaches:** follow a short list of employers and catch every new opening the moment it is posted.

### Turn a hiring company into a full lead

To go from a hiring company to a legal entity and a real contact, pass `resolvedCompanyName` into a sibling actor:

- [French Company KYC](https://apify.com/tagadanar/french-company-kyc): resolve a French hiring company to its SIREN/SIRET, officers and BODACC status for due diligence.
- [French Company Email Finder](https://apify.com/tagadanar/french-company-contacts): find the SIREN, dirigeants and contact emails for a French hiring company, ready for outreach.

### Input examples

Copy any of these into the input, or use the visual form.

**By company name:**

```json
{
  "companies": ["Microsoft"],
  "maxPerCompany": 50
}
```

**By LinkedIn company URL, with full descriptions:**

```json
{
  "companies": ["https://www.linkedin.com/company/microsoft/"],
  "withDescription": true,
  "maxPerCompany": 100
}
```

**Several companies, new postings only, run it daily as a hiring monitor:**

```json
{
  "companies": ["Microsoft", "https://www.linkedin.com/company/google/", "1441"],
  "postedSince": "24h",
  "maxPerCompany": 200
}
```

### Output sample

```json
{
  "jobId": "4438655931",
  "title": "Software Engineer",
  "jobUrl": "https://www.linkedin.com/jobs/view/4438655931",
  "companyName": "Microsoft",
  "companyUrl": "https://www.linkedin.com/company/microsoft",
  "companySlug": "microsoft",
  "companyLogoUrl": "https://media.licdn.com/dms/image/v2/D4E0BAQH8a1b2c3d/company-logo_100_100/0/1712345678.png",
  "location": "Paris, Île-de-France, France",
  "postedAt": "2 days ago",
  "postedDate": "2026-07-09",
  "isNew": true,
  "benefits": "Actively Hiring",
  "inputCompany": "Microsoft",
  "resolvedCompanyId": "1035",
  "resolvedCompanyName": "Microsoft",
  "resolutionMethod": "name-search",
  "resolutionConfidence": 0.8,
  "source": "linkedin.com",
  "scrapedAt": "2026-08-20T09:14:22.317Z"
}
```

### Pricing

You pay per job returned, and a small extra only for jobs where full-description enrichment actually found data. Platform usage is included in the price, so there is no subscription. Company resolution itself is never billed, whether the company was given as a name, a URL or an ID.

| Event | Price |
| --- | --- |
| Actor start | $0.001 per run |
| Job scraped | $2.00 per 1,000 |
| Job details | $2.00 per 1,000 (only with **Add full job descriptions**, and only when the extra data was found) |

The tiny start fee covers runs that return nothing; on any normal search it is noise next to the per-job price.

### FAQ

**Do I need a LinkedIn account or a cookie?**
No. This reads LinkedIn's public jobs and company pages, so there is no login, no session cookie and no API key to manage.

**Does it scrape people or applicants?**
No. It collects the public job posting and the hiring company only. It never collects personal profiles, the names of applicants, or the person who posted the role.

**What if I type a company name and it resolves to the wrong company?**
Check `resolvedCompanyName` and `resolutionConfidence` on the first row. If it is not what you meant, paste the exact LinkedIn company URL (or its numeric ID, found in the URL after `/company/` when the company uses a numeric handle, or in a job search URL after `f_C=`) instead of the name; that path skips the search entirely and always uses exactly the company you specify.

**How many jobs can I get per company?**
Set **Max jobs per company**. LinkedIn serves a few hundred results per company before it stops paginating; most companies' current openings fit well inside that.

**How do I only get brand-new postings?**
Set **Posted since** to the last 24 hours and schedule the run. Each run returns only what LinkedIn currently shows in that window, so a daily 24-hour run is a simple new-jobs-at-this-company monitor.

**Can I get the full job description and how many people applied?**
Yes. Switch on **Add full job descriptions**. Each job then includes the full description, seniority, employment type, job function, industry and the live applicant count. This opens each posting individually, so it is a little slower and costs a small extra per enriched job.

**How is it priced?**
You pay per job returned, and the LinkedIn page fetching (including resolving a company name) is already included in that price, so there are no separate platform bills to reconcile.

**Is the data structured?**
Yes. Every run produces one flat JSON or CSV row per job with the same fields, ready for a spreadsheet, a CRM import or a database.

### Related actors

- [LinkedIn Jobs Scraper](https://apify.com/tagadanar/linkedin-jobs-scraper): search all of LinkedIn by keyword and location, across every company.
- [French Company KYC](https://apify.com/tagadanar/french-company-kyc): SIREN/SIRET, officers and BODACC status for a French company.
- [French Company Email Finder](https://apify.com/tagadanar/french-company-contacts): dirigeants and contact emails for a French company.

***

LinkedIn company jobs scraper, company hiring tracker LinkedIn, LinkedIn jobs by company, track competitor hiring, LinkedIn open roles scraper, hiring signal LinkedIn, LinkedIn jobs API alternative, company job listings export, recruitment intelligence, sales trigger hiring data.

# Actor input Schema

## `companies` (type: `array`):

One entry per company: a company name (e.g. <code>Microsoft</code>), a LinkedIn company URL (e.g. <code>https://www.linkedin.com/company/microsoft/</code>), or a numeric LinkedIn company ID. A bare name is matched to a real company by searching LinkedIn's own jobs listings and taking the company that dominates the results; the resolved company (and how confident the match is) is included on every output row so you can verify it or switch to the exact URL/ID next time.

## `postedSince` (type: `string`):

Only jobs posted recently. Set it to the last 24 hours and re-run daily to track a company's new openings.

## `withDescription` (type: `boolean`):

Open each posting to also collect its full description text, seniority level, employment type, job function, industries and applicant count. Slower and billed as a small extra per enriched job. Leave off for a fast title + link list.

## `maxPerCompany` (type: `integer`):

Stop after this many jobs for each company. You are only charged for jobs actually delivered.

## Actor input object example

```json
{
  "companies": [
    "https://www.linkedin.com/company/microsoft/"
  ],
  "postedSince": "any",
  "withDescription": false,
  "maxPerCompany": 25
}
```

# Actor output Schema

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

One item per job in the default dataset.

# 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": [
        "https://www.linkedin.com/company/microsoft/"
    ],
    "maxPerCompany": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/linkedin-company-jobs").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": ["https://www.linkedin.com/company/microsoft/"],
    "maxPerCompany": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/linkedin-company-jobs").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 '{
  "companies": [
    "https://www.linkedin.com/company/microsoft/"
  ],
  "maxPerCompany": 25
}' |
apify call tagadanar/linkedin-company-jobs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tagadanar/linkedin-company-jobs"
        }
    }
}

```

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/uNbNqLW6fu2DTFmeI/builds/sHeQWeSNexrQQ0MQf/openapi.json
