# LinkedIn Jobs Scraper - Public Jobs, No Login (`faizjunsyar-dev/linkedin-jobs-public-scraper`) Actor

Extract public LinkedIn job listings by keyword and location. Get titles, companies, descriptions, employment types, seniority, industries, applicant counts, and canonical URLs without LinkedIn login or account cookies.

- **URL**: https://apify.com/faizjunsyar-dev/linkedin-jobs-public-scraper.md
- **Developed by:** [Faiz junsyar firjatullah](https://apify.com/faizjunsyar-dev) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 job results

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

Extract public LinkedIn job listings by keyword and location without providing a LinkedIn account, cookies, or credentials. The Actor can return lightweight search results or enrich every job with its public description and available criteria.

Use the dataset in job boards, labor-market research, recruiting workflows, competitive analysis, or data pipelines. Results are available as JSON, CSV, Excel, XML, RSS, and through the Apify API.

### What this Actor does

- Searches public job listings by keywords and location
- Filters by date posted and workplace type
- Collects up to 1,000 unique jobs per run
- Deduplicates results by LinkedIn job ID
- Optionally fetches job descriptions and criteria
- Uses controlled request pacing and retries temporary HTTP 429 responses
- Saves partial basic listings when a detail page is unavailable
- Supports Apify Proxy and custom proxy configurations
- Reduces planned work and stops cleanly when the run's maximum cost limit is reached

No LinkedIn login is required. The Actor does not solve CAPTCHAs or access private, authenticated, or restricted account data.

### Input

| Field | Type | Default | Description |
|---|---|---:|---|
| `keywords` | string | required | Job title or search terms, for example `Data Engineer`. |
| `location` | string | `Indonesia` | Country, city, or region. |
| `maxResults` | integer | `25` | Maximum number of unique jobs to save; range 1-1,000. |
| `datePosted` | string | `anyTime` | `anyTime`, `past24Hours`, `pastWeek`, or `pastMonth`. |
| `workplaceType` | string | `any` | `any`, `onSite`, `remote`, or `hybrid`. |
| `fetchDetails` | boolean | `true` | Fetch description and job criteria with an extra request per job. |
| `maxConcurrency` | integer | `1` | Maximum simultaneous detail requests. |
| `detailDelaySecs` | number | `3` | Minimum delay between the starts of detail requests. |
| `requestDelaySecs` | number | `1` | Delay between search-page requests. |
| `proxyConfiguration` | object | no proxy | Optional Apify Proxy or custom proxy settings. |

#### Example input

```json
{
  "keywords": "Data Engineer",
  "location": "Indonesia",
  "maxResults": 25,
  "datePosted": "pastWeek",
  "workplaceType": "any",
  "fetchDetails": true,
  "maxConcurrency": 1,
  "detailDelaySecs": 3,
  "requestDelaySecs": 1,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

### Output

Each dataset item can contain the following fields. Some detail fields may be empty when LinkedIn does not publish them or temporarily blocks the detail request.

| Field | Description |
|---|---|
| `job_id` | LinkedIn job identifier |
| `title` | Job title |
| `company_name` | Hiring company |
| `company_url` | Public LinkedIn company URL |
| `location` | Advertised job location |
| `posted_at` | Published date when available |
| `employment_type` | Full-time, contract, internship, or another published type |
| `seniority_level` | Published seniority criterion |
| `job_function` | Published job function |
| `industries` | Published industry criterion |
| `applicant_count` | Public applicant-count text when available |
| `job_url` | Canonical public job URL |
| `description` | Plain-text public job description |
| `scraped_at` | UTC timestamp when the item was processed |

#### Example output

```json
{
  "job_id": "1234567890",
  "title": "Data Engineer",
  "company_name": "Example Company",
  "company_url": "https://www.linkedin.com/company/example-company",
  "location": "Jakarta, Indonesia",
  "posted_at": "2026-09-15",
  "employment_type": "Full-time",
  "seniority_level": "Mid-Senior level",
  "job_function": "Information Technology",
  "industries": "Technology",
  "applicant_count": "42 applicants",
  "job_url": "https://www.linkedin.com/jobs/view/1234567890",
  "description": "Build and maintain reliable data pipelines.",
  "scraped_at": "2026-09-15T08:30:00+00:00"
}
```

### Run with the Apify API

Replace `YOUR_USERNAME` and `YOUR_TOKEN` with your Apify account details:

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/YOUR_USERNAME~linkedin-jobs-public-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords":"Data Engineer","location":"Indonesia","maxResults":25}'
```

You can also call the Actor from Apify clients for Python or JavaScript, schedules, webhooks, Make, Zapier, or other automation tools.

### Pricing

The Actor is designed for simple pay-per-result pricing: one chargeable result corresponds to one job written to the default dataset. The final price shown on the Actor page is the source of truth. Runs that return no dataset items do not incur result charges, although platform rules may apply to run-start events.

### Tips for reliable runs

Start with `maxResults` set to 25 and keep `maxConcurrency` at 1 when `fetchDetails` is enabled. If detail requests receive HTTP 429 responses, increase `detailDelaySecs` to 5-10 seconds, narrow the search, or use an appropriate proxy available to your Apify account.

Set `fetchDetails` to `false` when you only need titles, companies, locations, dates, and URLs. This mode is faster and makes fewer public requests.

### Limitations and responsible use

This Actor relies on public LinkedIn pages that are not documented as a stable public API. LinkedIn may change the HTML structure, return different results by region or IP address, limit the number of results, or temporarily reject requests. Therefore, the Actor cannot guarantee that it will return every job visible to a logged-in LinkedIn user.

Use the Actor responsibly and only for lawful purposes. You are responsible for complying with applicable laws, privacy obligations, and website terms. Do not use the output for spam, harassment, discrimination, or decisions that require data LinkedIn has not made public.

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by LinkedIn.

### Support

If a run fails, share the run ID, input with secrets removed, expected behavior, and a short description of the problem through the Actor's Issues tab. Do not post API tokens, cookies, personal credentials, or other secrets.

# Changelog

This Actor's version history is a separate document: https://apify.com/faizjunsyar-dev/linkedin-jobs-public-scraper/changelog.md

# Actor input Schema

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

Job title or search terms, for example Data Engineer.

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

Country, city, or region.

## `maxResults` (type: `integer`):

Maximum number of unique jobs to save.

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

Only return jobs posted within this period.

## `workplaceType` (type: `string`):

Filter by on-site, remote, or hybrid jobs.

## `fetchDetails` (type: `boolean`):

Fetch description and job criteria. This makes one additional request per job.

## `maxConcurrency` (type: `integer`):

Maximum detail requests in flight. Request starts are also spaced by the detail delay.

## `detailDelaySecs` (type: `number`):

Minimum delay in seconds between the start of two detail requests.

## `requestDelaySecs` (type: `number`):

Delay in seconds between search page requests.

## `proxyConfiguration` (type: `object`):

Optional Apify Proxy or custom proxy configuration.

## Actor input object example

```json
{
  "keywords": "Data Engineer",
  "location": "Indonesia",
  "maxResults": 25,
  "datePosted": "anyTime",
  "workplaceType": "any",
  "fetchDetails": true,
  "maxConcurrency": 1,
  "detailDelaySecs": 3,
  "requestDelaySecs": 1,
  "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 = {
    "keywords": "Data Engineer",
    "location": "Indonesia"
};

// Run the Actor and wait for it to finish
const run = await client.actor("faizjunsyar-dev/linkedin-jobs-public-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 = {
    "keywords": "Data Engineer",
    "location": "Indonesia",
}

# Run the Actor and wait for it to finish
run = client.actor("faizjunsyar-dev/linkedin-jobs-public-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 '{
  "keywords": "Data Engineer",
  "location": "Indonesia"
}' |
apify call faizjunsyar-dev/linkedin-jobs-public-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,faizjunsyar-dev/linkedin-jobs-public-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/Go9y6v8BSjqdKdPNf/builds/IcuDupd6pacV2vYrZ/openapi.json
