# Multi-Platform Job Scraper (`mediocre_interest/multi-platform-jobs-scraper`) Actor

Scrape job listings from LinkedIn, Indeed, Glassdoor, ZipRecruiter, Naukri, Bayt, Greenhouse, Lever, and Ashby in a single run. Extracts title, company, location, salary, description, and more with advanced filters.

- **URL**: https://apify.com/mediocre\_interest/multi-platform-jobs-scraper.md
- **Developed by:** [Mediocre\_Interest](https://apify.com/mediocre_interest) (community)
- **Categories:** Jobs, Automation, AI
- **Stats:** 6 total users, 1 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $12.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## Multi-Platform Job Scraper

> Scrape job listings from **10 job platforms** in a single run — LinkedIn, Indeed, Glassdoor, ZipRecruiter, Naukri, Bayt, Greenhouse, Lever and Ashby. Export clean, normalized data to JSON, CSV, Excel, or any downstream tool via the Apify API.

---

### Overview

Multi-Platform Job Scraper aggregates structured job data from the world's leading general and regional job boards, plus direct company ATS portals, in a single Apify Actor run. Give it a list of keywords, a location, and the platforms you care about — it returns clean, normalized job records across all of them.

Ideal for **job market research**, **competitor hiring intelligence**, **lead generation**, **salary benchmarking**, and building **automated job alert pipelines**.

---

### Features

- **9 platforms in one run** — LinkedIn, Indeed, Glassdoor, ZipRecruiter, Naukri, Bayt, Greenhouse, Lever, Ashby
- **Multi-keyword search** — each keyword runs as an independent search on every selected platform
- **Global + regional coverage** — general boards, US-focused (ZipRecruiter), India (Naukri), Middle East (Bayt), and direct ATS portals (Greenhouse, Lever, Ashby)
- **Normalized output** — every platform produces the same schema: `source`, `title`, `company`, `location`, `salary`, `postedDate`, `description`, `jobUrl`, and more
- **Advanced filters** — date posted, seniority level, job type, remote-only, minimum salary (LinkedIn & Indeed)
- **Smart salary extraction** — extracts compensation from job descriptions when structured salary data is absent
- **Anti-bot protection for LinkedIn** — browser fingerprinting, session pooling, randomized request delays, residential proxy support
- **Flexible proxy support** — Apify Proxy (Residential recommended) or custom proxy URLs
- **Multiple export formats** — JSON, CSV, Excel, XML, JSON Lines via the Apify Dataset API

---

### Use Cases

| Use Case                           | Example                                                                                              |
| ---------------------------------- | ---------------------------------------------------------------------------------------------------- |
| **Job market research**            | Search "Data Scientist" across LinkedIn + Indeed + Glassdoor to benchmark demand and compensation    |
| **Competitor hiring intelligence** | Monitor which roles a rival is actively posting by searching their Greenhouse or Lever board         |
| **Lead generation**                | Identify companies hiring specific roles — a proven buying signal for B2B SaaS and staffing agencies |
| **Job alert pipeline**             | Schedule daily runs; trigger Zapier or Make notifications when new matching roles appear             |
| **Salary benchmarking**            | Aggregate salary data across platforms for a specific role and city                                  |
| **ATS monitoring**                 | Track new openings across 175+ tech companies using Greenhouse, Lever, and Ashby                     |
| **Academic research**              | Collect structured job market data for labor economics studies                                       |

---

### Platforms

| Platform         | Region        |
| ---------------- | ------------- |
| **LinkedIn**     | Global        |
| **Indeed**       | Global        |
| **Glassdoor**    | Global        |
| **ZipRecruiter** | United States |
| **Naukri**       | India         |
| **Bayt**         | Middle East   |
| **Greenhouse**   | Global        |
| **Lever**        | Global        |
| **Ashby**        | Global        |

---

### Input

| Field                | Type    | Required | Default                 | Description                                                                                                                               |
| -------------------- | ------- | -------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `platforms`          | Array   | ✅       | `["linkedin"]`          | Platforms to scrape. Valid values: `linkedin`, `indeed`, `glassdoor`, `zip_recruiter`, `naukri`, `bayt`, `greenhouse`, `lever`, `ashby`   |
| `keywords`           | Array   | ✅       | `["Software Engineer"]` | Job search terms. Each keyword triggers a separate search on every selected platform. Example: `["React Developer", "Frontend Engineer"]` |
| `location`           | String  | —        | —                       | City, state or country. Example: `"London"`, `"New York, NY"`                                                                             |
| `minJobs`            | Integer | —        | `10`                    | Target number of jobs **per keyword per platform**. Total ≈ `minJobs × keywords × platforms`                                              |
| `salary`             | Select  | —        | —                       | Minimum annual salary (USD). Options: `$40,000+` through `$200,000+`. Supported on LinkedIn and Indeed only                               |
| `postedDate`         | Select  | —        | —                       | Maximum job age. Options: `Past 24 hours`, `Past week`, `Past month`                                                                      |
| `jobType`            | Select  | —        | —                       | Employment type. Options: `Full-time`, `Part-time`, `Contract`, `Temporary`, `Volunteer`, `Internship`, `Other`                           |
| `jobLocationType`    | Select  | —        | `all`                   | `all` = any location. `remote` = remote-only positions                                                                                    |
| `seniorityLevel`     | Select  | —        | —                       | Seniority filter (LinkedIn only). Options: `Internship`, `Entry level`, `Associate`, `Mid-Senior level`, `Director`, `Executive`          |
| `proxyConfiguration` | Object  | —        | —                       | Proxy settings. Residential proxies strongly recommended for LinkedIn                                                                     |

#### Example Input

```json
{
    "platforms": ["linkedin", "indeed", "greenhouse"],
    "keywords": ["Software Engineer", "Backend Developer"],
    "location": "San Francisco, CA",
    "minJobs": 25,
    "jobType": "Full-time",
    "postedDate": "Past week",
    "jobLocationType": "all",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
}
````

> **Tip**: Total results ≈ `minJobs × keywords × platforms`. With the example above: 25 × 2 × 3 = up to 150 jobs. Actual count may be lower if fewer results exist on a platform.

***

### Output

Each scraped job is stored as a JSON object in the Apify Dataset.

| Field            | Type              | Description                                              |
| ---------------- | ----------------- | -------------------------------------------------------- |
| `source`         | String            | Platform — e.g. `"linkedin"`, `"indeed"`, `"greenhouse"` |
| `title`          | String | null    | Job title                                                |
| `company`        | String | null    | Company name                                             |
| `location`       | String | null    | Job location                                             |
| `jobUrl`         | String            | Direct link to the original posting                      |
| `salary`         | String | null    | Salary (structured data or extracted from description)   |
| `postedDate`     | String | null    | When the job was posted                                  |
| `description`    | String | null    | Full job description text                                |
| `applicants`     | String | null    | Number of applicants (LinkedIn only)                     |
| `jobType`        | String | null    | Employment type                                          |
| `seniorityLevel` | String | null    | Seniority level (LinkedIn only)                          |
| `industry`       | String | null    | Company industry (LinkedIn only)                         |
| `scrapedAt`      | String (ISO 8601) | UTC timestamp when this record was collected             |

#### Example Output Record

```json
{
    "source": "linkedin",
    "title": "Senior Software Engineer",
    "company": "Acme Corp",
    "location": "San Francisco, CA",
    "jobUrl": "https://www.linkedin.com/jobs/view/123456789",
    "salary": "$140,000–$180,000/year",
    "postedDate": "2 days ago",
    "description": "We are looking for a Senior Software Engineer to join our growing team...",
    "applicants": "47 applicants",
    "jobType": "Full-time",
    "seniorityLevel": "Mid-Senior level",
    "industry": "Computer Software",
    "scrapedAt": "2025-06-01T12:00:00.000Z"
}
```

***

### Integrations

| Tool                  | How to Connect                                                                         |
| --------------------- | -------------------------------------------------------------------------------------- |
| **Zapier**            | Apify Zapier app → "Actor Run Finished" trigger → access dataset items                 |
| **Make (Integromat)** | Apify Make module → schedule runs and process results                                  |
| **n8n**               | HTTP Request node or community Apify n8n node                                          |
| **REST API**          | `GET https://api.apify.com/v2/datasets/{datasetId}/items` — JSON, CSV, Excel, XML, RSS |
| **Webhooks**          | Apify webhook fires on "Run succeeded" → POST results to your own endpoint             |
| **Apify Scheduler**   | Automate recurring runs (daily, weekly, or any cron expression)                        |
| **Google Sheets**     | Export via the Apify → Google Sheets integration in the Console                        |

***

### FAQ

<details>
<summary><strong>Which platforms require a proxy?</strong></summary>

LinkedIn is highly sensitive to scraping and **requires residential proxies** for reliable results. Other platforms work with datacenter proxies or even without proxies at low volumes. Enable Apify Residential Proxy (`useApifyProxy: true`, group `RESIDENTIAL`) when scraping LinkedIn.

</details>

<details>
<summary><strong>What does `minJobs` actually control?</strong></summary>

`minJobs` is the target number of jobs **per keyword per platform**. With 2 keywords, 2 platforms, and `minJobs: 25`, the Actor aims for up to 100 results total. Actual count may be lower if fewer matching jobs exist.

</details>

<details>
<summary><strong>Why are there fewer results than expected?</strong></summary>

- LinkedIn caps public results at 1,000 per keyword.
- Some keyword + location combinations genuinely return few results on a given platform.

</details>

<details>
<summary><strong>Does the salary filter work on all platforms?</strong></summary>

No. Salary filtering is only supported on **LinkedIn** and **Indeed**. It is silently ignored elsewhere.

</details>

<details>
<summary><strong>Does the seniority filter work on all platforms?</strong></summary>

No. The seniority filter is only applied on **LinkedIn**.

</details>

<details>
<summary><strong>Can I scrape remote jobs only?</strong></summary>

Yes. Set `jobLocationType` to `remote`. Supported across most platforms.

</details>

<details>
<summary><strong>Can I export to CSV or Excel?</strong></summary>

Yes. The Apify Dataset supports JSON, JSON Lines, CSV, Excel (xlsx), XML, and RSS. Use the "Export" button in the Console or the Dataset API.

</details>

<details>
<summary><strong>Is there deduplication?</strong></summary>

Currently, the same job posting may appear multiple times if it matches several keywords. Cross-platform deduplication is not applied.

</details>

<details>
<summary><strong>Why is `applicants` null on non-LinkedIn platforms?</strong></summary>

Applicant counts are only exposed by LinkedIn's public job pages. Other platforms do not publish this data.

</details>

<details>
<summary><strong>Can I run this on a schedule?</strong></summary>

Yes. Use the Apify Scheduler in the Console to automate recurring runs at any cron interval.

</details>

<details>
<summary><strong>Can I use my own proxies?</strong></summary>

Yes. Configure `proxyConfiguration` with your own proxy URLs or combine Apify Proxy with custom groups.

</details>

<details>
<summary><strong>Does this work for non-English job postings?</strong></summary>

Partially. Language support depends on the platform. Keywords and locations should match the language used on the target platform.

</details>

<details>
<summary><strong>How do I connect results to Zapier or Make?</strong></summary>

Configure an Apify webhook to fire on "Run succeeded". In Zapier, use the "Catch Hook" trigger. In Make, use the "Custom Webhook" module. The webhook payload includes the dataset ID for fetching items via the Dataset API.

</details>

<details>
<summary><strong>What happens if one platform fails mid-run?</strong></summary>

Each platform handler catches its own errors without crashing the entire run. If LinkedIn fails, Indeed and Glassdoor results are still collected and pushed to the dataset.

</details>

<details>
<summary><strong>How do I limit compute costs?</strong></summary>

- Set a conservative `minJobs` (10–25) for initial exploration runs.

</details>

***

### Troubleshooting

**LinkedIn returns 0 results**

- Enable Apify Residential Proxy (`useApifyProxy: true`, group `RESIDENTIAL`).
- Reduce `minJobs` to 10 or fewer for initial tests.
- Use broader keywords — LinkedIn's public API returns fewer results for very specific queries.
- Some proxy IP ranges are geo-blocked by LinkedIn; try a different proxy country or group.

**Indeed / Glassdoor returns 0 results**

- Verify the keyword + location combination returns results on the platform's website directly.
- Try without a location filter first to confirm the keyword works.
- Check proxy connectivity — test without a proxy first at low volumes.

**Greenhouse / Lever / Ashby returns no matches**

- Try broader keywords — matching is done on job titles only.

**Salary is always null**

- Many jobs do not publish salary data. The Actor tries extraction from descriptions as a fallback.
- The salary *filter* limits which jobs are returned; it does not guarantee that returned jobs include salary text.

***

### Limitations

| Limitation             | Details                                     |
| ---------------------- | ------------------------------------------- |
| LinkedIn result cap    | 1,000 per keyword (LinkedIn public limit)   |
| LinkedIn rate limiting | Bot-sensitive; residential proxies required |
| Salary filter          | LinkedIn and Indeed only                    |
| Seniority filter       | LinkedIn only                               |
| Applicant count        | LinkedIn only                               |
| Deduplication          | Same job may appear under multiple keywords |

# Actor input Schema

## `platforms` (type: `array`):

Select one or more job platforms to scrape. At least one is required.

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

One or more job search keywords (e.g. 'Software Engineer', 'Data Scientist'). Each keyword runs as a separate search on every selected platform.

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

Location to search in (e.g. 'London', 'New York, NY', 'Remote'). Required when using keywords.

## `salary` (type: `string`):

Filter by minimum annual salary (USD). LinkedIn uses preset thresholds; Indeed maps these to its own salary filter.

## `postedDate` (type: `string`):

Filter jobs by how recently they were posted. Leave blank for any time.

## `seniorityLevel` (type: `string`):

Filter by a single seniority level.

## `jobType` (type: `string`):

Filter by a single employment type. Volunteer and Other are LinkedIn-only; they are ignored on Indeed.

## `jobLocationType` (type: `string`):

Filter by work location type. Select 'Remote only' to return only remote positions, or leave as 'All jobs' for no filter.

## `minJobs` (type: `integer`):

Minimum number of jobs to scrape per keyword per platform. Total = minJobs × keywords × platforms (e.g. 4 minJobs × 4 keywords × 2 platforms = 32 results).

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

Proxy settings. Residential proxies are strongly recommended to avoid IP bans.

## Actor input object example

```json
{
  "platforms": [
    "linkedin"
  ],
  "keywords": [
    "Software Engineer"
  ],
  "jobLocationType": "all",
  "minJobs": 10
}
```

# Actor output Schema

## `dataset` (type: `string`):

Link to the dataset containing all scraped job listings.

## `input` (type: `string`):

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("mediocre_interest/multi-platform-jobs-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("mediocre_interest/multi-platform-jobs-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 '{}' |
apify call mediocre_interest/multi-platform-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Multi-Platform Job Scraper",
        "description": "Scrape job listings from LinkedIn, Indeed, Glassdoor, ZipRecruiter, Naukri, Bayt, Greenhouse, Lever, and Ashby in a single run. Extracts title, company, location, salary, description, and more with advanced filters.",
        "version": "1.0",
        "x-build-id": "iOAkd8hIep7xdYT7m"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/mediocre_interest~multi-platform-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-mediocre_interest-multi-platform-jobs-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/mediocre_interest~multi-platform-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-mediocre_interest-multi-platform-jobs-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/mediocre_interest~multi-platform-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-mediocre_interest-multi-platform-jobs-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",
                "required": [
                    "platforms",
                    "keywords"
                ],
                "properties": {
                    "platforms": {
                        "title": "Platforms",
                        "minItems": 1,
                        "type": "array",
                        "description": "Select one or more job platforms to scrape. At least one is required.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "linkedin",
                                "indeed",
                                "glassdoor",
                                "zip_recruiter",
                                "naukri",
                                "bayt",
                                "greenhouse",
                                "lever",
                                "ashby"
                            ],
                            "enumTitles": [
                                "LinkedIn",
                                "Indeed",
                                "Glassdoor",
                                "ZipRecruiter",
                                "Naukri",
                                "Bayt",
                                "Greenhouse",
                                "Lever",
                                "Ashby"
                            ]
                        },
                        "default": [
                            "linkedin"
                        ]
                    },
                    "keywords": {
                        "title": "Keywords",
                        "minItems": 1,
                        "type": "array",
                        "description": "One or more job search keywords (e.g. 'Software Engineer', 'Data Scientist'). Each keyword runs as a separate search on every selected platform.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "Software Engineer"
                        ]
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Location to search in (e.g. 'London', 'New York, NY', 'Remote'). Required when using keywords."
                    },
                    "salary": {
                        "title": "Minimum salary",
                        "enum": [
                            "$40,000+",
                            "$60,000+",
                            "$80,000+",
                            "$100,000+",
                            "$120,000+",
                            "$140,000+",
                            "$160,000+",
                            "$180,000+",
                            "$200,000+"
                        ],
                        "type": "string",
                        "description": "Filter by minimum annual salary (USD). LinkedIn uses preset thresholds; Indeed maps these to its own salary filter."
                    },
                    "postedDate": {
                        "title": "Date posted",
                        "enum": [
                            "Past 24 hours",
                            "Past week",
                            "Past month"
                        ],
                        "type": "string",
                        "description": "Filter jobs by how recently they were posted. Leave blank for any time."
                    },
                    "seniorityLevel": {
                        "title": "Seniority level",
                        "enum": [
                            "Internship",
                            "Entry level",
                            "Associate",
                            "Mid-Senior level",
                            "Director",
                            "Executive"
                        ],
                        "type": "string",
                        "description": "Filter by a single seniority level."
                    },
                    "jobType": {
                        "title": "Job type",
                        "enum": [
                            "Full-time",
                            "Part-time",
                            "Contract",
                            "Temporary",
                            "Volunteer",
                            "Internship",
                            "Other"
                        ],
                        "type": "string",
                        "description": "Filter by a single employment type. Volunteer and Other are LinkedIn-only; they are ignored on Indeed."
                    },
                    "jobLocationType": {
                        "title": "Job location type",
                        "enum": [
                            "all",
                            "remote"
                        ],
                        "type": "string",
                        "description": "Filter by work location type. Select 'Remote only' to return only remote positions, or leave as 'All jobs' for no filter.",
                        "default": "all"
                    },
                    "minJobs": {
                        "title": "Min jobs per keyword",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Minimum number of jobs to scrape per keyword per platform. Total = minJobs × keywords × platforms (e.g. 4 minJobs × 4 keywords × 2 platforms = 32 results).",
                        "default": 10
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Residential proxies are strongly recommended to avoid IP bans."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
