# Job Scraper - LinkedIn, Indeed, Glassdoor, Google Jobs (`flash_scraper/multi-jobboard-scraper`) Actor

Scrape job listings from 8 boards in one run: LinkedIn, Indeed, Glassdoor, Google Jobs, ZipRecruiter, Bayt, BDJobs & Naukri. Get deduplicated rows with title, company, location, salary, remote flag, posting date, description & company info. Filter by remote/type/date. Export CSV, JSON, Excel.

- **URL**: https://apify.com/flash\_scraper/multi-jobboard-scraper.md
- **Developed by:** [Flash Scrape](https://apify.com/flash_scraper) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 9 total users, 4 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $5.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.

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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Job Board Scraper - LinkedIn, Indeed, Glassdoor & More

**This job scraper pulls listings from 8 job boards in a single run** — **LinkedIn, Indeed, Glassdoor, Google Jobs, ZipRecruiter, Bayt, BDJobs, and Naukri** — and returns one clean, **deduplicated** row per job: title, company, location, salary (min/max/interval/currency), remote flag, job type, posting date, full description, and company info (industry, size, rating, logo, URL). Search by keyword + location, filter by remote / job type / how recently posted, and export to **CSV, JSON, or Excel**.

Built for **recruiters & staffing agencies, job boards & aggregators, market researchers, and sales teams tracking hiring signals** who need one consolidated, structured jobs feed instead of scraping each site separately.

***

### Why use this

- **8 boards, one run** — LinkedIn + Indeed + Glassdoor + Google Jobs + ZipRecruiter + Bayt + BDJobs + Naukri, merged into one dataset.
- **Deduplicated** — the same job posted to multiple boards is collapsed to one row (kept from the most complete source).
- **Resilient** — a slow or temporarily-blocked board is skipped on a timeout so the run still finishes with everything the other boards returned (no hung runs, no all-or-nothing failures).
- **Rich fields** — salary range, remote flag, job type, posting date, full description, plus company industry / size / rating / logo.
- **Multi-search** — pass several search terms in one run; results are merged and deduped.
- **Flexible filters** — remote-only, job type, posted-within-N-hours, distance, country, Easy Apply, and more.
- **Export anywhere** — CSV, JSON, Excel, or pipe to Google Sheets / your CRM.

***

### How to use it

1. Enter a **search term** (job title/keywords) and a **location** (or leave location empty for anywhere).
2. Pick the **boards** to scrape and a **max results per board**.
3. Optionally filter: remote-only, job type, posted-within-N-hours, distance, country.
4. Run → get a clean, deduplicated jobs table.

#### Input

| Field | Type | Description |
|---|---|---|
| `searchTerm` | string | Job title / keywords (e.g. `software engineer`). |
| `searchTerms` | array | Multiple searches in one run (merged + deduped); overrides `searchTerm`. Capped at 5. |
| `location` | string | City / state / country (e.g. `New York, NY`). Empty = anywhere. |
| `sites` | array | Boards: LinkedIn, Indeed, Glassdoor, Google, ZipRecruiter, Bayt, BDJobs, Naukri. |
| `maxResults` | integer | Jobs requested per board (1–100). |
| `isRemote` | boolean | Remote jobs only. |
| `jobType` | string | Full-time / part-time / internship / contract. |
| `hoursOld` | integer | Only jobs posted in the last N hours. |
| `countryIndeed` | string | Country for Indeed & Glassdoor (e.g. `usa`, `uk`, `india`). |
| `googleSearchTerm` | string | Full Google Jobs query (advanced). |
| `distance` | integer | Search radius in miles. |
| `easyApply` | boolean | LinkedIn/Indeed direct-apply jobs only. |
| `linkedinFetchDescription` | boolean | Fetch full LinkedIn descriptions + direct URLs. |
| `descriptionFormat` | string | `markdown` or `html`. |
| `proxyConfiguration` | object | Proxy settings (Residential recommended). |

**Example input:**

```json
{
  "searchTerm": "data analyst",
  "location": "Austin, TX",
  "sites": ["linkedin", "indeed", "glassdoor", "google"],
  "maxResults": 50,
  "isRemote": true,
  "hoursOld": 168
}
```

#### JSON output sample

```json
{
  "id": "in-1234567890",
  "title": "Senior Data Analyst",
  "company": "Acme Corp",
  "location": "Austin, TX",
  "site": "indeed",
  "job_type": "fulltime",
  "is_remote": true,
  "date_posted": "2026-06-20",
  "salary_min": 95000,
  "salary_max": 125000,
  "salary_interval": "yearly",
  "salary_currency": "USD",
  "company_industry": "Information Technology",
  "company_rating": 4.1,
  "job_url": "https://www.indeed.com/viewjob?jk=...",
  "description": "We are looking for a Senior Data Analyst ...",
  "emails": "careers@acmecorp.com",
  "search_term": "data analyst",
  "scraped_at": "2026-06-26T10:00:00+00:00"
}
```

Results render as a clean, sortable table on the Output tab and export to CSV, JSON, or Excel.

#### Example output

A real sample from a live run:

| title | company | location | site | job\_url |
|---|---|---|---|---|
| Silicon Software Lead | Normal Computing Corporation | New York, NY, US | indeed | https://www.indeed.com/viewjob?jk=76bcf… |
| AI Modernization Senior Lead Software E… | JPMorganChase | Jersey City, NJ, US | indeed | https://www.indeed.com/viewjob?jk=74806… |
| DevOps Engineer | OnMed | White Plains, NY, US | indeed | https://www.indeed.com/viewjob?jk=33f34… |
| Python Senior Lead Software Engineer- F… | JPMorganChase | New York, NY, US | indeed | https://www.indeed.com/viewjob?jk=d1937… |

***

### Use cases

- **Recruiting & staffing** — pull every open role for a title/location across boards into one pipeline.
- **Job boards & aggregators** — backfill and keep a niche board fresh from multiple sources.
- **Hiring-signal sales** — companies actively hiring for a role = a buying signal; target them.
- **Labor-market research** — salary ranges, remote share, and demand by title/location/region.
- **Personal job hunt** — one deduped feed instead of refreshing eight sites.

***

### Use with AI agents & automation

Run from the Apify **MCP** server so AI agents (Claude, ChatGPT, Cursor) can pull jobs as a tool call, schedule runs via **Make**, **n8n**, or **Zapier** to alert on new postings, or sync the dataset to **Google Sheets** for a live jobs dashboard. Clean flat JSON drops into ATS/CRM pipelines with no glue code.

***

### Pricing

**Pay-per-event — you're charged per job delivered** (the `job-scraped` event). You only pay for the deduplicated jobs that land in your dataset; failed/empty boards cost nothing. See the Apify Store page for the current per-job price.

***

### FAQ

**Where does the data come from?** Public job listings on LinkedIn, Indeed, Glassdoor, Google Jobs, ZipRecruiter, Bayt, BDJobs, and Naukri, via the open-source JobSpy engine.

**Do I need proxies?** Residential proxies are recommended for LinkedIn / Indeed / Glassdoor to avoid blocks. The actor is preconfigured to use Apify Residential proxies.

**Why did one board return nothing?** Boards occasionally rate-limit or change their markup. The actor skips a slow/blocked board on a timeout and still returns results from the others — re-run in a minute if a specific board matters.

**Can I search multiple titles at once?** Yes — use `searchTerms` (an array). Results are merged and deduplicated. Capped at 5 to control cost.

**Can I export to CSV or Google Sheets?** Yes — CSV, JSON, or Excel from the Output tab, or sync to Google Sheets via Make, n8n, or Zapier.

***

### Other Flash Scrape scrapers

- [Indeed Jobs Scraper](https://apify.com/flash_scraper/indeed-jobs-scraper) — single-board Indeed listings
- [LinkedIn Jobs Scraper](https://apify.com/flash_scraper/linkedin-jobs-scraper) — single-board LinkedIn postings
- [Google Maps Leads Scraper](https://apify.com/flash_scraper/google-maps-leads-opener) — local business leads
- [Trustpilot Reviews Scraper](https://apify.com/flash_scraper/trustpilot-reviews-scraper) — company reviews

# Actor input Schema

## `searchTerm` (type: `string`):

Job title or keywords, e.g. 'software engineer', 'registered nurse', 'sales manager'. Use this OR 'searchTerms' for multiple.

## `searchTerms` (type: `array`):

Run several searches in one go (results are merged + deduped). Overrides 'searchTerm' if set. Capped at 5 to control cost.

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

City, state, or country, e.g. 'New York, NY', 'London', 'Remote'. Leave empty for anywhere.

## `sites` (type: `array`):

Which boards to scrape. Fewer boards = faster, cheaper runs.

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

How many jobs to request from each board (1-100). Total rows can be higher across boards, fewer after dedup.

## `isRemote` (type: `boolean`):

Keep only remote / work-from-home jobs. Off = include on-site and hybrid roles too.

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

Keep only one employment type, e.g. 'fulltime' or 'contract'. Leave empty ('Any') to include all types.

## `hoursOld` (type: `integer`):

Only jobs posted in the last N hours (e.g. 24 = last day, 168 = last week). Leave empty for all.

## `countryIndeed` (type: `string`):

Country for Indeed & Glassdoor searches (e.g. 'usa', 'uk', 'canada', 'india', 'germany'). Default 'usa'.

## `googleSearchTerm` (type: `string`):

Full Google Jobs search string, e.g. 'software engineer jobs near New York since yesterday'. If empty, the actor builds one from your search term + location.

## `distance` (type: `integer`):

Search radius around the location, in miles.

## `offset` (type: `integer`):

Skip the first N results (for paging through large searches).

## `easyApply` (type: `boolean`):

LinkedIn/Indeed only: keep just direct/easy-apply jobs. Note: cannot be combined with 'Posted within' on those sites (it will be dropped there).

## `linkedinFetchDescription` (type: `boolean`):

Fetch each LinkedIn job's full description + direct URL (slower, more requests).

## `linkedinCompanyIds` (type: `array`):

Restrict LinkedIn results to specific company IDs.

## `descriptionFormat` (type: `string`):

Format of the job description field.

## `enforceAnnualSalary` (type: `boolean`):

Convert hourly/monthly salaries to an annual figure where possible.

## `userAgent` (type: `string`):

Custom User-Agent header. Optional.

## `caCert` (type: `string`):

Path/content for a custom CA certificate, if your proxy requires it. Optional.

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

Proxy settings. Residential proxies are recommended for LinkedIn/Indeed/Glassdoor to avoid blocks.

## Actor input object example

```json
{
  "searchTerm": "software engineer",
  "searchTerms": [],
  "location": "New York, NY",
  "sites": [
    "linkedin",
    "indeed",
    "glassdoor",
    "google",
    "zip_recruiter"
  ],
  "maxResults": 20,
  "isRemote": false,
  "jobType": "",
  "countryIndeed": "usa",
  "easyApply": false,
  "linkedinFetchDescription": false,
  "linkedinCompanyIds": [],
  "descriptionFormat": "markdown",
  "enforceAnnualSalary": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchTerm": "software engineer",
    "location": "New York, NY",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("flash_scraper/multi-jobboard-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 = {
    "searchTerm": "software engineer",
    "location": "New York, NY",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("flash_scraper/multi-jobboard-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 '{
  "searchTerm": "software engineer",
  "location": "New York, NY",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call flash_scraper/multi-jobboard-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/HzvpqlBISk1PaUKJ3/builds/oSaRwwo0p1zzWvMig/openapi.json
