# Multi-board Job MCP Server — Job Search for AI (`longanimous_bracken/multi-board-job-scraper`) Actor

MCP Server for multi-platform job search. Search jobs by keyword and location. AI-agent ready — returns title, company, location, and salary.

- **URL**: https://apify.com/longanimous\_bracken/multi-board-job-scraper.md
- **Developed by:** [petteri mähönen](https://apify.com/longanimous_bracken) (community)
- **Categories:** Jobs, MCP servers
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 job listing extracteds

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

## Remote Jobs Scraper

Scrape job listings from multiple boards in a single run — RemoteOK, WeWorkRemotely, Indeed, Glassdoor, LinkedIn, Working Nomads, Remotive, and more.

### What you get

For every job listing found, the Actor returns:

| Field | Example |
|---|---|
| `title` | `Senior Python Developer` |
| `company` | `Acme Corp` |
| `location` | `Remote` |
| `salary` | `$120,000 - $160,000` |
| `posted_date` | `2 days ago` |
| `description` | `We're looking for...` |
| `url` | `https://...` |
| `source_page` | `https://...` |
| `scraped_at` | `2025-07-04T12:00:00.000Z` |

### How to use

#### On Apify

1. Click **Run** (or call via API / integrate with Apify API)
2. Provide input (see below)
3. Results are saved to the Actor's Dataset — download as **JSON**, **CSV**, or stream via API

#### Via API

```bash
curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/run" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{"url": "https://remoteok.com/remote-software-dev-jobs"}],
    "maxPages": 30,
    "searchQuery": "python"
  }'
```

### Input

| Parameter | Required | Default | Description |
|---|---|---|---|
| `startUrls` | ✅ | — | Array of `{url}` objects — job listing pages to crawl |
| `maxPages` | ❌ | `50` | Maximum pages per URL |
| `searchQuery` | ❌ | — | Keyword filter (case-insensitive). Only jobs matching this term are returned |
| `maxResults` | ❌ | `0` | Stop after N results (`0` = no limit) |
| `proxy` | ❌ | — | Proxy configuration. Enable Apify Proxy for large crawls to avoid rate limits |

#### Example input

```json
{
  "startUrls": [
    { "url": "https://remoteok.com/remote-software-dev-jobs" },
    { "url": "https://weworkremotely.com/developers" }
  ],
  "maxPages": 30,
  "searchQuery": "python",
  "maxResults": 200
}
```

### Pricing

| Model | Price | When to choose |
|---|---|---|
| Pay-per-result | $0.003/result | You need a small, focused dataset |
| Pay-per-run | $5/run | You want predictable cost per crawl |
| Hybrid | $2 + $0.002/result | You want a low floor with fair scaling |

### FAQ

**How many results can I expect?** Depends on the source board and filters. A typical crawl of a niche board with `maxPages: 30` yields 100–500 listings.

**Can I run this on a schedule?** Yes — use [Apify Scheduled Runs](https://docs.apify.com/platform/integrations/scheduled-runs) or [Apify Webhooks](https://docs.apify.com/platform/integrations/webhooks) to trigger automatically.

**My results are empty — what's wrong?**

- Check that the URL is a job listing page (not a single job detail)
- Try removing `searchQuery` to see if the filter is too narrow
- Increase `maxPages` if the board paginates heavily

# Actor input Schema

## `boards` (type: `object`):

Toggle which boards to include. At least one must be enabled, or provide custom URLs below. URLs are auto-generated for enabled boards.

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

Add custom listing page URLs. These are added to any auto-generated board URLs. Leave empty to use only board defaults.

## `categories` (type: `object`):

Filter jobs by category on supported boards. Leave empty to scrape all categories. Only the first selected category per board is used.

## `searchQuery` (type: `string`):

Only keep results matching this keyword in title, company, or description. Case-insensitive partial match. Leave empty for no filter.

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

Stop after this many job listings are extracted across all boards. 0 = no limit.

## `maxPages` (type: `integer`):

Maximum number of listing pages to crawl per board (including pagination).

## `linkedinCookies` (type: `string`):

Required for LinkedIn scraping. Paste your LinkedIn cookies as JSON array: \[{"name":"li\_at","value":"...","domain":".linkedin.com"}, ...]. Extract from browser DevTools > Application > Cookies. Also requires RESIDENTIAL proxy.

## `proxy` (type: `object`):

Proxy configuration. RESIDENTIAL group required for Indeed, Glassdoor, and LinkedIn ($8/GB on Apify). Datacenter proxy (free) works for most other boards. Auto-enabled for Indeed/Glassdoor/LinkedIn if you leave this blank.

## Actor input object example

```json
{
  "searchQuery": "",
  "maxResults": 0,
  "maxPages": 50,
  "linkedinCookies": ""
}
```

# 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("longanimous_bracken/multi-board-job-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("longanimous_bracken/multi-board-job-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 longanimous_bracken/multi-board-job-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/qyvgH1BFhiTkPZ93y/builds/9TgwfvIQLO6yXPPhQ/openapi.json
