# LinkedIn Jobs Scraper by Keyword (`apt_marble/linkedin-jobs-scraper-by-keyword`) Actor

🔍 Scrape LinkedIn job listings by keyword, location, or company. Extract job titles, companies, locations, descriptions, posted dates, and more, perfect for recruitment, lead generation, and job market research 🚀

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

## Pricing

$4.50 / 1,000 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Jobs Scraper by Keyword

Search LinkedIn jobs by keyword across location, country, time range, employment type, experience level, remote mode, and more. For each search, the Actor returns one record per matching job — title, company, location, salary, applicant count, full HTML description, apply link, and 29 fields total.

### What this Actor does

For each search query you submit (keyword + optional filters), the Actor asks the data provider to discover matching LinkedIn jobs and returns one record per result. Each row includes a `discovery_input` field so you can tell which search query produced it — useful when running multiple searches at once.

### Input

| Field              | Type             | Required | Default | Description                                                                                            |
| ------------------ | ---------------- | -------- | ------- | ------------------------------------------------------------------------------------------------------ |
| `keyword`          | string           | yes      | —       | Job title or search term. Wrap in escaped quotes for exact-match: `"\"python developer\""`.          |
| `location`         | string           | no       | `""`    | City or region, e.g. `"Paris"`, `"New York"`. Leave empty for the entire country.                     |
| `country`          | string           | no       | `""`    | ISO country code, e.g. `"US"`, `"FR"`, `"GB"`. Leave empty for any.                                    |
| `time_range`       | enum             | no       | `""`    | `(any time)`, `Past 24 hours`, `Past week`, `Past month`                                              |
| `job_type`         | enum             | no       | `""`    | `(any type)`, `Full-time`, `Part-time`, `Contract`, `Temporary`, `Volunteer`, `Internship`, `Other`     |
| `experience_level` | enum             | no       | `""`    | `(any level)`, `Internship`, `Entry level`, `Associate`, `Mid-Senior level`, `Director`, `Executive`   |
| `remote`           | enum             | no       | `""`    | `(any)`, `On-site`, `Remote`, `Hybrid`                                                                 |
| `company`          | string           | no       | `""`    | Restrict to a specific company name. Leave empty for any.                                              |
| `location_radius`  | string           | no       | `""`    | Distance around `location`. Leave empty for the LinkedIn default.                                      |
| `max_results`      | integer (1–10000)| no       | `100`   | Maximum jobs to return. Sent to the provider as `limit_per_input` so it stops crawling at the cap.    |

Example input:

```json
{
    "keyword": "product manager",
    "location": "Paris",
    "country": "FR",
    "time_range": "Past month",
    "job_type": "Full-time",
    "experience_level": "Internship",
    "remote": "On-site",
    "company": "",
    "location_radius": "",
    "max_results": 50
}
````

To run multiple different searches (e.g. "product manager in Paris" + "python developer in New York"), trigger the Actor multiple times via the API or create separate Apify tasks.

### How the cap works (and why it saves you money)

The Actor enforces `max_results_per_search` in **two places**, so you only pay for the rows you keep:

1. **Server-side (primary).** The value is sent to the provider as `limit_per_input` on the `/scrape` request. The provider stops crawling each search once it has `N` results, so the billable row count scales with `N` — not with how many results LinkedIn actually has for "product manager in Paris".
2. **Client-side (safety net).** After the provider returns results, the Actor groups rows by their `discovery_input`, sorts by `job_posted_date` desc, and trims to the cap in case any extras slipped through.

You'll see per-search accounting in the logs:

```
  "product manager" @ "paris": 50 returned, kept 50, dropped 0.
  "\"python developer\"" @ "New York": 50 returned, kept 50, dropped 0.
