# LinkedIn Jobs Scraper (Cheap) — Public Job Postings, No Login (`istmobot/linkedin-jobs-scraper-cheap`) Actor

Low-cost LinkedIn jobs scraper with no login or cookies. Paste a public job search URL or use filters. Returns title, company, location, salary, applicants, description, seniority, employment type, job poster and company details. $0.55 per 1,000 jobs.

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

## Pricing

from $0.55 / 1,000 jobs

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

## LinkedIn Jobs Scraper (Cheap): Public Job Postings, No Login

**A cheaper alternative to the popular LinkedIn jobs scrapers on Apify, with the same main input and the same output fields.** Paste the input you already use (`urls`, `limitPerSource`, `keywords`, `location`...) and get jobs with the same field names and order. It reads only LinkedIn's public, logged-out job and company pages: no account and no cookies.

### Price

| | This Actor | Popular LinkedIn jobs scraper, paid Apify plans | Same scraper, free Apify plan |
|---|---|---|---|
| 1,000 jobs | **$0.55** | $1.00 | $2.00 |
| 10,000 jobs | **$5.50** | $10.00 | $20.00 |
| Actor start | $0.0005 | $0.00005 | $0.00005 |
| Company details | included | included | included |

Failed jobs (error rows) are free here. Other Actor's prices as listed on Apify on 2026-11-05.

This Actor is cheaper from 2 jobs per run against paid plans, and from the first job against the free plan.

### What data do you get?

One record per job:

- `id`, `trackingId`, `refId`, `link`, `title`
- `companyName`, `companyLinkedinUrl`, `companyLogo`
- `location`, `postedAt`, `benefits` (e.g. "Actively Hiring")
- `descriptionHtml`, `descriptionText`
- `applicantsCount` (string, e.g. "25"; "200" means over 200), `applyUrl` (always empty when logged out), `salary`
- `jobPosterName`, `jobPosterTitle`, `jobPosterPhoto`, `jobPosterProfileUrl` (only when the posting shows a poster)
- `seniorityLevel`, `employmentType`, `industries`, and `jobFunction` when the posting shows it
- `inputUrl`
- `companyAddress`, `companyWebsite`, `companySlogan`, `companyDescription`, `companyEmployeesCount` (when `scrapeCompany` is on, the default, and the company page shows them)

```json
{
  "id": "4432486930",
  "link": "https://www.linkedin.com/jobs/view/senior-python-developer-at-unis-4432486930?position=10&pageNum=0",
  "title": "Senior python developer",
  "companyName": "UNIS",
  "location": "Irvine, CA",
  "postedAt": "2026-06-24",
  "benefits": [],
  "applicantsCount": "108",
  "applyUrl": "",
  "salary": "$60.00/hr - $100.00/hr",
  "seniorityLevel": "Not Applicable",
  "employmentType": "Full-time",
  "industries": "Truck Transportation"
}
```

### Input

Either search URLs:

```json
{ "urls": ["https://www.linkedin.com/jobs/search/?keywords=python%20developer&location=United%20States"], "limitPerSource": 100 }
```

Or filters, when `urls` is empty: `keywords`, `location`, `geoId`, `distance`, `datePosted`, `companyIds`, `under10Applicants`.

Get the URL from an incognito window at https://www.linkedin.com/jobs/search, so that it is the public version of the search. Classic URL filters such as `f_E`, `f_JT` and `f_WT` go straight to the public search.

### Get only new jobs on a schedule

Set `datePosted` to `past24Hours` (or `f_TPR=r86400` in the URL) and schedule a daily run. Jobs seen in two searches of one run are returned once.

### Limits

- LinkedIn's public search stops at about 1,000 jobs per search. Splitting a search by city (`splitByLocation`) is not supported; pass several URLs with different locations instead.
- `autoConvertToAiSearch` is accepted but does nothing.
- If a company page cannot be read after several attempts, its jobs are still returned, without the company fields. The run log shows how many.
- Results are what a logged-out visitor sees, which can differ from a logged-in search.
- A search with no match can return LinkedIn's generic suggestions instead of nothing.
- Job poster fields are personal data. Handle them according to the privacy rules that apply to you.

# Actor input Schema

## `urls` (type: `array`):

Open https://www.linkedin.com/jobs/search in an incognito window, apply your filters and copy the URL from the address bar. You can pass several. When URLs are provided, the filters below are ignored.

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

Job title, skills or free text. Used only when the URLs list is empty.

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

City, region or country as you would type it on LinkedIn.

## `geoId` (type: `string`):

Optional LinkedIn geoId for precise location targeting (geoId= in a search URL).

## `distance` (type: `integer`):

Search radius in miles around the location.

## `datePosted` (type: `string`):

Only return jobs posted within this window. Use it on a daily schedule to get only new jobs.

## `companyIds` (type: `array`):

LinkedIn numeric company IDs (f_C= in a search URL), e.g. "1441" for Google.

## `under10Applicants` (type: `boolean`):

Only jobs with fewer than 10 applicants.

## `autoConvertToAiSearch` (type: `boolean`):

Accepted so existing inputs keep working. It changes nothing: classic URL filters (experience, job type, workplace...) go straight to the public search.

## `scrapeCompany` (type: `boolean`):

Adds companyAddress, companyWebsite, companySlogan, companyDescription and companyEmployeesCount from the public company page, at no extra charge. Each company is fetched once per run. Turn it off for faster runs.

## `limitPerSource` (type: `integer`):

Maximum jobs from each URL (or from the filters). Leave empty for everything LinkedIn returns, up to ~1000 per search.

## Actor input object example

```json
{
  "urls": [
    "https://www.linkedin.com/jobs/search/?keywords=python%20developer&location=United%20States"
  ],
  "datePosted": "anyTime",
  "companyIds": [],
  "under10Applicants": false,
  "autoConvertToAiSearch": true,
  "scrapeCompany": true,
  "limitPerSource": 100
}
```

# 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 = {
    "urls": [
        "https://www.linkedin.com/jobs/search/?keywords=python%20developer&location=United%20States"
    ],
    "limitPerSource": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("istmobot/linkedin-jobs-scraper-cheap").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 = {
    "urls": ["https://www.linkedin.com/jobs/search/?keywords=python%20developer&location=United%20States"],
    "limitPerSource": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("istmobot/linkedin-jobs-scraper-cheap").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 '{
  "urls": [
    "https://www.linkedin.com/jobs/search/?keywords=python%20developer&location=United%20States"
  ],
  "limitPerSource": 100
}' |
apify call istmobot/linkedin-jobs-scraper-cheap --silent --output-dataset

```

## MCP server setup

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

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/s7H94WE4pKzIr7IDb/builds/h2vrZH5gDIkjtaFwU/openapi.json
