# LinkedIn Recruiter / Job Poster Finder (`coregent/linkedin-recruiter-job-poster-finder`) Actor

Find recruiters, hiring managers, and job posters from public LinkedIn jobs - one flat lead row per person, with job context (matched job, company, role keyword, location), relevance score, and reason tags. No LinkedIn login or cookies required.

- **URL**: https://apify.com/coregent/linkedin-recruiter-job-poster-finder.md
- **Developed by:** [Delowar Munna](https://apify.com/coregent) (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

from $2.40 / 1,000 lead-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 Recruiter / Job Poster Finder

![LinkedIn Recruiter / Job Poster Finder](https://raw.githubusercontent.com/coregentdevspace/linkedin-recruiter-job-poster-finder-assets/main/thumbnail-linkedin-recruiter-job-poster-finder.jpg)

Find **recruiters, hiring managers, and job posters** behind public LinkedIn job listings — clean, flat, CSV-ready **people leads** with matched-job context (job title, company, location, posted date), a transparent relevance score, and reason tags. Built for **staffing agencies, recruiting teams, sales / lead-gen, and B2B research**.

**No LinkedIn login, no cookies, no session IDs.** The actor uses LinkedIn's public guest jobs surface over HTTP. You pay one flat event per unique lead row pushed to the dataset.

### ✨ Why this scraper

- **People-first, not job-first** — every row is a person/lead with hiring context (matched job, company, role keyword, location, source type), not a job listing.
- **Three discovery modes** — `jobs_with_posters` (default), `recruiter_search` (recruiter-titled searches harvested for people), `combined` (both, deduped).
- **30 flat fields** — person identity, source type, matched-search context, optional job context, relevance score + reason tags. No nested objects; drops straight into Sheets/Excel/CRMs.
- **Pay-Per-Event** — one flat `lead-result` event per saved unique lead. Duplicates, person-less jobs, and filtered rows are never charged.
- **No login / cookies / sessions** — just keywords (or pasted LinkedIn job URLs).
- **Transparent relevance score (PRD §7)** — rule-based, no AI, explained below.

---

### 🚀 Quick start — sample inputs

#### Example 1 — jobs with posters (default)

```json
{
    "mode": "jobs_with_posters",
    "keywords": ["software engineer", "data analyst"],
    "locations": ["Sydney", "Melbourne"],
    "datePosted": "past_week",
    "remoteFilter": "any",
    "maxResults": 100,
    "maxJobsToInspect": 250,
    "includeJobContext": true,
    "deduplicate": true,
    "proxyConfiguration": { "useApifyProxy": true }
}
````

#### Example 2 — combined (jobs + recruiter searches, deduped)

```json
{
    "mode": "combined",
    "keywords": ["software engineer"],
    "locations": ["Sydney"],
    "titleKeywords": ["recruiter", "talent acquisition", "hiring manager"],
    "countryCode": "au",
    "datePosted": "past_month",
    "remoteFilter": "remote",
    "companyNames": [],
    "maxResults": 200,
    "maxJobsToInspect": 500,
    "includeJobContext": true,
    "deduplicate": true,
    "proxyConfiguration": { "useApifyProxy": true }
}
```

> Provide **at least one** of `keywords` (with optional `locations`) or `jobUrls`. 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: **Recruiter / job-poster leads** — a 30-column flat table.

![Recruiter / job-poster leads — table view](https://raw.githubusercontent.com/coregentdevspace/linkedin-recruiter-job-poster-finder-assets/main/linkedin-recruiter-job-poster-finder-output-recruiter-job-poster-leads-table-view.png)

#### Output fields (30)

`lead_name`, `lead_first_name`, `lead_last_name`, `lead_title`, `lead_company`, `lead_location`, `linkedin_profile_url`, `linkedin_profile_id`, `source_type`, `matched_keyword`, `matched_location`, `matched_company`, `job_title`, `job_company`, `job_location`, `job_url`, `job_id`, `job_posted_at_text`, `job_posted_days_ago`, `employment_type`, `workplace_type`, `applicant_count_text`, `is_direct_job_poster`, `is_recruiter_like`, `relevance_score`, `relevance_label`, `reason_tags`, `search_url`, `input_url`, `scraped_at`.

#### Sample record — Recruiter / job-poster leads

```json
{
    "lead_name": "Matthew Lane",
    "lead_first_name": "Matthew",
    "lead_last_name": "Lane",
    "lead_title": "Direct message the job poster from swipejobs",
    "lead_company": "swipejobs",
    "lead_location": "Talent Acquisition Manager",
    "linkedin_profile_url": "https://www.linkedin.com/in/matthew-lane-a9970b157",
    "linkedin_profile_id": "matthew-lane-a9970b157",
    "source_type": "job_poster",
    "matched_keyword": "software engineer",
    "matched_location": "Sydney",
    "matched_company": "swipejobs",
    "job_title": "Graduate Software Engineer",
    "job_company": "swipejobs",
    "job_location": "North Sydney, New South Wales, Australia",
    "job_url": "https://www.linkedin.com/jobs/view/4413191895",
    "job_id": "4413191895",
    "job_posted_at_text": "2 weeks ago",
    "job_posted_days_ago": 14,
    "employment_type": "Full-time",
    "workplace_type": null,
    "applicant_count_text": "Over 200 applicants",
    "is_direct_job_poster": true,
    "is_recruiter_like": false,
    "relevance_score": 65,
    "relevance_label": "Medium",
    "reason_tags": "direct_job_poster|matched_job|profile_url_available|company_available|keyword_match",
    "search_url": "https://www.linkedin.com/jobs/search/?keywords=software+engineer&location=Sydney&sortBy=R",
    "input_url": null,
    "scraped_at": "2026-05-26T04:06:05.664Z"
}
```

***

### 🎯 Relevance score (PRD §7)

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

| Signal                                                      | Points |
| ----------------------------------------------------------- | -----: |
| Direct job poster **or** hiring-team contact visible        |    +35 |
| Title/headline contains recruiter / hiring / talent keyword |    +25 |
| Matched to a specific job posting                           |    +15 |
| Job posted within the last 7 days (where parsed)            |    +10 |
| LinkedIn profile URL available                              |    +10 |
| Company available                                           |     +5 |

Score is capped at 100.

**Labels**: `High` (80–100) · `Medium` (60–79) · `Low` (30–59) · `Weak` (0–29).

`reason_tags` is a **pipe-separated** string (CSV-safe). Vocabulary: `direct_job_poster`, `hiring_team_visible`, `recruiter_title`, `talent_acquisition_title`, `matched_job`, `recent_job`, `profile_url_available`, `company_available`, `keyword_match`.

***

### 💰 Pricing

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

| Event         | Charged when                                                                                            |
| ------------- | ------------------------------------------------------------------------------------------------------- |
| `lead-result` | Once per unique recruiter / job-poster lead row that passed all filters and was 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 profile ID/URL and normalized name+company).
- Rows filtered out by company / title / date / workplace filters.
- Job pages with **no visible person identity** (PRD §6 — leads must include at minimum a profile URL or a name + company/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": 9,
    "searches_total": 8,
    "job_urls_total": 1,
    "successful_inputs": 9,
    "failed_inputs": 0,
    "jobs_found": 412,
    "jobs_inspected": 247,
    "raw_leads_found": 138,
    "results_saved": 92,
    "duplicates_removed": 31,
    "filtered_out": 124,
    "charged_events": 92,
    "blocked_requests": 4,
    "retry_count": 11,
    "invalid_urls": 0,
    "runtime_seconds": 318,
    "scraped_at": "2026-05-24T06:00:00.000Z"
}
```

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

***

### ⚙️ Filters

| Filter             | Stage          | Effect                                                                                  |
| ------------------ | -------------- | --------------------------------------------------------------------------------------- |
| `mode`             | Source builder | `jobs_with_posters` / `recruiter_search` / `combined` — decides which searches are run. |
| `datePosted`       | Source + post  | `any` / `past_24h` / `past_week` / `past_month`. Enforced at LinkedIn where stable.     |
| `remoteFilter`     | Source + post  | `any` / `remote` / `hybrid` / `onsite`.                                                 |
| `companyNames`     | Pre + post     | Case-insensitive substring on `lead_company`, `matched_company`, `job_company`.         |
| `titleKeywords`    | Post           | Case-insensitive substring on `lead_title`. Direct posters always pass (PRD §8).        |
| `maxResults`       | Both stages    | Caps saved unique lead rows across the whole run.                                       |
| `maxJobsToInspect` | Crawl-time     | Safety cap on detail pages opened.                                                      |
| `deduplicate`      | Both stages    | Profile ID/URL + name+company keys (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. Many LinkedIn job pages do **not** publicly expose the "Meet the hiring team" / job-poster module to logged-out viewers. When no person is visible, the row is dropped per PRD §6 — you are never charged for person-less jobs.
- **`lead_location` is `null`** unless the public detail fragment exposes the person's location (rare).
- **No** people-search crawling: `recruiter_search` does not target LinkedIn's auth-walled people search. It expands the recruiter title set into the same guest-jobs surface, then harvests the visible hiring contact behind each posting.
- **No** email enrichment, company-website crawling, or AI scoring.
- LinkedIn guest pagination tops out around ~1,000 results per search source; narrow searches return more coverage than broad ones.
- `maxResults` caps **saved unique** rows across the whole run (not per query); `maxJobsToInspect` is a separate safety cap on detail visits.

***

### ❓ FAQ

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

**Why are some runs lean?**
Public LinkedIn often hides the hiring-team module from logged-out viewers. The actor only saves rows where a person identity is visible (PRD §6). Try broader keywords/locations or use `combined` mode to maximize coverage.

**How is `is_direct_job_poster` different from `is_recruiter_like`?**
`is_direct_job_poster` means LinkedIn visibly attaches the person to the job posting (the "message the job poster" / direct-poster module). `is_recruiter_like` is a title-based heuristic (`recruiter` / `talent acquisition` / `hiring manager`...) and works for both direct posters and visible hiring-team members.

**Can I paste a LinkedIn jobs search URL?**
Yes — put it in `jobUrls`. Both `/jobs/view/<id>` and `/jobs/search/?keywords=...` URLs are supported. Search URLs preserve their filters and the actor paginates them.

**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`. `reason_tags` is intentionally pipe-separated to remain a single CSV cell.

**Will I get blocked?**
The actor uses conservative concurrency (1–5), realistic headers, session rotation, and retry/backoff. Default Apify Proxy is sufficient for typical small/medium runs.

***

### 🛠️ 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

## `mode` (type: `string`):

How to find leads. `jobs_with_posters` searches jobs by your keywords/URLs and extracts visible job posters / hiring-team people. `recruiter_search` searches jobs with recruiter-style title keywords (yours, or a sensible default set) and extracts the people behind those postings. `combined` runs both and deduplicates.

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

Job / role keywords, e.g. "software engineer", "data analyst". Each keyword is paired with each location. Required unless `jobUrls` is provided.

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

Search locations, e.g. "Sydney", "United States", "London". Each keyword is paired with each location. Leave empty to search without a location filter.

## `jobUrls` (type: `array`):

Direct public LinkedIn job URLs to inspect for visible posters / hiring-team data. Processed before keyword search. Invalid URLs are skipped and counted in the run summary.

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

Maximum number of saved unique recruiter / job-poster lead rows across the whole run. Range 1-10000.

## `maxJobsToInspect` (type: `integer`):

Safety cap on job detail pages opened to look for poster / hiring-team data. Should normally be greater than or equal to Max saved leads.

## `companyNames` (type: `array`):

Keep only leads whose company (lead, matched, or job company) contains one of these terms (case-insensitive). Leave empty to keep all.

## `titleKeywords` (type: `array`):

Filter person rows by visible title, e.g. "recruiter", "talent acquisition", "hiring manager". In `recruiter_search` / `combined` modes these also seed the recruiter-style searches; leave empty to use a sensible default recruiter title set.

## `countryCode` (type: `string`):

Optional ISO-like country code (`us`, `au`, `gb`, `ca`) used to localize searches where the public LinkedIn URL supports it. Unknown values are ignored.

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

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

## `remoteFilter` (type: `string`):

Filter by work arrangement where visible. Applied at the LinkedIn source where stable; otherwise post-filtered.

## `includeJobContext` (type: `boolean`):

Include the matched-job fields (job\_title, job\_company, job\_location, job\_url, job\_id, posted date, employment type, workplace type, applicants count) alongside each person row. Turn off for a leaner person-only export.

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

Remove duplicate people across jobs and searches using profile URL / profile ID and normalized name + company. Recommended ON 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
{
  "mode": "jobs_with_posters",
  "keywords": [
    "software engineer",
    "data analyst"
  ],
  "locations": [
    "Sydney"
  ],
  "jobUrls": [],
  "maxResults": 100,
  "maxJobsToInspect": 250,
  "companyNames": [],
  "titleKeywords": [
    "recruiter",
    "talent acquisition",
    "hiring manager"
  ],
  "countryCode": "",
  "datePosted": "any",
  "remoteFilter": "any",
  "includeJobContext": true,
  "deduplicate": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Flat 30-field table of every recruiter / hiring-manager / job-poster lead pushed to the dataset, including person identity, source type, matched search context, optional job context, transparent relevance score and reason tags.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "software engineer",
        "data analyst"
    ],
    "locations": [
        "Sydney"
    ],
    "jobUrls": [],
    "titleKeywords": [
        "recruiter",
        "talent acquisition",
        "hiring manager"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("coregent/linkedin-recruiter-job-poster-finder").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": [
        "software engineer",
        "data analyst",
    ],
    "locations": ["Sydney"],
    "jobUrls": [],
    "titleKeywords": [
        "recruiter",
        "talent acquisition",
        "hiring manager",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("coregent/linkedin-recruiter-job-poster-finder").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 '{
  "keywords": [
    "software engineer",
    "data analyst"
  ],
  "locations": [
    "Sydney"
  ],
  "jobUrls": [],
  "titleKeywords": [
    "recruiter",
    "talent acquisition",
    "hiring manager"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call coregent/linkedin-recruiter-job-poster-finder --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "LinkedIn Recruiter / Job Poster Finder",
        "description": "Find recruiters, hiring managers, and job posters from public LinkedIn jobs - one flat lead row per person, with job context (matched job, company, role keyword, location), relevance score, and reason tags. No LinkedIn login or cookies required.",
        "version": "1.0",
        "x-build-id": "lU7ofjxhzeTP9O22h"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/coregent~linkedin-recruiter-job-poster-finder/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-coregent-linkedin-recruiter-job-poster-finder",
                "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-recruiter-job-poster-finder/runs": {
            "post": {
                "operationId": "runs-sync-coregent-linkedin-recruiter-job-poster-finder",
                "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-recruiter-job-poster-finder/run-sync": {
            "post": {
                "operationId": "run-sync-coregent-linkedin-recruiter-job-poster-finder",
                "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": {
                    "mode": {
                        "title": "Discovery mode",
                        "enum": [
                            "jobs_with_posters",
                            "recruiter_search",
                            "combined"
                        ],
                        "type": "string",
                        "description": "How to find leads. `jobs_with_posters` searches jobs by your keywords/URLs and extracts visible job posters / hiring-team people. `recruiter_search` searches jobs with recruiter-style title keywords (yours, or a sensible default set) and extracts the people behind those postings. `combined` runs both and deduplicates.",
                        "default": "jobs_with_posters"
                    },
                    "keywords": {
                        "title": "Search keywords",
                        "type": "array",
                        "description": "Job / role keywords, e.g. \"software engineer\", \"data analyst\". Each keyword is paired with each location. Required unless `jobUrls` is provided.",
                        "default": [
                            "software engineer"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "locations": {
                        "title": "Locations",
                        "type": "array",
                        "description": "Search locations, e.g. \"Sydney\", \"United States\", \"London\". Each keyword is paired with each location. Leave empty to search without a location filter.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "jobUrls": {
                        "title": "LinkedIn job URLs",
                        "type": "array",
                        "description": "Direct public LinkedIn job URLs to inspect for visible posters / hiring-team data. Processed before keyword search. Invalid URLs are skipped and counted in the run summary.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max saved leads",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of saved unique recruiter / job-poster lead rows across the whole run. Range 1-10000.",
                        "default": 100
                    },
                    "maxJobsToInspect": {
                        "title": "Max jobs to inspect",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Safety cap on job detail pages opened to look for poster / hiring-team data. Should normally be greater than or equal to Max saved leads.",
                        "default": 250
                    },
                    "companyNames": {
                        "title": "Company names filter",
                        "type": "array",
                        "description": "Keep only leads whose company (lead, matched, or job company) contains one of these terms (case-insensitive). Leave empty to keep all.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "titleKeywords": {
                        "title": "Lead title keywords",
                        "type": "array",
                        "description": "Filter person rows by visible title, e.g. \"recruiter\", \"talent acquisition\", \"hiring manager\". In `recruiter_search` / `combined` modes these also seed the recruiter-style searches; leave empty to use a sensible default recruiter title set.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "countryCode": {
                        "title": "Country code",
                        "type": "string",
                        "description": "Optional ISO-like country code (`us`, `au`, `gb`, `ca`) used to localize searches where the public LinkedIn URL supports it. Unknown values are ignored.",
                        "default": ""
                    },
                    "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 stable.",
                        "default": "any"
                    },
                    "remoteFilter": {
                        "title": "Workplace type",
                        "enum": [
                            "any",
                            "remote",
                            "hybrid",
                            "onsite"
                        ],
                        "type": "string",
                        "description": "Filter by work arrangement where visible. Applied at the LinkedIn source where stable; otherwise post-filtered.",
                        "default": "any"
                    },
                    "includeJobContext": {
                        "title": "Include matched-job fields",
                        "type": "boolean",
                        "description": "Include the matched-job fields (job_title, job_company, job_location, job_url, job_id, posted date, employment type, workplace type, applicants count) alongside each person row. Turn off for a leaner person-only export.",
                        "default": true
                    },
                    "deduplicate": {
                        "title": "Deduplicate leads",
                        "type": "boolean",
                        "description": "Remove duplicate people across jobs and searches using profile URL / profile ID and normalized name + company. Recommended ON 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
