# Monster Job Scraper (`shahidirfan/monster-job-scraper`) Actor

Extract job listings from Monster.com with job titles, companies, locations, salaries, descriptions, employment types, posting dates, and job URLs. Ideal for job market research, recruitment analytics, salary benchmarking, competitor tracking, and AI datasets.

- **URL**: https://apify.com/shahidirfan/monster-job-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Monster Job Scraper

Extract Monster job listings with titles, companies, locations, salaries, descriptions, skills, application links, and posting dates. Use it for recruiting research, job market tracking, lead generation, and employment data analysis.

### Features

- **URL or keyword search** - Start from a Monster search URL, a job URL, or a keyword and location search.
- **Automatic pagination** - Collect multiple result pages until your requested result count or page limit is reached.
- **Rich job records** - Gather full descriptions, apply links, company names, salaries, skills, employment types, and structured locations.
- **Resilient collection** - A quick search attempt, keyword-aware seed discovery, and related-listing expansion keep collection running when a page or request is temporarily unavailable.
- **Clean datasets** - Empty and always-null values are removed from saved records.
- **Production controls** - Set result limits, page limits, radius, recency, employment type, country, and proxy settings.

***

### Use Cases

#### Recruiting Research

Track open roles by title, city, company, or hiring category. Build lists of current opportunities and review how employers describe similar roles.

#### Labor Market Analysis

Collect job titles, locations, posting dates, skills, salaries, and employment types for hiring trend reports. Compare demand across regions or job families.

#### Lead Generation

Find companies actively hiring for specific roles. Use company, title, apply URL, and provider fields to support outreach workflows.

#### Job Monitoring

Run scheduled searches for new postings and export results to your preferred database, spreadsheet, or automation tool.

***

### Input Parameters

| Parameter            | Type    | Required | Default                    | Description                                                                     |
| -------------------- | ------- | -------- | -------------------------- | ------------------------------------------------------------------------------- |
| `startUrl`           | String  | No       | Empty                      | Monster search URL or job URL. When supplied, keyword and location are ignored. |
| `keyword`            | String  | No       | `Administrative Assistant` | Job title, skill, or search phrase. Used when no URL is supplied.               |
| `location`           | String  | No       | Empty                      | City, state, ZIP code, or country for keyword searches.                         |
| `country`            | String  | No       | `us`                       | Two-letter country code for keyword searches.                                   |
| `radius`             | Integer | No       | `30`                       | Search radius around the location in miles.                                     |
| `recency`            | Integer | No       | Empty                      | Optional maximum age of postings in days.                                       |
| `employmentType`     | String  | No       | Empty                      | Optional employment type filter such as `FULL_TIME` or `PART_TIME`.             |
| `results_wanted`     | Integer | No       | `20`                       | Maximum jobs to save.                                                           |
| `max_pages`          | Integer | No       | `5`                        | Maximum result pages to request.                                                |
| `proxyConfiguration` | Object  | No       | Residential proxy          | Apify Proxy configuration. Countries rotate on retry when none is selected.     |

When a Monster URL is supplied, the scraper uses the URL parameters exactly as provided. Clear the keyword field if you want a URL-only run to remain unambiguous in the Console.

***

### Output Data

| Field                   | Type    | Description                                  |
| ----------------------- | ------- | -------------------------------------------- |
| `job_id`                | String  | Monster job identifier.                      |
| `title`                 | String  | Job title.                                   |
| `company`               | String  | Hiring organization.                         |
| `location`              | String  | Formatted job location.                      |
| `locations`             | Array   | Structured location objects.                 |
| `is_remote`             | Boolean | Whether the role is marked remote.           |
| `salary_min`            | Number  | Minimum salary when provided.                |
| `salary_max`            | Number  | Maximum salary when provided.                |
| `salary_currency`       | String  | Salary currency.                             |
| `salary_unit`           | String  | Salary period or unit.                       |
| `salary_raw`            | String  | Salary text as published.                    |
| `employment_type`       | Array   | Employment type values.                      |
| `skills`                | Array   | Extracted skill terms.                       |
| `date_posted`           | String  | Posting date.                                |
| `date_recency`          | String  | Human-readable recency such as "3 days ago". |
| `valid_through`         | String  | Expiration date when available.              |
| `description_text`      | String  | Plain text job description.                  |
| `short_description`     | String  | Short summary.                               |
| `apply_type`            | String  | How applications are handled.                |
| `apply_url`             | String  | Application link.                            |
| `url`                   | String  | Monster job URL.                             |
| `provider_name`         | String  | Job source provider.                         |
| `occupational_category` | String  | Occupation or category code.                 |
| `search_query`          | String  | Keyword used for the search.                 |
| `search_location`       | String  | Location used for the search.                |
| `search_id`             | String  | Search session identifier.                   |
| `page`                  | Integer | Result page the job was found on.            |
| `position`              | Integer | Position within the overall result set.      |

***

### Usage Examples

#### Search URL

```json
{
    "startUrl": "https://www.monster.com/jobs/search?q=Administrative+Assistant&where=&page=1&so=m.u.sh",
    "results_wanted": 20,
    "max_pages": 2
}
```

#### Keyword and Location

```json
{
    "keyword": "Data Analyst",
    "location": "New York, NY",
    "radius": 30,
    "results_wanted": 50,
    "max_pages": 4
}
```

