# Monster Jobs Scraper — Search, Company Jobs & Job Details (`sian.agency/monster-jobs-scraper`) Actor

Scrape Monster.com job postings with salary ranges, skills, exact posting dates, apply links and the employer's size, HQ address and founding year. Search by keyword and location, list every open job at up to 10 employers, or refresh up to 20 job ids per call.

- **URL**: https://apify.com/sian.agency/monster-jobs-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Jobs, Lead generation, Developer tools
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.64 / 1,000 search jobs

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/actors/running/actors-in-store.md#pay-per-event

## 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 Jobs Scraper — Job Postings, Salaries & Employers 🚀

[![Store SIÁN Agency](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Store Jobs Search API](https://img.shields.io/badge/Store-Jobs%20Search%20API-1AE392)](https://apify.com/sian.agency/jsearch-jobs-scraper?fpr=sian) [![Store LinkedIn Jobs Scraper](https://img.shields.io/badge/Store-LinkedIn%20Jobs%20Scraper-0077B5)](https://apify.com/sian.agency/linkedin-jobs-scraper?fpr=sian) [![Store ZipRecruiter Jobs Scraper](https://img.shields.io/badge/Store-ZipRecruiter%20Jobs%20Scraper-1AE392)](https://apify.com/sian.agency/ziprecruiter-jobs-scraper?fpr=sian)

#### 🎉 Monster job postings with salary, skills and the employer's size, HQ and founding year

##### Built for recruiters, sales teams and job boards that need Monster data as clean rows

***

### 🔎 What is the Monster Jobs Scraper — and when should you use it?

The **Monster Jobs Scraper** turns public Monster job postings, with salary, skills and the employer's profile into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** Monster job postings as rows: title, employer, location, exact posting date, the full description and a working apply link. Rows also carry Monster's skill tags, an O\*NET occupation code and, when the posting states one, a structured salary range. Where Monster publishes an employer profile, the row adds headcount band, HQ address, founding year and industry, so a job list doubles as a company list. Every row names its employer as Monster spells it, and that name is the key for listing all of the employer's open jobs in one follow-up run.

**Use something else when:** the roles are not on Monster, or one job board is not enough. Use [Jobs Search API](https://apify.com/sian.agency/jsearch-jobs-scraper?fpr=sian) for Indeed, Glassdoor and other boards aggregated into this same row shape. Use [Glassdoor Scraper](https://apify.com/sian.agency/glassdoor-data-scraper?fpr=sian) for employer reviews, salary reports and interview notes rather than open roles. Use [ZipRecruiter Jobs Scraper](https://apify.com/sian.agency/ziprecruiter-jobs-scraper?fpr=sian) for ZipRecruiter listings with pay ranges. This actor covers Monster's public job listings in 13 markets: the US, UK, Canada, Ireland, France, Belgium, the Netherlands, Spain, Sweden, Switzerland, Austria, Italy and Luxembourg. Monster lists no jobs in Germany, Australia or India. It also serves at most 510 postings per query for everyone, so a broader pull has to be split by city or keyword.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/monster-jobs-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want Monster job postings with salaries, skills and employer details using the Apify Actor `sian.agency/monster-jobs-scraper`.

Use it when I need: Monster job postings as rows: title, employer, location, exact posting date, the full description and a working apply link. Rows also carry Monster's skill tags, an O*NET occupation code and, when the posting states one, a structured salary range. Where Monster publishes an employer profile, the row adds headcount band, HQ address, founding year and industry, so a job list doubles as a company list. Every row names its employer as Monster spells it, and that name is the key for listing all of the employer's open jobs in one follow-up run.

Don't use it when: the roles are not on Monster, or one job board is not enough — use jsearch-jobs-scraper or glassdoor-data-scraper or ziprecruiter-jobs-scraper instead.

How to call it: pick one `operation` per run. `search` finds jobs by keyword: give it `query`, optionally a `location` such as "Austin, TX", a `country` code and `maxResults`. `companyJobs` lists every open job at up to 10 employers named in `companies`, spelled exactly as the `employerName` of a search row, since Monster has no company id. `jobDetails` re-fetches up to 20 known jobs per call from `jobIds`. It is billed per id, so use it to refresh a shortlist, not to collect. `datePosted`, `employmentTypes` and `remoteOnly` are applied by Monster itself. `radiusKm` needs a `location`. A search row already carries the full description and salary..

Start with this input:
{
  "operation": "search",
  "query": "software engineer",
  "location": "Austin, TX",
  "country": "us",
  "datePosted": "week",
  "maxResults": 50
}

Ask me which role or keyword they want, which city or country, and whether they want one employer's open jobs instead of a keyword search, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *Find registered nurse jobs posted this week around Dallas and show which ones state a salary range.*
- *List every open job at Amazon.com Inc and General Motors on Monster, grouped by city and occupation.*
- *Search data engineer jobs in the US and give me the hiring companies with their headcount band and HQ.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/monster-jobs-scraper.md](https://apify.com/sian.agency/monster-jobs-scraper.md).

### 📋 Overview

**Monster Jobs Scraper pulls Monster.com job postings into a clean dataset.** Each row has the title, employer, location, exact posting date, skills, occupation code, full description and a working apply link, plus the salary whenever the posting states one. It is built for recruiters, labor-market analysts, job boards and B2B sales teams who read hiring as a buying signal.

**What you get:**

- 🏢 **Employer profile on the row**: where Monster publishes one, each job carries the employer's headcount band, HQ address, founding year, industry and about text. No second lookup.
- 🔍 **Three ways in**: search by keyword and place, list every open job at up to 10 employers, or re-check up to 20 saved job ids per call
- 💰 **Structured salary**: minimum, maximum, period and currency as separate columns, next to the display string
- 🧠 **Skills and occupation**: Monster's skill tags plus an O\*NET occupation code and title on every row
- 🗓️ **Exact posting date**: a real date and timestamp, with Monster's own "30+ days ago" badge kept alongside
- 🌍 **13 markets**: US, UK, Canada, Ireland, France, Belgium, the Netherlands, Spain, Sweden, Switzerland, Austria, Italy and Luxembourg, each searched on its own Monster site
- 🔗 **Same row shape as our other job actors**: the field names match [Jobs Search API](https://apify.com/sian.agency/jsearch-jobs-scraper?fpr=sian) and [LinkedIn Jobs Scraper](https://apify.com/sian.agency/linkedin-jobs-scraper?fpr=sian), so one pipeline reads all three

***

### ✨ Features

- 🔍 **Search Jobs**: keyword, city, radius in km, date posted, employment type, remote only and sort order
- 🏢 **Company Jobs**: every open role at up to 10 employers in one run, optionally narrowed by keyword or city
- 📋 **Job Details**: re-fetch up to 20 jobs per call by id, Monster UUID, slug or monster.com URL
- 🧾 **Employer data**: headcount band, HQ address, founding year, industry, website and about text
- 💵 **Salary columns**: min, max, period, currency, or a single figure when the posting states one
- 🧠 **Skill tags and O\*NET code**: filter and count demand by skill or occupation
- 🔗 **Apply links that work**: tracking parameters stripped, plus the employer's own application page when Monster exposes it
- 📍 **Coordinates**: latitude and longitude on every posting, ready for a map
- 📄 **Run report**: every run writes a readable report with the jobs, the fixes for anything that failed, and exactly what you were charged
- 🆓 **No account needed**: no Monster login, cookies or proxy settings

***

### 🎬 Quick Start

Pick an operation, give it a keyword or an employer, and run. The actor returns 10 jobs per page and stops at your Max jobs. Results land in a dataset you can export as JSON, CSV or Excel.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~monster-jobs-scraper/runs?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"operation": "search", "query": "software engineer", "location": "Austin, TX", "maxResults": 50}'
```

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose what to scrape

Pick Search Jobs, Company Jobs or Job Details in the operation list.

#### Step 2: Fill in the target

Type a keyword and a city, paste employer names, or paste job ids and URLs.

#### Step 3: Run and export

Press Start, then download the dataset as JSON, CSV or Excel, or open the run report.

**Within a minute you'll have:**

- Every matching Monster job with title, employer, location and posting date
- Salary, skills and occupation where the posting states them
- Apply links and the Monster posting URL for each job

***

### 📥 Input Configuration

| Field | Type | Used by | Description |
|-------|------|---------|-------------|
| `operation` | string | all | `search`, `companyJobs` or `jobDetails` |
| `query` | string | search, companyJobs | Keyword such as "registered nurse". Required for search, optional filter for companyJobs |
| `location` | string | search, companyJobs | City or region, such as "Austin, TX". Empty searches the whole country |
| `country` | string | all | One of 13 markets: `us`, `gb`, `ca`, `ie`, `fr`, `be`, `nl`, `es`, `se`, `ch`, `at`, `it`, `lu` |
| `radiusKm` | integer | search, companyJobs | 1 to 160 km around the location. Needs a location |
| `datePosted` | string | search, companyJobs | `all`, `today`, `3days`, `week`, `month` |
| `employmentTypes` | array | search, companyJobs | Any of `FULLTIME`, `PARTTIME`, `CONTRACTOR`, `INTERN` |
| `remoteOnly` | boolean | search | Only jobs Monster marks as remote |
| `companies` | array | companyJobs | Up to 10 employer names, spelled as the `employerName` field of a search row |
| `jobIds` | array | jobDetails | Up to 20 per call: `jobId`, `jobUid`, `jobSeoId` or a monster.com job URL |
| `sortBy` | string | search | `relevance` or `date` (newest first) |
| `maxResults` | integer | search, companyJobs | 1 to 510. Monster serves at most 510 postings per query |

**Search example:**

```json
{
  "operation": "search",
  "query": "registered nurse",
  "location": "Dallas, TX",
  "radiusKm": 40,
  "datePosted": "week",
  "maxResults": 100
}
```

**Company Jobs example:** run a search first, copy the `employerName` of a row, and paste it here. Monster has no company id, so the name as Monster spells it is the key.

```json
{
  "operation": "companyJobs",
  "companies": ["Amazon.com Inc", "General Motors"],
  "maxResults": 100
}
```

**Job Details example:**

```json
{
  "operation": "jobDetails",
  "jobIds": [
    "bW9uc3RlcjowMGFlNTc4Mi0zOGQxLTRhOWEtYjYyYy0yYWFjMmU2ODU4ZDE",
    "https://www.monster.com/job-openings/software-engineer-1-it-round-rock-tx--cef711af-778e-4f02-b8ee-cd090a450cb9"
  ]
}
```

***

### 📤 Output

Every job is one row with **up to 50 fields**. Fields Monster did not publish for a posting are left out of that row rather than written as empty strings.

| Field | Type | Description |
|-------|------|-------------|
| `jobTitle` | string | Job title |
| `employerName` | string | Employer, as Monster spells it (the key for Company Jobs) |
| `employerSize` | string | Headcount band, such as "10,000 employees or more" |
| `employerAddress` | string | Employer HQ address |
| `employerFoundingDate` | string | Founding year |
| `industry` | string | Industry Monster assigns |
| `location`, `city`, `state`, `country` | string | Where the job is |
| `postedAtDate` | string | Posting date (YYYY-MM-DD) |
| `salaryString` | string | Salary as displayed |
| `minSalary`, `maxSalary` | number | Salary range |
| `salaryPeriod`, `salaryCurrency` | string | HOUR/DAY/WEEK/MONTH/YEAR and currency code |
| `skills` | array | Monster skill tags |
| `occupationalCategory`, `onetSoc` | string | O\*NET occupation title and code |
| `applyLink` | string | Where to apply |
| `jobUrl` | string | Monster posting page |
| `jobDescription` | string | Full posting text |
| `jobId`, `jobUid` | string | Ids for refreshing the job later |

**Example row** (from a live search for "software engineer" in Austin, TX; description shortened):

```json
{
  "jobId": "bW9uc3RlcjowMGFlNTc4Mi0zOGQxLTRhOWEtYjYyYy0yYWFjMmU2ODU4ZDE",
  "jobTitle": "Staff Software Engineer - Embedded Software Platform",
  "employerName": "General Motors",
  "employerSize": "10,000 employees or more",
  "employerAddress": "Flint, Michigan, US",
  "employerFoundingDate": "1908",
  "industry": "Automotive Sales and Repair Services",
  "location": "Austin, TX",
  "postedAtDate": "2026-09-04",
  "salaryString": "$171,150 - $288,500 per year",
  "minSalary": 171150,
  "maxSalary": 288500,
  "salaryPeriod": "YEAR",
  "salaryCurrency": "USD",
  "skills": ["Analysis Skills", "Application Programming Interface (API)", "Artificial Intelligence (AI)", "Automation"],
  "occupationalCategory": "15-1133.00: Software Developers, Systems Software",
  "applyType": "OFFSITE",
  "jobUrl": "https://www.monster.com/job-openings/staff-software-engineer-embedded-software-platform-austin-tx--00ae5782-38d1-4a9a-b62c-2aac2e6858d1",
  "validThrough": "2027-03-12T11:48:32.624Z",
  "jobUid": "00ae5782-38d1-4a9a-b62c-2aac2e6858d1",
  "_operation": "search",
  "status": "success"
}
```

***

### 💼 Use Cases & Examples

#### 1. Recruiting pipeline and talent sourcing

**Recruiters pull every Monster posting for a role and city on a schedule, with posting date and skills on each row, plus salary wherever the posting gives one.**

**Input:** `query` "registered nurse", `location` "Dallas, TX", `datePosted` "week"
**Output:** this week's nursing jobs with pay ranges and apply links
**Use:** a daily shortlist of fresh roles, no job-board tabs

#### 2. Competitor hiring intelligence

**Talent and strategy teams watch what rivals are hiring for.**

**Input:** Company Jobs with up to 10 employer names
**Output:** each employer's open roles with titles, occupations and locations
**Use:** see which teams a competitor is growing and in which cities

#### 3. B2B lead generation from hiring signals

**Sales teams treat a job posting as a buying signal for the tools that role uses.**

**Input:** search for the job title your product serves
**Output:** hiring companies, many with headcount band, HQ address, industry and website
**Use:** a lead list sorted by company size, straight from the job rows

#### 4. Compensation benchmarking

**HR and comp analysts collect stated salaries for a role across markets.**

**Input:** a role keyword, one run per city or country
**Output:** min, max, period and currency as numbers, dated exactly
**Use:** track pay movement week over week

#### 5. Skills demand and labor-market analytics

**Researchers count demand by skill and occupation.**

**Input:** broad keyword searches across cities
**Output:** skill tags and O\*NET codes on every row
**Use:** which skills are rising, where, and for which occupations

#### 6. Job board and aggregator content

**Niche job boards import fresh Monster postings.**

**Input:** a keyword plus `datePosted` "today"
**Output:** title, employer logo, description and apply link
**Use:** a daily feed in the same shape as our LinkedIn and Jobs Search actors

#### 7. Checking whether roles are still open

**Anyone holding a shortlist of saved jobs.**

**Input:** Job Details with up to 20 ids per call
**Output:** the current posting for each id still live
**Use:** ids missing from the output are postings Monster has taken down

***

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('sian.agency/monster-jobs-scraper').call({
  operation: 'search',
  query: 'software engineer',
  location: 'Austin, TX',
  maxResults: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].jobTitle, items[0].employerName, items[0].salaryString);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_API_TOKEN')

run = client.actor('sian.agency/monster-jobs-scraper').call(run_input={
    'operation': 'companyJobs',
    'companies': ['Amazon.com Inc'],
    'maxResults': 100,
})

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['jobTitle'], item.get('employerSize'), item.get('location'))
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~monster-jobs-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"operation": "search", "query": "warehouse associate", "location": "Columbus, OH", "datePosted": "3days", "maxResults": 30}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: a schedule, for example every morning at 7:00
2. **HTTP Request**: call the run-sync endpoint above with your search
3. **Process**: keep rows whose `postedAtDate` is new since yesterday
4. **Action**: push them to a sheet, a CRM or a Slack channel

***

### 📊 Performance & Pricing

Pay per job returned, plus a small start fee per run. Nothing is charged for a search that matched nothing, a closed posting, or an input the actor could not read.

| Event | Paid plans (from) | Free plan |
|---|---:|---:|
| Job found (Search Jobs) | $0.003 | $0.012 |
| Employer job found (Company Jobs) | $0.003 | $0.012 |
| Job detail returned (Job Details) | $0.010 | $0.040 |
| Run started | $0.005 | $0.02 |

A search row already carries the full posting, description and salary included. So collect jobs through Search Jobs or Company Jobs, and keep Job Details for re-checking ids you stored earlier.

#### FREE plan

- **25 jobs** per run, every field included
- No credit card required to try it

#### PAID plans

- **Up to 510 jobs** per query, which is Monster's own ceiling
- Lower prices on higher Apify plans (down to $0.00234 per job)

🔗 [View current pricing](https://apify.com/sian.agency/monster-jobs-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: Do I need a Monster account or cookies?**
A: No. The actor reads Monster's public job listings. There is nothing to log in to and nothing of yours to get restricted.

**Q: How do I get every job at one company?**
A: Run Search Jobs first and copy the `employerName` of any row, for example "Amazon.com Inc". Paste it into Employer names and pick Company Jobs. Monster has no company id, so a slug or a misspelling returns nothing. The same company can appear under more than one name ("General Motors" and "General Motors Co"), so add both if you see both.

**Q: Why do only some rows have employer size, address and founding year?**
A: Monster only shows that profile for employers that set one up, roughly one posting in six. Where it exists you get size band, HQ address, founding year, industry and about text. Where it does not, those fields are absent.

**Q: How many jobs can I get for one search?**
A: Up to 510. Monster stops serving results past that point for everyone, however broad the query. For more, split the search by city or by narrower keywords.

**Q: Which countries are covered?**
A: The US, UK, Canada, Ireland, France, Belgium, the Netherlands, Spain, Sweden, Switzerland, Austria, Italy and Luxembourg. Monster lists no jobs in Germany, Australia, India and most of Asia and Latin America, so those are not offered.

**Q: Why is the Remote field empty on most rows?**
A: Monster only says whether a job is remote on postings returned because of a remote filter. A blank means Monster did not say, not that the job is on-site. Turn on Remote jobs only when remote matters.

**Q: Why is the date posted older than the window I picked?**
A: Monster filters on its own refresh date, so a job reposted this week can carry an original posting date from earlier.

**Q: What export formats are available?**
A: JSON, CSV, Excel, XML and HTML, straight from the Apify dataset, or through the API.

***

### 🐛 Troubleshooting

**Company Jobs returned nothing**

- Check the spelling against the `employerName` of a search row, including "Inc", "Co" or ".com"
- An employer with no open jobs and a name Monster does not know look the same, so try the name exactly as a search row shows it

**Search returned fewer jobs than Max jobs**

- Clear the Location to search the whole country, or widen Date posted
- Check the Country: each market only lists its own jobs

**"Radius needs a Location"**

- Add a city such as "Austin, TX", or clear the Radius. Monster ignores a radius on a country-wide search

**Job Details returned fewer rows than ids**

- The missing postings are closed. You were not charged for them. Take fresh ids from a Search Jobs run

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

Monster is a trademark of its respective owner. This actor is not affiliated with, endorsed by, or sponsored by Monster, and it reads only publicly listed job postings.

***

### 🤝 Support

**We answer every issue**

- For issues or feature requests, open an issue on the [actor's Issues tab](https://apify.com/sian.agency/monster-jobs-scraper/issues)
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Changelog

This Actor's version history is a separate document: https://apify.com/sian.agency/monster-jobs-scraper/changelog.md

# Actor input Schema

## `operation` (type: `string`):

Pick one operation per run. Search Jobs finds postings by keyword and place. Company Jobs lists every open role at up to 10 employers, named exactly as the employerName field spells them. Job Details re-fetches up to 20 known job ids per call. A search row already carries the full posting, so use Job Details only to refresh ids you stored earlier.

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

Job title, skill or free-text phrase, as you would type it into Monster's own search box, for example "registered nurse" or "warehouse associate". Required by Search Jobs. Optional for Company Jobs, where it narrows the employer's list to matching roles; leave it empty there to get every open job.

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

Free-text city or region, for example "Austin, TX", "New York, NY" or "London". Leave it empty to search the whole country, which returns far more jobs than any one city. Needed if you set a radius.

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

Which Monster market to search. Each market's own site carries 1.35x to 6.9x more jobs than searching it from the US site, so pick the country the jobs are in. Only markets where Monster actually lists jobs are offered: Germany, Australia and India, for example, return nothing on Monster at all.

## `radiusKm` (type: `integer`):

Search radius around the Location, in kilometres. Needs a Location: Monster ignores a radius on a country-wide search, so the pair is rejected rather than silently dropped. Monster returns nothing past 160 km.

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

Only jobs posted or refreshed within this window. Applied by Monster, so it costs nothing extra. Monster filters on its own refresh date, which means a returned job's original posting date can be older than the window.

## `employmentTypes` (type: `array`):

Keep only these employment types. Pick any combination; a job matching any of them is returned. Leave empty for every type. Applied by Monster itself.

## `remoteOnly` (type: `boolean`):

Keep only jobs Monster marks as remote. On its own it is a real Monster filter. Combined with Employment types it is applied after fetching instead, because Monster would otherwise return "full-time OR remote"; that combination returns fewer jobs and takes longer. Company Jobs ignores it.

## `companies` (type: `array`):

Used by Company Jobs. Up to 10 employer names, spelled exactly as the employerName field of any Search Jobs row spells them, for example "Amazon.com Inc" or "Qualcomm". Monster publishes no company id, so run a search first and copy employerName. Matching is by substring: a misspelling returns nothing, and a short name can also match longer names containing it.

## `jobIds` (type: `array`):

Used by Job Details. Up to 20 per call, any mix of: the jobId from a search row, Monster's own jobUid (a UUID), the jobSeoId, or a full monster.com/job-openings/... URL. Duplicates are collapsed first. A closed or unknown posting is simply absent from the results, and you are not charged for it.

## `sortBy` (type: `string`):

Date sorts the jobs inside each page of results newest-first. It cannot re-rank Monster's whole result set, because Monster ignores its own sort order. Pair it with Date posted for a genuinely fresh list. Company Jobs keeps Monster's order.

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

Upper bound on jobs returned by Search Jobs and Company Jobs. Monster serves 10 per page and stops at 510 postings per query, however broad. Job Details ignores it and returns one row per job id you supply.

## Actor input object example

```json
{
  "operation": "search",
  "query": "software engineer",
  "location": "Austin, TX",
  "country": "us",
  "datePosted": "all",
  "remoteOnly": false,
  "companies": [
    "Amazon.com Inc",
    "Qualcomm"
  ],
  "jobIds": [
    "bW9uc3RlcjpjZWY3MTFhZi03NzhlLTRmMDItYjhlZS1jZDA5MGE0NTBjYjk"
  ],
  "sortBy": "relevance",
  "maxResults": 50
}
```

# Actor output Schema

## `monsterJobs` (type: `string`):

Every job this run returned.

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# 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 = {
    "operation": "search",
    "query": "software engineer",
    "location": "Austin, TX",
    "country": "us",
    "datePosted": "all",
    "remoteOnly": false,
    "sortBy": "relevance",
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/monster-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 = {
    "operation": "search",
    "query": "software engineer",
    "location": "Austin, TX",
    "country": "us",
    "datePosted": "all",
    "remoteOnly": False,
    "sortBy": "relevance",
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/monster-jobs-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 '{
  "operation": "search",
  "query": "software engineer",
  "location": "Austin, TX",
  "country": "us",
  "datePosted": "all",
  "remoteOnly": false,
  "sortBy": "relevance",
  "maxResults": 50
}' |
apify call sian.agency/monster-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/monster-jobs-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/976FcpL92MgdXUgiG/builds/mDkZiEvBG7hShlYoL/openapi.json
