# The Muse Jobs Search Scraper (`jobsapi/themuse-jobs-search-scraper`) Actor

Scrape job listings from The Muse (themuse.com/jobs), a US career platform featuring company profiles and professional jobs. Extract job titles, companies, locations, salary ranges, job types, and descriptions for recruitment and employer branding research.

- **URL**: https://apify.com/jobsapi/themuse-jobs-search-scraper.md
- **Developed by:** [Jobs API](https://apify.com/jobsapi) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 1,000 job details

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

## The Muse Jobs Search Scraper

This Actor extracts rich, verified public job records from [The Muse](https://www.themuse.com). It uses native HTTPS requests and Cheerio to read server-rendered job cards, public React Flight payloads, public JobPosting data, and the visible detail description.

The implementation runs locally or on Apify Cloud using direct public HTTPS. It uses Apify dataset and key-value storage, but does not use a proxy, spoof fingerprints, solve challenges, or fabricate an application URL. A normal browser user-agent and navigation headers are sent to the public site.

### Modes

- Search: use query, optional location, and bounded maxPages/maxItems.
- Single: provide one official jobUrl.
- Multiple: provide a bounded jobUrls or directUrls list.

The Muse job URLs are slug-based and do not expose an ID-only public route. jobId and jobIds are therefore optional identity checks that must be paired with matching public URLs.

Example search input:

```json
{
  "mode": "search",
  "query": "software engineer",
  "maxItems": 3,
  "maxPages": 1,
  "maxConcurrency": 3
}
```

Example single input:

```json
{
  "mode": "single",
  "jobUrl": "https://www.themuse.com/jobs/arcadia/principal-software-engineerplatforms",
  "maxItems": 1
}
```

### Dataset

Every emitted row is buffered until the detail page has been parsed and identity-checked. Required fields are record metadata, mode, job ID, title, official job URL, company, location, full description, source URLs, and scrape timestamp. Optional publisher fields are omitted when The Muse does not publish them, so successful rows contain no null, blank, placeholder, empty-array, or empty-object values.

The output includes:

- job identity, canonical URL, state, listing type, normalized title, ATS ID/provider, dates, salary, employment type, categories, levels, skills, benefits, and remote-work signals;
- full plain-text and HTML descriptions plus labeled detail sections;
- company IDs, profile/logo/site, description, size, employee range, industries, perks, diversity attributes, and public videos;
- structured locations, physical addresses, applicant locations, application URL when the source publishes a real external link;
- source payloads, response receipts, extraction method, provenance, data-quality flags, and field coverage.

The local validator checks required-field completion, detail verification, duplicate IDs/URLs, and recursively rejects null, blank, placeholder, empty-array, and empty-object values.

### Local verification

From this directory:

```text
npm install --ignore-scripts --no-audit --no-fund
npm test
npm run lint
apify validate-schema .actor/input_schema.json
apify run --purge --input-file INPUT.json
npm run validate
```

The reproducible fixtures INPUT.json, INPUT-single.json, and INPUT-multiple.json exercise all three modes. The local run writes the default dataset and the OUTPUT, OUTPUT\_SUMMARY, RUN\_HEALTH, and RUN\_DIAGNOSTICS records under storage.

# Actor input Schema

## `mode` (type: `string`):

Search discovers jobs; single fetches one public job; multiple fetches a bounded list.

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

The Muse keyword or role query used in search mode.

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

Alias for query.

## `keywords` (type: `string`):

Alias for query.

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

Optional location filter.

## `searchUrl` (type: `string`):

Optional official HTTPS The Muse search URL.

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

Alias for searchUrl.

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

Official The Muse search or public job URLs.

## `jobUrl` (type: `string`):

Official The Muse URL such as https://www.themuse.com/jobs/company/job-title.

## `jobUrls` (type: `array`):

Bounded official The Muse job URLs.

## `directUrls` (type: `array`):

Alias for jobUrls.

## `jobId` (type: `string`):

Optional numeric ID used with one matching jobUrl. The Muse has no ID-only public route.

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

Optional numeric IDs used with matching jobUrls.

## `maxItems` (type: `integer`):

Maximum complete records to emit.

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

Alias for maxItems.

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

Bounded public result pages inspected.

## `maxConcurrency` (type: `integer`):

Maximum concurrent public detail requests.

## `requestTimeoutSecs` (type: `integer`):

Bounded timeout for each public request.

## `retries` (type: `integer`):

Small retry budget for transient responses.

## `delayMillis` (type: `integer`):

Optional delay before each detail request.

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

Optional ordinary browser user-agent header; no fingerprint spoofing is applied.

## Actor input object example

```json
{
  "mode": "search",
  "query": "software engineer",
  "location": "",
  "maxItems": 3,
  "maxPages": 1,
  "maxConcurrency": 3,
  "requestTimeoutSecs": 20,
  "retries": 1,
  "delayMillis": 0
}
```

# Actor output Schema

## `dataset` (type: `string`):

Local dataset containing complete public The Muse job records.

## `outputSummary` (type: `string`):

Local OUTPUT\_SUMMARY key-value record.

## `runHealth` (type: `string`):

Local RUN\_HEALTH key-value record.

# 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("jobsapi/themuse-jobs-search-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("jobsapi/themuse-jobs-search-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 '{}' |
apify call jobsapi/themuse-jobs-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jobsapi/themuse-jobs-search-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/mhw2LxpkPAqFdEpzU/builds/pdzJHPL8CCu7vZfef/openapi.json