#### Single Job URL

```json
{
    "startUrl": "https://www.monster.com/job-openings/example-role--e54c513e-fc6d-4e9b-b914-26742fc14ba8",
    "results_wanted": 1
}
```

***

### Sample Output

```json
{
    "job_id": "e54c513e-fc6d-4e9b-b914-26742fc14ba8",
    "title": "Administrative Assistant / Receptionist",
    "company": "Bank of New England",
    "location": "Salem, NH, US",
    "locations": [{ "city": "Salem", "region": "NH", "country": "US" }],
    "employment_type": ["FULL_TIME"],
    "is_remote": false,
    "date_posted": "2026-07-09T19:56:00.000Z",
    "date_recency": "3 days ago",
    "valid_through": "2027-01-05T19:56Z",
    "apply_type": "OFFSITE",
    "apply_url": "https://example.com/apply",
    "url": "https://www.monster.com/job-openings/administrative-assistant-receptionist-salem-nh--e54c513e-fc6d-4e9b-b914-26742fc14ba8",
    "short_description": "Now Hiring: Administrative Assistant / Receptionist...",
    "skills": ["Customer Service", "Scheduling"],
    "provider_name": "[AW]-iCims",
    "page": 1,
    "position": 1
}
```

***

### Tips for Best Results

#### Start Small

- Test with `20` results before larger runs.
- Increase `max_pages` only when you need deeper coverage.

#### Use Specific Searches

- Combine clear job titles with locations for targeted datasets.
- Use Monster search URLs when you already configured filters on the website.

#### Proxy Configuration

For reliable production runs, residential proxies are recommended:

```json
{
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
}
```

Leave `apifyProxyCountry` unset to allow country rotation on retry. Set it only when you need a specific country.

***

### Integrations

Connect your data with:

- **Google Sheets** - Review and share job lists.
- **Airtable** - Build searchable recruiting databases.
- **Slack** - Send alerts for new matches.
- **Webhooks** - Push results to your own systems.
- **Make** - Build automated workflows.
- **Zapier** - Trigger follow-up actions.

#### Export Formats

- **JSON** - For applications and data pipelines.
- **CSV** - For spreadsheet analysis.
- **Excel** - For reporting.
- **XML** - For system integrations.

***

### Frequently Asked Questions

#### Can I use a Monster URL instead of keywords?

Yes. Provide a Monster search URL or job URL in `startUrl`. URL parameters take priority over keyword and location inputs.

#### Can I collect more than one page?

Yes. Set `results_wanted` and `max_pages` to control pagination. The scraper keeps requesting pages until it reaches the result limit, the page limit, or repeated pages without new jobs.

#### Why did the run stop before `results_wanted`?

Monster can return overlapping listings across pages. The scraper skips duplicates and stops after repeated pages with no new jobs. It also expands coverage through related listings when the normal search is blocked or limited. `results_wanted` is a maximum, not a guarantee.

#### What happens when Monster blocks the search page?

The scraper makes one quick search attempt, then discovers keyword-relevant seed listings and expands through related jobs. This usually finishes much faster than retrying the blocked search page.

#### Why are some fields missing?

Some employers do not publish every field. Empty values are removed from each saved item.

#### Can I search by location?

Yes. Use the `location` input or provide a Monster URL that already contains a location filter.

#### Is proxy configuration required?

It is recommended for production runs, especially when collecting many results.

***

### Support

For issues or feature requests, contact support through the Apify Console.

#### Resources

- [Apify Documentation](https://docs.apify.com/)
- [API Reference](https://docs.apify.com/api/v2)
- [Scheduling Runs](https://docs.apify.com/schedules)

***

### Legal Notice

This actor is designed for legitimate data collection purposes. Users are responsible for ensuring compliance with website terms of service and applicable laws. Use data responsibly and respect rate limits.

# Actor input Schema

## `startUrl` (type: `string`):

Monster search URL or job URL. When supplied, URL parameters are used and keyword and location inputs are ignored.

## `keyword` (type: `string`):

Job title, skill, or search phrase. Used when no Monster URL is supplied.

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

City, state, ZIP code, or country for keyword searches. Leave empty for broad results.

## `country` (type: `string`):

Two-letter country code for keyword searches.

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

Search radius around the location.

## `recency` (type: `integer`):

Optional maximum age of job postings in days.

## `employmentType` (type: `string`):

Optional Monster employment type filter, such as FULL_TIME or PART_TIME.

## `results_wanted` (type: `integer`):

Maximum number of jobs to save.

## `max_pages` (type: `integer`):

Maximum number of search result pages to request.

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

Apify Proxy settings. Residential proxies are recommended. When no country is selected, the actor rotates proxy countries on retry.

## Actor input object example

```json
{
  "keyword": "Administrative Assistant",
  "country": "us",
  "radius": 30,
  "results_wanted": 20,
  "max_pages": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "keyword": "Administrative Assistant"
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/monster-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 = { "keyword": "Administrative Assistant" }

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/monster-job-scraper").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 '{
  "keyword": "Administrative Assistant"
}' |
apify call shahidirfan/monster-job-scraper --silent --output-dataset

```

## MCP server setup

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

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/OJUdKcKd3PlxEL71U/builds/W1ZXFhXFfZgJNxSxM/openapi.json