```

Setting `max_results_per_search` to a very high value (e.g. `10000`) effectively disables the cap.

### Output

Each item in the dataset has this shape (29 fields, matches the upstream schema):

```json
{
    "url": "https://www.linkedin.com/jobs/view/principal-full-stack-engineer-vp-at-hackajob-4394289151",
    "job_posting_id": "4394289151",
    "job_title": "Principal Full Stack Engineer - VP",
    "company_name": "hackajob",
    "company_id": "5396873",
    "job_location": "Hanover, NJ",
    "job_summary": "hackajob is collaborating with Barclays to connect them with exceptional professionals...",
    "job_seniority_level": "Executive",
    "job_function": "Engineering and Information Technology",
    "job_employment_type": "Full-time",
    "job_industries": "Software Development",
    "job_base_pay_range": "$170,000.00/yr - $230,000.00/yr",
    "company_url": "https://uk.linkedin.com/company/hackajob?...",
    "job_posted_time": "3 days ago",
    "job_num_applicants": 0,
    "discovery_input": {
        "location": "New York",
        "keyword": "\"python developer\"",
        "experience_level": "Executive",
        "country": "",
        "time_range": "",
        "job_type": "",
        "remote": "",
        "company": "",
        "location_radius": ""
    },
    "apply_link": null,
    "country_code": "US",
    "title_id": "25201",
    "company_logo": "https://media.licdn.com/dms/image/v2/.../company-logo_100_100/...",
    "job_posted_date": "2026-05-18T01:21:15.832Z",
    "job_poster": null,
    "application_availability": true,
    "job_description_formatted": "<section class=\"show-more-less-html\" data-max-lines=\"5\">...</section>",
    "base_salary": {
        "min_amount": 170000,
        "max_amount": 230000,
        "currency": "USD",
        "payment_period": "yr"
    },
    "salary_standards": "This range is provided by hackajob. Your actual pay will be based on your skills...",
    "is_easy_apply": false,
    "timestamp": "2026-05-21T01:21:15.869Z",
    "input": { "url": "https://www.linkedin.com/jobs/view/...", "discovery_input": { "..." } }
}
```

### Limits & responsible use

- The Actor only returns information that is publicly visible on LinkedIn job search results and detail pages.
- Respect LinkedIn's Terms of Service, robots.txt expectations, and applicable employment-data privacy regulations.
- Broad searches like just `"engineer"` with no filters can match millions of jobs — keep `max_results_per_search` modest unless you really need them all.

# Actor input Schema

## `keyword` (type: `string`):

Job title or search term, e.g. "product manager". Wrap in escaped quotes for exact-match like "python developer".

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

City or region, e.g. "New York", "Paris", "London". Leave empty for the entire country.

## `country` (type: `string`):

ISO country code, e.g. US, FR, GB, DE. Leave empty for any.

## `time_range` (type: `string`):

Filter by how recently the job was posted.

## `job_type` (type: `string`):

Filter by employment type.

## `experience_level` (type: `string`):

Filter by seniority level.

## `remote` (type: `string`):

Filter by where the work is done.

## `company` (type: `string`):

Restrict results to a specific company name. Leave empty for any.

## `location_radius` (type: `string`):

Distance around the location. Leave empty for the LinkedIn default.

## `max_results` (type: `integer`):

Maximum number of jobs to return for this search. Sent to the data provider so it stops crawling once the cap is reached — your bill scales with this value, not with the total number of matches on LinkedIn.

## Actor input object example

```json
{
  "keyword": "product manager",
  "location": "Paris",
  "country": "FR",
  "time_range": "",
  "job_type": "",
  "experience_level": "",
  "remote": "",
  "company": "",
  "location_radius": "",
  "max_results": 100
}
```

# Actor output Schema

## `dataset` (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 = {
    "keyword": "product manager",
    "location": "Paris",
    "country": "FR"
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/linkedin-jobs-scraper-by-keyword").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 = {
    "keyword": "product manager",
    "location": "Paris",
    "country": "FR",
}

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/linkedin-jobs-scraper-by-keyword").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 '{
  "keyword": "product manager",
  "location": "Paris",
  "country": "FR"
}' |
apify call apt_marble/linkedin-jobs-scraper-by-keyword --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "LinkedIn Jobs Scraper by Keyword",
        "description": "🔍 Scrape LinkedIn job listings by keyword, location, or company. Extract job titles, companies, locations, descriptions, posted dates, and more, perfect for recruitment, lead generation, and job market research 🚀",
        "version": "0.0",
        "x-build-id": "nbBYCVUb7vmavCcSa"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/apt_marble~linkedin-jobs-scraper-by-keyword/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-apt_marble-linkedin-jobs-scraper-by-keyword",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/apt_marble~linkedin-jobs-scraper-by-keyword/runs": {
            "post": {
                "operationId": "runs-sync-apt_marble-linkedin-jobs-scraper-by-keyword",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/apt_marble~linkedin-jobs-scraper-by-keyword/run-sync": {
            "post": {
                "operationId": "run-sync-apt_marble-linkedin-jobs-scraper-by-keyword",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "keyword"
                ],
                "properties": {
                    "keyword": {
                        "title": "Keyword",
                        "type": "string",
                        "description": "Job title or search term, e.g. \"product manager\". Wrap in escaped quotes for exact-match like \\\"python developer\\\"."
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "City or region, e.g. \"New York\", \"Paris\", \"London\". Leave empty for the entire country.",
                        "default": ""
                    },
                    "country": {
                        "title": "Country code",
                        "type": "string",
                        "description": "ISO country code, e.g. US, FR, GB, DE. Leave empty for any.",
                        "default": ""
                    },
                    "time_range": {
                        "title": "Time range",
                        "enum": [
                            "",
                            "Past 24 hours",
                            "Past week",
                            "Past month"
                        ],
                        "type": "string",
                        "description": "Filter by how recently the job was posted.",
                        "default": ""
                    },
                    "job_type": {
                        "title": "Job type",
                        "enum": [
                            "",
                            "Full-time",
                            "Part-time",
                            "Contract",
                            "Temporary",
                            "Volunteer",
                            "Internship",
                            "Other"
                        ],
                        "type": "string",
                        "description": "Filter by employment type.",
                        "default": ""
                    },
                    "experience_level": {
                        "title": "Experience level",
                        "enum": [
                            "",
                            "Internship",
                            "Entry level",
                            "Associate",
                            "Mid-Senior level",
                            "Director",
                            "Executive"
                        ],
                        "type": "string",
                        "description": "Filter by seniority level.",
                        "default": ""
                    },
                    "remote": {
                        "title": "Remote mode",
                        "enum": [
                            "",
                            "On-site",
                            "Remote",
                            "Hybrid"
                        ],
                        "type": "string",
                        "description": "Filter by where the work is done.",
                        "default": ""
                    },
                    "company": {
                        "title": "Company",
                        "type": "string",
                        "description": "Restrict results to a specific company name. Leave empty for any.",
                        "default": ""
                    },
                    "location_radius": {
                        "title": "Location radius",
                        "type": "string",
                        "description": "Distance around the location. Leave empty for the LinkedIn default.",
                        "default": ""
                    },
                    "max_results": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of jobs to return for this search. Sent to the data provider so it stops crawling once the cap is reached — your bill scales with this value, not with the total number of matches on LinkedIn.",
                        "default": 100
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
