# Monster Job Scraper — Salary, Apply URLs & Descriptions (`corvuslab/monster`) Actor

Scrape Monster.com US job listings: title, company, salary (min/max/currency), location & geo, apply URL, skills, SOC codes and full descriptions. Incremental change tracking, notifications and compact AI output built in.

- **URL**: https://apify.com/corvuslab/monster.md
- **Developed by:** [Corvuslab](https://apify.com/corvuslab) (community)
- **Categories:** Lead generation, Jobs, Automation
- **Stats:** 2 total users, 1 monthly users, 20.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## Monster Job Scraper — Salary, Apply URLs & Full Descriptions

> **Turn every live Monster.com job posting into clean, structured data — in seconds, at scale.**

Scrape job listings from **[Monster.com](https://www.monster.com)**, one of the largest U.S. job
boards, and get back everything that matters: **structured salary (min / max / currency / period)**,
apply URLs, geo-coordinates, skills, extracted contacts and the full description. Search by keyword
and location or paste a Monster search URL — no code required. Export to **JSON, CSV, Excel or the
API**, or pipe it straight into Google Sheets, n8n, Make or an AI agent (MCP).

**Why this scraper**

- ⚡ **Fast & low-cost** — a lean HTTP data path, not slow page-by-page rendering, so large runs stay cheap.
- 🧾 **Rich, typed records** — 30+ structured fields per job, not raw HTML.
- ♻️ **Cheap to monitor** — incremental mode re-scrapes only what changed (see below).
- 🔔 **Notifications built in** — Telegram, Slack, Discord, WhatsApp or any webhook.
- 🤖 **AI- & API-ready** — compact output, MCP-friendly, one-click integrations.

***

### ✨ Key features

- 🔎 **Search or URL scraping** — run a keyword + location search, or paste a Monster.com search
  URL you already ran in your browser.
- 💰 **Structured salary** — not just the raw text: `salaryMin`, `salaryMax`, `salaryCurrency` and
  pay period broken out for instant benchmarking.
- 🗺️ **Geo-tagged** — city / state / ZIP plus latitude & longitude and a remote flag, ready for
  mapping and regional analysis.
- 🧠 **Full job details** — description as text / HTML / Markdown, skills, employment type,
  occupational (SOC) category, posting date and the direct apply URL.
- 📇 **Extracted contacts** — emails, phone numbers and links pulled from each description for
  lead generation.
- ♻️ **Incremental monitoring** — schedule a run and get only what changed (NEW / UPDATED /
  EXPIRED), with reposted-job detection; unchanged jobs are skipped before their page is fetched.
- 🔔 **Notifications** — push new jobs to Telegram, Slack, Discord, WhatsApp or any webhook
  (n8n / Make / Zapier).
- 🤖 **AI-ready** — compact mode + drop-empty-fields mode keep payloads lean for LLMs and MCP.

***

### 📤 Example output

```json
{
  "id": "e6b35595-ceeb-4245-b571-76bada4f2b57",
  "title": "Neuro ICU Registered Nurse (NIGHTS) - $12K BONUS",
  "company": "Jobot",
  "location": "Dallas, TX",
  "city": "Dallas",
  "state": "TX",
  "postalCode": "75201",
  "country": "US",
  "latitude": 32.783,
  "longitude": -96.807,
  "isRemote": false,
  "salaryText": "$85,000 - $125,000 / Year",
  "salaryMin": 85000,
  "salaryMax": 125000,
  "salaryCurrency": "USD",
  "salaryUnit": "YEAR",
  "employmentType": "FULL_TIME",
  "occupationalCategory": "29-1141.00: Registered Nurses",
  "skills": ["Registered Nurse (RN)", "Neuro-Intensive Care Unit", "Critical Care"],
  "url": "https://www.monster.com/job-openings/neuro-icu-registered-nurse-...",
  "applyUrl": "https://jobot.com/apply/...",
  "extractedEmails": ["careers@jobot.com"],
  "extractedPhones": ["+1-214-555-0142"],
  "postedDate": "2026-07-28T13:49:47.165Z",
  "dateRecency": "6 days ago",
  "description": "TOP Shift Diffs * $12K BONUS * RELO ASSISTANCE ...",
  "source": "monster.com",
  "scrapedAt": "2026-08-04T21:33:37Z"
}
```

Descriptions are also available as **HTML** and **Markdown**, not just plain text.

***

### 📚 What data can you extract?

- **Core** — id, title, company, location / city / state / ZIP / country, latitude & longitude,
  remote flag, posting date and recency.
- **Salary** — raw text plus structured `salaryMin` / `salaryMax` / `salaryCurrency` and pay period.
- **Details** (with *Fetch full details*) — description (text / HTML / Markdown), skills,
  employment type, occupational (SOC) category, apply URL and apply type.
- **Contacts** — emails, phone numbers and links extracted from the description.
- **Incremental** — `changeType`, first/last-seen timestamps and repost detection on scheduled runs.

Every field is present in standard mode (missing values are `null`); **compact mode** returns the
core fields only, for lean AI/MCP payloads.

***

### ⚙️ Input

Configure it in the visual editor — no code needed — or pass JSON via the API.

| Field | What it does |
|---|---|
| `query` | Job title, skill or company; comma-separate several searches. |
| `location` | City, state or ZIP (e.g. `New York, NY`, `Texas`, `90210`). Empty = nationwide. |
| `radius` | Miles around the location. |
| `startUrls` | Paste Monster.com search-result URLs to scrape directly. |
| `employmentType` / `datePosted` / `companyName` | Narrow the search. |
| `includeDetails` | Fetch each job's page for the full description, skills and contacts. |
| `incrementalMode` | Emit only what changed since the last run. |
| `maxResults` | Cap the number of jobs (0 = unlimited). |
| `proxyConfiguration` | Optional — works without a proxy at typical volumes. |

…and **28 inputs** in total — the table shows the essentials; the rest cover description formatting
(`descriptionFormat`, `descriptionMaxLength`), AI/compact output (`compact`, `excludeEmptyFields`),
notification channels (Telegram / Slack / Discord / webhook) and advanced tuning, all in the visual
editor.

**Example inputs**

```json
{ "query": "registered nurse", "location": "Dallas, TX", "maxResults": 100 }
```

```json
{ "query": "data analyst", "location": "New York, NY", "radius": 25, "includeDetails": true }
```

```json
{ "query": "warehouse", "location": "Texas", "incrementalMode": true, "stateKey": "tx-warehouse", "telegramToken": "...", "telegramChatId": "..." }
```

***

### 💡 Use cases

- **Recruiters & sourcers** — pull fresh, structured openings with apply links and extracted contacts.
- **Job boards & aggregators** — ingest normalized listings with salary and geo-coordinates.
- **Salary & market research** — benchmark pay by title, region and category over time.
- **Lead generation** — find companies actively hiring, with contact details pulled from descriptions.
- **Regional & mapping analysis** — use lat/long and ZIP to map demand by area.
- **AI agents & pipelines** — compact, structured job data as a tool feed for LLM/MCP workflows.

***

### ♻️ Incremental monitoring — pay for changes, not repeats

Schedule the actor and turn on **incremental mode**: each run compares against the last and emits
only **NEW / UPDATED / EXPIRED** jobs — unchanged jobs are skipped *before* their detail page is
even fetched, so a daily watch costs a fraction of a full re-scrape.

| Daily churn | of 1,000 tracked | billable jobs | you save |
|---|---|---|---|
| 5 % | 1,000 | 50 | **95 %** |
| 15 % | 1,000 | 150 | **85 %** |
| 30 % | 1,000 | 300 | **70 %** |

The first run seeds the baseline and bills in full; every run after that bills only the delta.

***

### 🚀 How to run it

1. Enter a **search keyword** (e.g. `registered nurse`) and a **location** (or leave it empty for nationwide) — or paste a Monster.com URL.
2. Set **Max results** and choose whether to **fetch full details**.
3. (Optional) Turn on **incremental mode** and a **notification** channel, then **Schedule** it.
4. Click **Start**.
5. Download the data as **JSON, CSV or Excel**, or pull it from the **API**.

New to Apify? Create a free account — it comes with monthly credit, no credit card required.

***

### 🔌 Integrations & export

Export to **JSON, CSV, Excel** or an HTML table, or pull from the **REST API** and the
**JavaScript / Python** clients. Runs on a **schedule**, connects to **Google Sheets, Slack, Make,
Zapier and n8n**, and works as an **MCP tool** for AI agents — compact mode plus
`descriptionMaxLength` keeps token usage small.

***

### ❓ FAQ

**How many jobs can I get?** As many as the search returns — set `maxResults` to cap it (0 = unlimited).

**Can I track a search over time?** Yes — turn on **incremental mode** and schedule the actor; each
run emits only what changed, so you never re-pay for unchanged jobs, and it can notify your channel.

**Can I paste a URL from my browser?** Yes — paste any Monster.com search URL into `startUrls`.

**Which countries does it cover?** Monster.com covers the United States.

**Can I export to CSV / Excel / Google Sheets?** Yes — from the dataset, or via the API, webhooks
and Apify integrations (Make, Zapier, n8n).

**Is it good for AI agents?** Yes — enable compact mode; the output is MCP-friendly.

***

### ⚖️ Disclaimer

This actor accesses only publicly available data on Monster.com. You are responsible for how you
use the extracted data — in particular any personal information such as names, phone numbers or
email addresses — and for complying with the site's terms and applicable law (including the GDPR
where it applies). Not affiliated with, endorsed by, or sponsored by Monster.

***

**Keywords:** monster scraper · monster.com scraper · monster job scraper · monster jobs api · job listings scraper · salary data scraper · apply url extractor · recruitment sourcing · lead generation · job market research · salary benchmarking · job monitoring · export to CSV/Excel/JSON · no-code job scraper · MCP tool for AI agents

# Actor input Schema

## `query` (type: `string`):

Job title, skill or company to search for, e.g. "software engineer" or "registered nurse". Leave empty to browse all jobs in the location.

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

City, state or ZIP code, e.g. "New York, NY", "Texas" or "90210". Leave empty for nationwide (US).

## `radius` (type: `integer`):

Distance from the location to include, in miles.

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

Paste Monster.com search-result URLs to scrape directly (e.g. a browser search you already ran). The keyword and location are read from the URL.

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

Maximum number of jobs to return. Set 0 for unlimited (bounded by how many the search has).

## `ignoreUrlFailures` (type: `boolean`):

Skip start URLs that cannot be interpreted instead of failing the whole run.

## `employmentType` (type: `array`):

Restrict to specific employment types.

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

Only jobs posted within this window.

## `companyName` (type: `string`):

Restrict results to a specific company (as shown on Monster).

## `includeDetails` (type: `boolean`):

Include the full job description and the contacts extracted from it. Turn off for smaller, faster records.

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

Which representation(s) of the job description to include.

## `descriptionMaxLength` (type: `integer`):

Truncate each description to this many characters (0 = no limit).

## `compact` (type: `boolean`):

Emit only the core fields. Ideal for AI agents and MCP clients.

## `excludeEmptyFields` (type: `boolean`):

Remove null, empty-string and empty-array fields from each record.

## `incrementalMode` (type: `boolean`):

Track state between runs and tag every job with a changeType (NEW / UPDATED / UNCHANGED / EXPIRED).

## `stateKey` (type: `string`):

Stable name for the tracked search. Leave empty to derive one automatically from your search settings.

## `emitUnchanged` (type: `boolean`):

Also emit jobs that have not changed since the previous run.

## `emitExpired` (type: `boolean`):

Emit jobs that were present last run but are gone now.

## `telegramToken` (type: `string`):

Bot token from @BotFather.

## `telegramChatId` (type: `string`):

Chat or channel ID, e.g. "-100123456789" or "@yourchannel".

## `slackWebhookUrl` (type: `string`):

Slack incoming-webhook URL.

## `discordWebhookUrl` (type: `string`):

Discord incoming-webhook URL.

## `webhookUrl` (type: `string`):

Any HTTPS endpoint. Receives a JSON POST with the matched jobs — works with n8n, Make and Zapier.

## `webhookHeaders` (type: `object`):

Extra headers for the webhook request, e.g. {"Authorization": "Bearer xyz"}.

## `notificationLimit` (type: `integer`):

How many jobs to include in each notification message.

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

By default the actor runs with no proxy (fastest and free) — this is all it needs. Leave as-is unless your runs start getting blocked, in which case enable the residential fallback below.

## `allowResidentialFallback` (type: `boolean`):

If the default connection gets blocked, automatically switch to (billed) residential proxies to finish the run. Off by default — this actor does not normally need residential.

## `pageSize` (type: `integer`):

Results fetched per request. Larger pages mean fewer requests.

## Actor input object example

```json
{
  "query": "registered nurse",
  "location": "New York, NY",
  "radius": 30,
  "maxResults": 25,
  "ignoreUrlFailures": true,
  "datePosted": "",
  "includeDetails": true,
  "descriptionFormat": "all",
  "descriptionMaxLength": 0,
  "compact": false,
  "excludeEmptyFields": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "notificationLimit": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "allowResidentialFallback": false,
  "pageSize": 25
}
```

# Actor output Schema

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

No description

## `allItems` (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 = {
    "query": "software engineer",
    "location": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("corvuslab/monster").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 = {
    "query": "software engineer",
    "location": "",
}

# Run the Actor and wait for it to finish
run = client.actor("corvuslab/monster").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "query": "software engineer",
  "location": ""
}' |
apify call corvuslab/monster --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corvuslab/monster"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/3I2jQPSNl9pUnQElx/builds/tUanWO6El5OWrKaHt/openapi.json
