# LinkedIn Jobs & Hiring Signals Scraper (`coregent/linkedin-jobs-hiring-signals-scraper`) Actor

Scrape LinkedIn job listings by keyword, location, or search URL and turn them into clean, CSV-ready hiring-signal data - no LinkedIn login or cookies required.

- **URL**: https://apify.com/coregent/linkedin-jobs-hiring-signals-scraper.md
- **Developed by:** [Delowar Munna](https://apify.com/coregent) (community)
- **Categories:** Jobs, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.80 / 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.
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 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 & Hiring Signals Scraper

![LinkedIn Jobs & Hiring Signals Scraper](https://raw.githubusercontent.com/coregentdevspace/linkedin-jobs-hiring-signals-scraper-assets/main/thumbnail-linkedin-jobs-hiring-signals-scraper.jpg)

Scrape **LinkedIn job listings** by **keyword + location** or by **direct jobs search URL**, and turn them into clean, flat, CSV-ready rows — plus lightweight **hiring-signal** fields (company jobs in run, seniority, role category, remote flag, hiring-signal score + reason tags). Built for **recruiters, sales teams, staffing agencies, and market researchers**.

**No LinkedIn login, no cookies, no session IDs.** The actor uses LinkedIn's public guest jobs surface over HTTP, so it stays fast and cost-predictable. You pay one flat event per unique job row that passes your filters.

### ✨ Why this scraper

- **Jobs-first, hiring-intelligence focused** — not a generic profile scraper. Every row carries derived signals that make the data useful for sales, recruiting, and market research.
- **Two input modes** — keyword + location, or paste LinkedIn jobs search URLs directly (filters preserved).
- **30 flat fields** — job identity, company, role metadata, posting details, and hiring signals. No nested objects, drops straight into Sheets/Excel/CRMs.
- **Pay-Per-Event** — one flat `job-result` event per saved unique job. Duplicates and filtered rows are never charged.
- **No login / cookies / sessions** — just keywords or URLs.
- **Transparent hiring-signal score** — rule-based (no AI), explained below.

---

### 🚀 Quick start — sample inputs

#### Example 1 — keyword + location

```json
{
    "searchQueries": ["data engineer", "analytics engineer"],
    "locations": ["Australia", "Singapore"],
    "maxResults": 100,
    "sortBy": "recent",
    "datePosted": "pastWeek",
    "workplaceTypes": ["remote", "hybrid"],
    "employmentTypes": ["full_time", "contract"],
    "includeDescription": true,
    "includeCompanySignals": true,
    "companyExcludeKeywords": ["recruitment agency"],
    "titleExcludeKeywords": ["intern"],
    "saveOnlyUniqueItems": true,
    "proxyConfiguration": { "useApifyProxy": true }
}
````

#### Example 2 — direct LinkedIn jobs search URL + custom residential proxy via your own provider

```json
{
    "jobSearchUrls": [
        "https://www.linkedin.com/jobs/search/?keywords=sales%20manager&location=United%20States&f_TPR=r604800"
    ],
    "maxResults": 250,
    "includeDescription": true,
    "includeCompanySignals": true,
    "titleIncludeKeywords": ["sales", "account executive"],
    "saveOnlyUniqueItems": true,
    "proxyConfiguration": {
        "useApifyProxy": false,
        "proxyUrls": ["http://user:pass@proxy.iproyal.com:12321"]
    }
}
```

> Provide **at least one** of `searchQueries` (with optional `locations`) or `jobSearchUrls`. If you provide both, the actor runs both and deduplicates across the whole run.

> The actor blocks Apify Residential proxy; if you need residential routing, supply your own provider via `proxyConfiguration.proxyUrls` as shown. See **🚦 Proxy policy** below.

***

### 📦 Output

The dataset has one view: **Jobs & hiring signals** — a 30-column flat table.

![Jobs & hiring signals — table view](https://raw.githubusercontent.com/coregentdevspace/linkedin-jobs-hiring-signals-scraper-assets/main/linkedin-jobs-hiring-signals-scraper-output-jobs-and-hiring-signals-table-view.png)

#### Output fields (30)

`search_query`, `search_location`, `source_url`, `job_id`, `job_url`, `job_title`, `company_name`, `company_linkedin_url`, `company_id`, `job_location`, `country_hint`, `workplace_type`, `employment_type`, `seniority_level`, `job_function`, `industries`, `posted_time_text`, `posted_at_estimate`, `applicants_count`, `salary_text`, `easy_apply`, `description_text`, `description_length`, `role_category`, `is_remote`, `company_jobs_in_run`, `hiring_signal_score`, `hiring_signal_label`, `reason_tags`, `scraped_at`.

#### Sample record — Jobs & hiring signals

```json
{
    "search_query": "data engineer",
    "search_location": "Australia",
    "source_url": "https://www.linkedin.com/jobs/search/?keywords=data+engineer&location=Australia&f_TPR=r604800&sortBy=DD",
    "job_id": "3928475610",
    "job_url": "https://www.linkedin.com/jobs/view/3928475610",
    "job_title": "Senior Data Engineer",
    "company_name": "Example Analytics Pty Ltd",
    "company_linkedin_url": "https://www.linkedin.com/company/example-analytics",
    "company_id": "example-analytics",
    "job_location": "Sydney, New South Wales, Australia",
    "country_hint": "Australia",
    "workplace_type": "hybrid",
    "employment_type": "full_time",
    "seniority_level": "senior",
    "job_function": "Engineering and Information Technology",
    "industries": "Software Development",
    "posted_time_text": "3 days ago",
    "posted_at_estimate": "2026-05-21",
    "applicants_count": 43,
    "salary_text": null,
    "easy_apply": false,
    "description_text": "Example Analytics is hiring a Senior Data Engineer to build and maintain data pipelines...",
    "description_length": 842,
    "role_category": "engineering",
    "is_remote": false,
    "company_jobs_in_run": 3,
    "hiring_signal_score": 90,
    "hiring_signal_label": "strong",
    "reason_tags": "multiple_open_roles,fresh_posting,full_time_role,senior_role,detailed_description,company_profile_available,low_applicant_count",
    "scraped_at": "2026-05-24T06:00:00.000Z"
}
```

***

### 🎯 Hiring-signal score

Transparent rule-based score (0–100) computed from extracted fields — no AI, no external enrichment.

| Signal                                  | Points |
| --------------------------------------- | -----: |
| Company has 3+ jobs in this run         |    +25 |
| Company has 2 jobs in this run          |    +15 |
| Posted within the last 7 days           |    +15 |
| Full-time role                          |    +10 |
| Senior / director / executive seniority |    +10 |
| Description length ≥ 500 chars          |    +10 |
| Company LinkedIn URL present            |    +10 |
| Applicants count present and under 100  |    +10 |
| Remote role                             |    +10 |

Score is capped at 100.

**Labels**: `strong` (80–100) · `good` (60–79) · `moderate` (40–59) · `weak` (0–39).

`reason_tags` is a comma-separated list explaining the score — e.g. `multiple_open_roles`, `fresh_posting`, `full_time_role`, `senior_role`, `detailed_description`, `company_profile_available`, `low_applicant_count`, `remote_role`, plus `target_company_match` / `target_title_match` when your include filters matched.

***

### 💰 Pricing

**Pay-Per-Event**. One flat event per saved row (final per-event price is configured on the Apify console):

| Event        | Charged when                                                                                 |
| ------------ | -------------------------------------------------------------------------------------------- |
| `job-result` | Once per unique job row that passed all filters and was successfully written to the dataset. |

So your bill is simply `results_saved × price_per_event`. The actor honors the user-configured per-run spending cap (Apify `eventChargeLimitReached`) and stops cleanly when reached.

Not charged:

- Duplicates (deduplicated by `job_id`, canonical `job_url`, and title+company keys).
- Rows filtered out by keyword / workplace / employment / date filters.
- Rows missing a `job_id` or `job_title`.
- Failed or blocked requests.

#### 🚦 Proxy policy

Use **Apify Datacenter** proxy or **no proxy** for normal runs — both work for LinkedIn's public guest jobs surface at this actor's conservative concurrency.

**Apify Residential proxy is not supported.** The actor will fail at startup if `proxyConfiguration.apifyProxyGroups` includes `RESIDENTIAL`. Reason: in pay-per-event actors, residential bandwidth (~/GB) is billed to the developer, not the run user, so a single bandwidth-heavy run could exceed the per-result event revenue.

If you genuinely need residential routing, supply your own residential provider via the proxy editor's **Custom proxy URLs** field — that traffic goes through your provider, not Apify, and is unaffected:

```
http://user:pass@proxy.iproyal.com:12321
http://user:pass@proxy.brightdata.com:22225
http://user:pass@proxy.oxylabs.io:7777
```

***

### 📊 Run summary

After each run, a `RUN_SUMMARY` entry is written to the key-value store:

```json
{
    "inputs_total": 4,
    "successful_inputs": 3,
    "failed_inputs": 1,
    "raw_results_found": 420,
    "results_saved": 100,
    "duplicates_removed": 37,
    "filtered_out": 19,
    "charged_events": 100,
    "charge_failures": 0,
    "blocked_requests": 2,
    "retry_count": 8,
    "detail_pages_visited": 84,
    "runtime_seconds": 312,
    "scraped_at": "2026-05-24T06:00:00.000Z"
}
```

`charged_events` equals the number of successfully saved unique rows.

***

### ⚙️ Filters

| Filter                                              | Stage          | Effect                                                                           |
| --------------------------------------------------- | -------------- | -------------------------------------------------------------------------------- |
| `datePosted`                                        | Source-side    | `any` / `past24h` / `pastWeek` / `pastMonth`. Enforced at LinkedIn where stable. |
| `workplaceTypes`                                    | Source + post  | `remote` / `hybrid` / `onsite`.                                                  |
| `employmentTypes`                                   | Source + post  | full\_time / part\_time / contract / temporary / internship / volunteer / other.   |
| `titleIncludeKeywords` / `titleExcludeKeywords`     | Pre-extraction | Case-insensitive substring on job title. Exclusion wins.                         |
| `companyIncludeKeywords` / `companyExcludeKeywords` | Pre-extraction | Case-insensitive substring on company name. Exclusion wins.                      |
| `saveOnlyUniqueItems`                               | Both stages    | Drop duplicates across queries (recommended ON).                                 |

Filters are applied **before** any dataset push or event charge.

***

### 🚧 Limitations (V1)

- **Public guest data only**: no login, cookies, or member-only content. Some fields (employment type, seniority, industries, applicants count, description) come from the job detail page and only populate when `includeDescription` (or an employment/workplace filter) triggers a detail visit.
- **`easy_apply`** comes from the job **detail page** (`true` = applied on LinkedIn / Easy Apply, `false` = redirects to the company site). It stays `null` when detail pages are not visited (`includeDescription: false` and no employment/workplace filter) or for expired listings.
- **`salary_text`** is kept as raw text (no min/max/currency split) and is only present when LinkedIn shows it.
- **No** recruiter/contact extraction, email enrichment, company-website crawling, or AI scoring.
- LinkedIn guest pagination tops out around ~1,000 results per search source; split broad searches into narrower queries for more coverage.
- `maxResults` caps **saved unique** rows across the whole run (not per query).

***

### ❓ FAQ

**Do I need a LinkedIn account or cookies?**
No. The actor only uses LinkedIn's public guest jobs endpoints.

**Why are some rows missing description / seniority / employment type?**
Those come from the job detail page. They populate when `includeDescription: true` (default) or when you set an employment/workplace filter. With `includeDescription: false` and no such filter, runs are faster but return card-only fields.

**How is `company_jobs_in_run` computed?**
It counts how many saved jobs in this run belong to the same company — a simple, cheap hiring-demand signal. It is computed across the run's saved set; no extra company-page requests are made.

**Can I paste a LinkedIn jobs search URL?**
Yes — put it in `jobSearchUrls`. Its existing filters are preserved and the actor paginates it for you.

**Can I export to CSV?**
Yes — every field is flat (no nested objects). Use Apify's CSV / Excel export, or call the dataset API with `format=csv`.

**Will I get blocked?**
The actor uses conservative concurrency, realistic headers, session rotation, and retry/backoff. Default Apify Proxy is sufficient for typical small/medium runs. For large runs, split searches and/or supply your own proxy provider.

***

### 🛠️ Technical notes

- **Stack**: Node.js 22 · Apify SDK 3 · Crawlee `CheerioCrawler` · Cheerio + native fetch. No browser.
- **Endpoints**: LinkedIn public guest `seeMoreJobPostings` (search) and `jobPosting` (detail).
- **Concurrency**: `min=1`, `max=5` (conservative; tune after real runs).
- **Memory**: 1 GB min · 2 GB default · 4 GB max.
- **Proxy**: Apify Proxy enabled by default; custom configs accepted; Apify Residential rejected at startup.

# Actor input Schema

## `searchQueries` (type: `array`):

Job keywords to search, for example "data engineer", "sales manager". Each keyword is combined with every location below. Provide at least one of Search keywords or LinkedIn jobs search URLs.

## `locations` (type: `array`):

Search locations, for example "Australia", "Sydney", "United States". Each keyword is paired with each location. Leave empty to search without a location filter.

## `jobSearchUrls` (type: `array`):

Paste LinkedIn jobs search result URLs directly (must start with https://www.linkedin.com/jobs/). Each URL's filters are preserved; the actor paginates them for you.

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

Maximum number of saved unique jobs across the whole run (not per query). Range 1-10000.

## `sortBy` (type: `string`):

Result ordering where supported. Relevance or most recent.

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

Filter jobs by posting recency. Applied at the LinkedIn source where possible.

## `workplaceTypes` (type: `array`):

Filter by workplace type. Leave empty for all.

## `employmentTypes` (type: `array`):

Filter by employment type. Leave empty for all.

## `includeDescription` (type: `boolean`):

Visit each job's detail page to extract the full description plus employment type, seniority, job function, industries, and applicants count. Turning this off makes runs faster (cards only) but returns fewer fields.

## `includeCompanySignals` (type: `boolean`):

Add per-run company hiring counts (company\_jobs\_in\_run) and the hiring-signal score/label/reason tags. Uses only jobs collected in this run; no deep company crawl.

## `companyIncludeKeywords` (type: `array`):

Keep only jobs from companies whose name contains one of these terms (case-insensitive). Leave empty to keep all.

## `companyExcludeKeywords` (type: `array`):

Exclude jobs from companies whose name contains one of these terms (case-insensitive), for example "recruitment agency".

## `titleIncludeKeywords` (type: `array`):

Keep only jobs whose title contains one of these terms (case-insensitive). Leave empty to keep all.

## `titleExcludeKeywords` (type: `array`):

Exclude jobs whose title contains one of these terms (case-insensitive), for example "intern".

## `saveOnlyUniqueItems` (type: `boolean`):

Deduplicate jobs by job ID and canonical job URL so you are not charged for duplicates across overlapping queries.

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

Apify Proxy configuration. Defaults to Apify Proxy enabled. Apify Residential is NOT supported and will fail the run at startup; if you need residential routing, supply your own provider via Custom proxy URLs (proxyUrls).

## Actor input object example

```json
{
  "searchQueries": [
    "data engineer",
    "analytics engineer"
  ],
  "locations": [
    "Australia",
    "Singapore"
  ],
  "jobSearchUrls": [],
  "maxResults": 100,
  "sortBy": "relevance",
  "datePosted": "any",
  "workplaceTypes": [],
  "employmentTypes": [],
  "includeDescription": true,
  "includeCompanySignals": true,
  "companyIncludeKeywords": [],
  "companyExcludeKeywords": [],
  "titleIncludeKeywords": [],
  "titleExcludeKeywords": [],
  "saveOnlyUniqueItems": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Flat 30-field table view of every job row pushed to the dataset, including job identity, company, role metadata, posting details, and derived hiring-signal fields.

# 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 = {
    "searchQueries": [
        "data engineer",
        "analytics engineer"
    ],
    "locations": [
        "Australia",
        "Singapore"
    ],
    "jobSearchUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("coregent/linkedin-jobs-hiring-signals-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 = {
    "searchQueries": [
        "data engineer",
        "analytics engineer",
    ],
    "locations": [
        "Australia",
        "Singapore",
    ],
    "jobSearchUrls": [],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("coregent/linkedin-jobs-hiring-signals-scraper").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 '{
  "searchQueries": [
    "data engineer",
    "analytics engineer"
  ],
  "locations": [
    "Australia",
    "Singapore"
  ],
  "jobSearchUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call coregent/linkedin-jobs-hiring-signals-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "LinkedIn Jobs & Hiring Signals Scraper",
        "description": "Scrape LinkedIn job listings by keyword, location, or search URL and turn them into clean, CSV-ready hiring-signal data - no LinkedIn login or cookies required.",
        "version": "1.0",
        "x-build-id": "dmBdTQmIYYFe0y9x0"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/coregent~linkedin-jobs-hiring-signals-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-coregent-linkedin-jobs-hiring-signals-scraper",
                "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/coregent~linkedin-jobs-hiring-signals-scraper/runs": {
            "post": {
                "operationId": "runs-sync-coregent-linkedin-jobs-hiring-signals-scraper",
                "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/coregent~linkedin-jobs-hiring-signals-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-coregent-linkedin-jobs-hiring-signals-scraper",
                "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",
                "properties": {
                    "searchQueries": {
                        "title": "Search keywords",
                        "type": "array",
                        "description": "Job keywords to search, for example \"data engineer\", \"sales manager\". Each keyword is combined with every location below. Provide at least one of Search keywords or LinkedIn jobs search URLs.",
                        "default": [
                            "data engineer"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "locations": {
                        "title": "Locations",
                        "type": "array",
                        "description": "Search locations, for example \"Australia\", \"Sydney\", \"United States\". Each keyword is paired with each location. Leave empty to search without a location filter.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "jobSearchUrls": {
                        "title": "LinkedIn jobs search URLs",
                        "type": "array",
                        "description": "Paste LinkedIn jobs search result URLs directly (must start with https://www.linkedin.com/jobs/). Each URL's filters are preserved; the actor paginates them for you.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of saved unique jobs across the whole run (not per query). Range 1-10000.",
                        "default": 100
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "relevance",
                            "recent"
                        ],
                        "type": "string",
                        "description": "Result ordering where supported. Relevance or most recent.",
                        "default": "relevance"
                    },
                    "datePosted": {
                        "title": "Date posted",
                        "enum": [
                            "any",
                            "past24h",
                            "pastWeek",
                            "pastMonth"
                        ],
                        "type": "string",
                        "description": "Filter jobs by posting recency. Applied at the LinkedIn source where possible.",
                        "default": "any"
                    },
                    "workplaceTypes": {
                        "title": "Workplace types",
                        "type": "array",
                        "description": "Filter by workplace type. Leave empty for all.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "remote",
                                "hybrid",
                                "onsite"
                            ],
                            "enumTitles": [
                                "Remote",
                                "Hybrid",
                                "On-site"
                            ]
                        },
                        "default": []
                    },
                    "employmentTypes": {
                        "title": "Employment types",
                        "type": "array",
                        "description": "Filter by employment type. Leave empty for all.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "full_time",
                                "part_time",
                                "contract",
                                "temporary",
                                "internship",
                                "volunteer",
                                "other"
                            ],
                            "enumTitles": [
                                "Full-time",
                                "Part-time",
                                "Contract",
                                "Temporary",
                                "Internship",
                                "Volunteer",
                                "Other"
                            ]
                        },
                        "default": []
                    },
                    "includeDescription": {
                        "title": "Include job descriptions",
                        "type": "boolean",
                        "description": "Visit each job's detail page to extract the full description plus employment type, seniority, job function, industries, and applicants count. Turning this off makes runs faster (cards only) but returns fewer fields.",
                        "default": true
                    },
                    "includeCompanySignals": {
                        "title": "Compute company hiring signals",
                        "type": "boolean",
                        "description": "Add per-run company hiring counts (company_jobs_in_run) and the hiring-signal score/label/reason tags. Uses only jobs collected in this run; no deep company crawl.",
                        "default": true
                    },
                    "companyIncludeKeywords": {
                        "title": "Company include keywords",
                        "type": "array",
                        "description": "Keep only jobs from companies whose name contains one of these terms (case-insensitive). Leave empty to keep all.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "companyExcludeKeywords": {
                        "title": "Company exclude keywords",
                        "type": "array",
                        "description": "Exclude jobs from companies whose name contains one of these terms (case-insensitive), for example \"recruitment agency\".",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "titleIncludeKeywords": {
                        "title": "Title include keywords",
                        "type": "array",
                        "description": "Keep only jobs whose title contains one of these terms (case-insensitive). Leave empty to keep all.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "titleExcludeKeywords": {
                        "title": "Title exclude keywords",
                        "type": "array",
                        "description": "Exclude jobs whose title contains one of these terms (case-insensitive), for example \"intern\".",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "saveOnlyUniqueItems": {
                        "title": "Save only unique items",
                        "type": "boolean",
                        "description": "Deduplicate jobs by job ID and canonical job URL so you are not charged for duplicates across overlapping queries.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify Proxy configuration. Defaults to Apify Proxy enabled. Apify Residential is NOT supported and will fail the run at startup; if you need residential routing, supply your own provider via Custom proxy URLs (proxyUrls).",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
