# LinkedIn Advanced Jobs + Recruiter Details Scraper (`coregent/linkedin-advanced-jobs-recruiter-details-scraper`) Actor

Scrape public LinkedIn job listings by keyword, location, or URL into clean, CSV-ready rows with hiring-signal fields and visible recruiter indicators - no login, cookies, or Apify residential proxy.

- **URL**: https://apify.com/coregent/linkedin-advanced-jobs-recruiter-details-scraper.md
- **Developed by:** [Delowar Munna](https://apify.com/coregent) (community)
- **Categories:** Jobs, Automation, Developer tools
- **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 Advanced Jobs + Recruiter Details Scraper

![LinkedIn Advanced Jobs + Recruiter Details Scraper](https://raw.githubusercontent.com/coregentdevspace/linkedin-advanced-jobs-recruiter-details-scraper-assets/main/thumbnail-linkedin-advanced-jobs-recruiter-details-scraper.png)

Scrape **public LinkedIn job listings** by **keyword + location** or by **direct LinkedIn job URL**, and turn them into clean, flat, CSV-ready rows — with lightweight **hiring-signal** fields, **tech-keyword tags**, **salary visibility**, **remote signals**, and **public recruiter indicators** (recruiter name / profile link **only when visibly present on the public job page**). Built for **recruiters, staffing agencies, sales teams, lead-generation teams, 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

- **Public-only & transparent** — no login, cookies, sessions, credentials, or Apify residential proxy. It scrapes only what is publicly visible.
- **Visible recruiter signals** — captures recruiter name / profile URL **when LinkedIn shows them publicly** on the job page (no profile visits, no enrichment). Recruiter info is sparse on public pages; fields default to `not_visible` when absent.
- **Two input modes** — keyword + location, or paste LinkedIn job **search** URLs and direct **job-detail** URLs (`/jobs/view/{id}`).
- **Flat, CSV-ready rows** — job identity, company, role metadata, posting details, recruiter signals, and derived hiring signals. No nested objects.
- **Pay-Per-Event** — one flat `job-result` event per saved unique job. Duplicates and filtered rows are never charged.
- **Transparent hiring-signal score** — rule-based (no AI), explained below.

---

### 🚀 Quick start — sample inputs

#### Example 1 — keyword + location

```json
{
    "keywords": ["software engineer", "data analyst"],
    "locations": ["Sydney, New South Wales, Australia", "Melbourne, Victoria, Australia"],
    "maxResults": 100,
    "datePosted": "past_week",
    "remoteMode": "any",
    "includeRecruiterVisibleOnly": false,
    "requireSalaryVisible": false,
    "includeDescription": true,
    "includeHiringSignals": true,
    "deduplicate": true,
    "proxyConfiguration": { "useApifyProxy": true }
}
````

#### Example 2 — direct job URLs + remote filter + custom residential proxy via your own provider

```json
{
    "startUrls": [
        "https://www.linkedin.com/jobs/view/3912345678/",
        "https://www.linkedin.com/jobs/search/?keywords=sales%20manager&location=United%20States&f_TPR=r604800"
    ],
    "maxResults": 250,
    "remoteMode": "remote",
    "requireSalaryVisible": true,
    "includeDescription": true,
    "includeHiringSignals": true,
    "deduplicate": true,
    "proxyConfiguration": {
        "useApifyProxy": false,
        "proxyUrls": ["http://user:pass@proxy.iproyal.com:12321"]
    }
}
```

> Provide **at least one** of `keywords` (with optional `locations`) or `startUrls`. `startUrls` accepts both jobs **search** URLs and direct **job-detail** URLs. If you provide both inputs, 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`. See **🚦 Proxy policy** below.

***

### 📦 Output

The dataset has one view: **Jobs, recruiter signals & hiring signals** — a flat table (29 columns).

![LinkedIn Advanced Jobs + Recruiter Details Scraper — all fields table view](https://raw.githubusercontent.com/coregentdevspace/linkedin-advanced-jobs-recruiter-details-scraper-assets/main/linkedin-advanced-jobs-recruiter-details-scraper-output-all-fields-table-view.png)

#### Output fields (29)

`job_id`, `job_url`, `source_url`, `input_type`, `title`, `company_name`, `company_linkedin_url`, `location`, `workplace_type`, `employment_type`, `seniority_level`, `job_function`, `industries`, `posted_date_text`, `applicants_text`, `description_text`, `apply_url`, `recruiter_name`, `recruiter_profile_url`, `recruiter_visibility`, `salary_text`, `salary_visible`, `remote_signal`, `tech_keywords`, `hiring_signal_score`, `hiring_signal_label`, `reason_tags`, `is_filtered_out`, `scraped_at`.

`input_type` is `generated_search` (from keywords), `search_url` (pasted search URL), or `job_url` (pasted job-detail URL). `recruiter_visibility` is `visible`, `not_visible`, or `blocked`.

#### Sample record

Real run output; `description_text` is truncated here for readability.

```json
{
    "job_id": "4413496469",
    "job_url": "https://www.linkedin.com/jobs/view/4413496469",
    "source_url": "https://www.linkedin.com/jobs/search/?keywords=software+engineer&location=Sydney%2C+New+South+Wales%2C+Australia",
    "input_type": "generated_search",
    "title": "Software Engineer, Intern",
    "company_name": "Stripe",
    "company_linkedin_url": "https://www.linkedin.com/company/stripe",
    "location": "Sydney, New South Wales, Australia",
    "workplace_type": "onsite",
    "employment_type": "internship",
    "seniority_level": "entry",
    "job_function": "Engineering and Information Technology",
    "industries": "Software Development, Financial Services, and Technology, Information and Internet",
    "posted_date_text": "4 days ago",
    "applicants_text": "Over 200 applicants",
    "description_text": "Who we are. About Stripe. Stripe is a financial infrastructure platform for businesses... The annual salary range for this role in the primary location is A$100,800 - A$100,800...",
    "apply_url": null,
    "recruiter_name": null,
    "recruiter_profile_url": null,
    "recruiter_visibility": "not_visible",
    "salary_text": "$100,800",
    "salary_visible": true,
    "remote_signal": "onsite",
    "tech_keywords": "java; javascript; go; ruby; scala",
    "hiring_signal_score": 80,
    "hiring_signal_label": "high",
    "reason_tags": "complete_job_detail; recent_posting; salary_visible; remote_signal; tech_role",
    "is_filtered_out": false,
    "scraped_at": "2026-06-07T08:49:54.343Z"
}
```

> Recruiter fields (`recruiter_name`, `recruiter_profile_url`) populate only when LinkedIn publishes them on the public job page, which is uncommon — most rows return `recruiter_visibility: "not_visible"`. The actor never logs in or visits profiles. See **🚧 Limitations**.

***

### 🎯 Hiring-signal score

Transparent rule-based score (0–100) computed from extracted fields — no AI, no external enrichment. Included when `includeHiringSignals: true` (otherwise the three signal fields are `null`).

| Signal                                    | Points |
| ----------------------------------------- | -----: |
| Job title exists                          |    +20 |
| Company name exists                       |    +15 |
| Description exists and > 300 chars        |    +10 |
| Location exists                           |    +10 |
| Posted date text suggests recent activity |    +10 |
| Apply URL exists                          |    +10 |
| Recruiter info visible                    |    +10 |
| Salary visible                            |    +10 |
| Employment type or seniority visible      |     +5 |

Score is capped at 100.

**Labels**: `high` (70–100) · `medium` (40–69) · `low` (0–39).

`reason_tags` is a `; `-separated list explaining the row — e.g. `recent_posting`, `recruiter_visible`, `salary_visible`, `remote_signal`, `tech_role`, `external_apply_url`, `complete_job_detail`.

***

### 💰 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`): it both caps how many results it collects up-front to what the limit can pay for, and stops cleanly the moment the cap is reached during charging.

Not charged:

- Duplicates (deduplicated by `job_id`, canonical `job_url`, and title-based keys).
- Rows filtered out by remote-mode / recruiter-visible / salary-visible / date filters.
- Rows missing a `job_id`/`job_url` or `title` + `company_name`.
- 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,
    "generated_search_urls": 4,
    "job_urls_discovered": 0,
    "raw_results_found": 420,
    "results_saved": 100,
    "duplicates_removed": 37,
    "filtered_out": 19,
    "charged_events": 100,
    "blocked_requests": 2,
    "login_wall_detected": 0,
    "retry_count": 8,
    "runtime_seconds": 312,
    "scraped_at": "2026-06-02T00:00:00.000Z"
}
```

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

***

### ⚙️ Filters

All filters apply **after** extraction so visible fields can be evaluated accurately. Filtered-out rows are not pushed and not charged.

| Filter                        | Effect                                                                                                                   |
| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| `datePosted`                  | `any` / `past_24h` / `past_week` / `past_month`. Enforced at LinkedIn where stable, else text filter.                    |
| `remoteMode`                  | `any` / `remote` / `hybrid` / `onsite`. Matched against workplace type, remote signal, title, location, and description. |
| `includeRecruiterVisibleOnly` | Keep only jobs where public recruiter name or profile URL is visible.                                                    |
| `requireSalaryVisible`        | Keep only jobs with explicit visible salary text.                                                                        |
| `deduplicate`                 | Drop duplicates across inputs by job ID / canonical URL (recommended ON).                                                |

***

### 🚧 Limitations (V1)

- **Public guest data only**: no login, cookies, or member-only content. Some fields (employment type, seniority, industries, applicants, description, apply URL, recruiter info) come from the job detail page and only populate when `includeDescription` (or a recruiter/salary filter) triggers a detail visit.
- **Recruiter fields are best-effort and sparse**: LinkedIn's public guest pages rarely expose recruiter name/profile. When absent, `recruiter_visibility` is `not_visible` and the recruiter fields are `null`. The actor never visits profiles and never logs in.
- **`salary_text`** is kept as raw text (no min/max/currency split) and is only present when LinkedIn shows it; `salary_visible` reflects that.
- **No** email/phone enrichment, full recruiter-profile scraping, 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); range 1–5000.

***

### ❓ FAQ

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

**Why are recruiter fields usually empty?**
Recruiter name/profile are only captured when LinkedIn shows them in the public job HTML, which is uncommon. The actor does not log in or visit profiles, so when the info isn't public the fields stay `null` / `not_visible`.

**Can I paste a direct job URL?**
Yes — put `https://www.linkedin.com/jobs/view/{id}` URLs in `startUrls`. Each is fetched as a single job and tagged `input_type: "job_url"`.

**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

## `startUrls` (type: `array`):

Paste public LinkedIn job URLs directly: either jobs search result URLs (https://www.linkedin.com/jobs/search/...) or single job-detail URLs (https://www.linkedin.com/jobs/view/{id}). Non-LinkedIn URLs are skipped. Provide at least one of Job URLs or Search keywords.

## `keywords` (type: `array`):

Job keywords to search, for example "software engineer", "data analyst". Each keyword is combined with every location below to build public LinkedIn job search URLs. Max 50 entries.

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

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

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

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

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

Filter jobs by posting recency. Applied at the LinkedIn source where possible, otherwise as a text filter on the visible posted date.

## `remoteMode` (type: `string`):

Filter by visible work arrangement. Matched against workplace type, remote signal, title, location, and description text.

## `includeRecruiterVisibleOnly` (type: `boolean`):

Keep only jobs where public recruiter/hiring-team info (name or profile URL) is visible on the job page. Recruiter info is sparse on public pages, so enabling this can sharply reduce results.

## `requireSalaryVisible` (type: `boolean`):

Keep only jobs that show explicit salary/pay text on the public page.

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

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

## `includeHiringSignals` (type: `boolean`):

Add the derived non-AI hiring-signal fields: hiring\_signal\_score (0-100), hiring\_signal\_label, and reason\_tags. When off, those three fields are null.

## `deduplicate` (type: `boolean`):

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

## `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
{
  "startUrls": [],
  "keywords": [
    "software engineer",
    "data analyst"
  ],
  "locations": [
    "Sydney, New South Wales, Australia"
  ],
  "maxResults": 100,
  "datePosted": "any",
  "remoteMode": "any",
  "includeRecruiterVisibleOnly": false,
  "requireSalaryVisible": false,
  "includeDescription": true,
  "includeHiringSignals": true,
  "deduplicate": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Flat table view of every job row pushed to the dataset, including job identity, company, role metadata, posting details, visible recruiter signals, 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 = {
    "startUrls": [],
    "keywords": [
        "software engineer",
        "data analyst"
    ],
    "locations": [
        "Sydney, New South Wales, Australia"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("coregent/linkedin-advanced-jobs-recruiter-details-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 = {
    "startUrls": [],
    "keywords": [
        "software engineer",
        "data analyst",
    ],
    "locations": ["Sydney, New South Wales, Australia"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("coregent/linkedin-advanced-jobs-recruiter-details-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 '{
  "startUrls": [],
  "keywords": [
    "software engineer",
    "data analyst"
  ],
  "locations": [
    "Sydney, New South Wales, Australia"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call coregent/linkedin-advanced-jobs-recruiter-details-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "LinkedIn Advanced Jobs + Recruiter Details Scraper",
        "description": "Scrape public LinkedIn job listings by keyword, location, or URL into clean, CSV-ready rows with hiring-signal fields and visible recruiter indicators - no login, cookies, or Apify residential proxy.",
        "version": "1.0",
        "x-build-id": "NWrd2jmp6Cea47fXh"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/coregent~linkedin-advanced-jobs-recruiter-details-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-coregent-linkedin-advanced-jobs-recruiter-details-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-advanced-jobs-recruiter-details-scraper/runs": {
            "post": {
                "operationId": "runs-sync-coregent-linkedin-advanced-jobs-recruiter-details-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-advanced-jobs-recruiter-details-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-coregent-linkedin-advanced-jobs-recruiter-details-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": {
                    "startUrls": {
                        "title": "LinkedIn job URLs",
                        "type": "array",
                        "description": "Paste public LinkedIn job URLs directly: either jobs search result URLs (https://www.linkedin.com/jobs/search/...) or single job-detail URLs (https://www.linkedin.com/jobs/view/{id}). Non-LinkedIn URLs are skipped. Provide at least one of Job URLs or Search keywords.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "keywords": {
                        "title": "Search keywords",
                        "type": "array",
                        "description": "Job keywords to search, for example \"software engineer\", \"data analyst\". Each keyword is combined with every location below to build public LinkedIn job search URLs. Max 50 entries.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "locations": {
                        "title": "Locations",
                        "type": "array",
                        "description": "Search locations, for example \"Australia\", \"Sydney, New South Wales, Australia\", \"United States\". Each keyword is paired with each location. Leave empty to search without a location filter. Max 50 entries.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of saved unique jobs across the whole run (not per query). Range 1-5000.",
                        "default": 100
                    },
                    "datePosted": {
                        "title": "Date posted",
                        "enum": [
                            "any",
                            "past_24h",
                            "past_week",
                            "past_month"
                        ],
                        "type": "string",
                        "description": "Filter jobs by posting recency. Applied at the LinkedIn source where possible, otherwise as a text filter on the visible posted date.",
                        "default": "any"
                    },
                    "remoteMode": {
                        "title": "Work arrangement",
                        "enum": [
                            "any",
                            "remote",
                            "hybrid",
                            "onsite"
                        ],
                        "type": "string",
                        "description": "Filter by visible work arrangement. Matched against workplace type, remote signal, title, location, and description text.",
                        "default": "any"
                    },
                    "includeRecruiterVisibleOnly": {
                        "title": "Only jobs with visible recruiter info",
                        "type": "boolean",
                        "description": "Keep only jobs where public recruiter/hiring-team info (name or profile URL) is visible on the job page. Recruiter info is sparse on public pages, so enabling this can sharply reduce results.",
                        "default": false
                    },
                    "requireSalaryVisible": {
                        "title": "Only jobs with visible salary",
                        "type": "boolean",
                        "description": "Keep only jobs that show explicit salary/pay text on the public page.",
                        "default": false
                    },
                    "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, applicants, salary, apply URL, and visible recruiter info. Turning this off makes runs faster (cards only) but returns fewer fields.",
                        "default": true
                    },
                    "includeHiringSignals": {
                        "title": "Include hiring-signal fields",
                        "type": "boolean",
                        "description": "Add the derived non-AI hiring-signal fields: hiring_signal_score (0-100), hiring_signal_label, and reason_tags. When off, those three fields are null.",
                        "default": true
                    },
                    "deduplicate": {
                        "title": "Remove duplicates",
                        "type": "boolean",
                        "description": "Deduplicate jobs by job ID and canonical job URL across overlapping inputs so you are not charged for duplicates.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
