# SimplyHired Jobs Scraper (`deriverge/simplyhired-jobs-scraper`) Actor

US job listings from SimplyHired with pay as numbers and its period, the company's employee rating, benefits and the full description. Search by keyword and city, state or ZIP code with a radius, or paste a SimplyHired search link.

- **URL**: https://apify.com/deriverge/simplyhired-jobs-scraper.md
- **Developed by:** [deriverge s.r.o.](https://apify.com/deriverge) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.25 / 1,000 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

## SimplyHired Jobs Scraper

SimplyHired Jobs Scraper exports US job listings from simplyhired.com, one row per job: title, company with its employee rating, city, state and coordinates, pay as numbers with its period, job type and schedule, benefits, qualifications, skills and the full description. To try it, click **Start** on the prefilled search for `accountant` in `Chicago, IL`, which returns 20 jobs. About a quarter of the listings show no pay. It costs $0.50 per 1,000 jobs on the Free plan ($0.25 on Business), and the $5 of monthly credit in Apify's Free plan covers about 10,000 jobs.

### What data does it return?

| Field | Description |
|---|---|
| `title`, `normalizedTitle` | Job title as posted and SimplyHired's standard title for it, e.g. `Staff Accountant - Mortgage` and `staff accountant`. |
| `company`, `companyRating` | Employer and its average employee rating from 1 to 5, such as `3.5`. The rating is empty for about a quarter of employers. |
| `location`, `city`, `state` | Place as SimplyHired shows it (`Lombard, IL`), the city and the two-letter state code. |
| `latitude`, `longitude` | Coordinates of the job location, for maps and distance filters. |
| `remote`, `workSettings` | `true` for remote jobs, and the work setting tags `Remote`, `Hybrid work` or `In person`. |
| `salaryText` | Pay as SimplyHired shows it: `$60,000 - $75,000 a year`, `$29.18 an hour` or `$0.60 per mile`. |
| `salaryMin`, `salaryMax`, `salaryPeriod` | The same pay as numbers, with `yearly`, `monthly`, `weekly` or `hourly`. |
| `jobTypes` | Job type and schedule tags, e.g. `Full-time`, `Part-time`, `Day shift` or `Monday to Friday`. |
| `benefits` | Benefits the listing names, e.g. `Health insurance`, `401(k) matching` or `Paid time off`. |
| `requirements` | Qualifications: experience level (`Mid-level`), degrees (`Bachelor's degree`) and licenses (`RN License`, `CDL A`). |
| `skills` | Skills SimplyHired extracts from the listing, from a few to more than 50 per job. |
| `snippet`, `description`, `descriptionHtml` | The summary from the search results, and the full description as text and HTML. |
| `postedAt` | When the job was published, in ISO 8601 UTC. |
| `easyApply`, `applyUrl` | `true` when you can apply with an Indeed profile, and the link to the application. |
| `sponsored` | `true` for paid placements in the search results. |
| `detailsIncluded` | `true` once the job page has been read. Rows with `false` carry the search result fields only. |

### How to scrape SimplyHired jobs

1. Type **Keywords** as you would in the SimplyHired search box: a job title, skill or company, one per line (`registered nurse`, `truck driver`, `data analyst`). Every keyword runs as a separate search.
2. In **Locations**, give a city with its state (`Chicago, IL`), a state (`Texas`), a ZIP code (`94105`) or `Remote`, and set **Radius (miles)** up to 100. An empty field searches the whole US.
3. Narrow the results with the filters SimplyHired applies: **Posted within** (24 hours, 7, 14 or 30 days), **Minimum salary ($ per year)**, **Job type** (full-time, part-time, contract, per diem, PRN, temp-to-hire and more) and **Sort by** newest first.
4. To reuse a search built on simplyhired.com, paste its address into **Search links from simplyhired.com (optional)**.
5. Leave **Include full details** on to open every job page for the description, city, state, coordinates, standard title, logo and apply link. The price stays the same, but each job page adds time.
6. Click **Start**. Finished rows collect in the **Output** tab, where you can download them as CSV, Excel or JSON.

For API input, `postedWithinDays` is text (`"7"`) and `jobType` a lowercase code:

```json
{
  "keywords": ["registered nurse", "nurse practitioner"],
  "locations": ["Texas"],
  "postedWithinDays": "7",
  "jobType": "full-time",
  "minSalary": 70000,
  "maxItems": 500
}
```

### Example output

One job from a run on 29 September 2026, with the two description fields shortened.

```json
{
  "key": "simplyhired:Pqt-KY_r1K5l8BybYINvL3NQCDF0LallBGxHamfsdroJDoF7_UGRbQ",
  "jobKey": "Pqt-KY_r1K5l8BybYINvL3NQCDF0LallBGxHamfsdroJDoF7_UGRbQ",
  "title": "Staff Accountant - Mortgage",
  "normalizedTitle": "staff accountant",
  "url": "https://www.simplyhired.com/job/Pqt-KY_r1K5l8BybYINvL3NQCDF0LallBGxHamfsdroJDoF7_UGRbQ",
  "company": "Mutual of Omaha Mortgage",
  "companyRating": 3.5,
  "companyLogo": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/128x128/83e937e4e3b073fddfec39bd13421fe2",
  "location": "Lombard, IL",
  "city": "Lombard",
  "state": "IL",
  "latitude": 41.844948,
  "longitude": -88.01544,
  "remote": false,
  "workSettings": [],
  "salaryText": "$60,000 - $75,000 a year",
  "salaryMin": 60000,
  "salaryMax": 75000,
  "salaryPeriod": "yearly",
  "jobTypes": [
    "Full-time"
  ],
  "benefits": [
    "Paid holidays",
    "Health insurance",
    "Dental insurance",
    "Flexible spending account",
    "Vision insurance",
    "401(k) matching",
    "Life insurance",
    "Paid sick time",
    "Pet insurance"
  ],
  "requirements": [
    "Mid-level",
    "Office",
    "Finance",
    "Bachelor's degree",
    "Continuous improvement",
    "GAAP",
    "Financial services",
    "Accounting",
    "Communication skills"
  ],
  "skills": [
    "Optimizing workflow processes",
    "Data integrity assurance",
    "Accounting systems",
    "Financial close processing",
    "Preparation of internal financial performance reports",
    "Financial data reconciliation",
    "Bachelor's degree in finance",
    "Spreadsheets",
    "Mortgage industry",
    "Data integrity and documentation",
    "Accounting and finance experience",
    "Productivity software",
    "Bachelor's degree in accounting"
  ],
  "snippet": "Bachelor's degree in Accounting, Finance, or related field. Assist in preparing components of the monthly profit and loss statements for assigned branches,…",
  "description": "Staff Accountant - Mortgage (Lombard, IL)\nQualifications\n\n- Bachelor's degree in Accounting, Finance, or related field\n\n- Proficient in accounting and financial management software and Microsoft Office products\n\n- Strong working knowledge of MS Excel\n\n- Excellent communication and interpersonal ...",
  "descriptionHtml": "<div><p><b>Staff Accountant &ndash; Mortgage (Lombard, IL)</b></p><p><b>\nQualifications</b></p><ul><li>\nBachelor's degree in Accounting, Finance, or related field</li><li>\nProficient in accounting and financial management software and Microsoft Office ...",
  "postedAt": "2026-08-20T05:00:00.000Z",
  "easyApply": true,
  "sponsored": true,
  "applyUrl": "https://www.simplyhired.com/out?r=ZUz0kHOyzfkASEX7e4GepfJwv_btwq76sop6ngH_hnTi_ZUZhQd3J7gIZuM5YC0jRjwz4c9wmRrIaeOFiUo4zEyTd3U0LYaEa3p4Zxbk1VY_T9b-vopgkVmA_B8NUNCyo9vow705cY7UeGknBPwZQk1_Fg7I2dSAwDbE5YkC",
  "detailsIncluded": true,
  "searchQuery": "\"accountant\" in Chicago, IL",
  "scrapedAt": "2026-09-29T06:30:33.087Z"
}
```

### How much does it cost to scrape SimplyHired?

| | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| 1,000 jobs | $0.50 | $0.40 | $0.325 | $0.25 |

You pay only for the events in the table. There is no start fee, and compute time and proxies are included.

Exporting 5,000 jobs with full details costs $2.50 on the Free plan and $1.25 on Business. Duplicates across searches, jobs removed by **Exclude keywords** and jobs you already received in new-only mode cost nothing.

### Limits

- SimplyHired lists US jobs only. Each results page holds 20 jobs and links to the next, and the actor follows those links until they end or **Maximum jobs** is reached. `registered nurse` in Texas matched about 12,900 jobs in September 2026.
- Relevance order mixes in old listings. In a September 2026 run of three Texas searches, half of the jobs were more than 30 days old and the oldest was posted in 2018. Use **Sort by** newest first or **Posted within** for fresh jobs.
- Paid placements are common: about two thirds of the jobs in that run had `sponsored: true`.
- Requests to SimplyHired are spaced half a second apart, which is why a run with full details returns about 90 jobs a minute.
- If SimplyHired answers with HTTP 403, 429 or a Cloudflare check, the run stops and keeps the jobs it has already returned.
- A run returns up to 1,000 jobs unless you raise **Maximum jobs** (the form starts at 20). With several searches, each gets an equal share of the limit.

### Pay on SimplyHired

Employers state pay in whatever unit they use. In September 2026 runs for Texas and Chicago, accountant jobs were mostly paid by the year, registered nurse jobs by the hour, and truck driver jobs by the year, the week (`$1,500 - $2,000 a week`), the hour or the mile. `salaryMin` and `salaryMax` keep the numbers as shown and `salaryPeriod` names the unit, so convert them before you compare jobs. Per-mile pay such as `$0.60 per mile` has no period. **Minimum salary ($ per year)** is SimplyHired's own filter and runs before the results reach the actor.

### FAQ

#### Is it legal to scrape SimplyHired?

SimplyHired shows these listings to anyone who searches, without an account. The actor collects the job, the employer and its public rating, and no data about recruiters or applicants. Descriptions belong to the employers, so check SimplyHired's terms before republishing them. You are responsible for how you use the data.

#### What is `normalizedTitle` for?

It groups the many ways employers write a title. In a Chicago run, `Development & Construction Accountant` and `Accountant` both carried `accountant`, so you can count jobs per role without cleaning the titles first.

#### How do I find remote jobs?

Put `Remote` in **Locations**. A row has `remote: true` when SimplyHired tags the job as remote or its location says so. `Hybrid work` stays in `workSettings` and leaves `remote` false.

#### How do I get new jobs every day?

Turn on **Return only jobs new since the last run**, add a **Watch name** such as `nurse-texas` and schedule the run daily; a saved task works without the name. Jobs you have received are remembered for 120 days. With **Sort by** newest first and **Posted within** set to 24 hours, each daily run reads only the newest listings.

### Related scrapers

- [Dice Jobs Scraper](https://apify.com/deriverge/dice-jobs-scraper)
- [Career Site Jobs Search](https://apify.com/deriverge/career-site-jobs-search)
- [Workday Jobs Scraper](https://apify.com/deriverge/workday-jobs-scraper)

### Support

This actor is built and maintained by deriverge s.r.o., a software company based in the Czech Republic. If a run fails or a field you need is missing, please open an issue in the **Issues** tab or write to us at info@deriverge.com. We respond in English and Czech. Runs can be scheduled in Apify Console or started from the **API** tab, which has examples for Python, JavaScript and cURL and works with Make, Zapier, n8n and the Apify MCP server. If the actor saves you time, a short review helps other people find it.

# Changelog

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

# Actor input Schema

## `keywords` (type: `array`):

What to search for, as in the SimplyHired search box: a job title, skill or company, for example "registered nurse", "truck driver" or "data analyst". Each keyword is its own search.

## `locations` (type: `array`):

US cities, states or ZIP codes, for example Chicago, IL, Texas or 94105, or Remote. Each location is its own search. Leave empty for the whole US.

## `radiusMiles` (type: `integer`):

How far around the location to search.

## `postedWithinDays` (type: `string`):

Only jobs posted within this period.

## `minSalary` (type: `integer`):

Only jobs paying at least this much a year, as the SimplyHired salary filter.

## `jobType` (type: `string`):

Only jobs of this type.

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

Order of the results, as on SimplyHired.

## `searchUrls` (type: `array`):

SimplyHired search addresses with your filters, for example https://www.simplyhired.com/search?q=nurse\&l=Texas. Each link is its own search.

## `excludeKeywords` (type: `array`):

Drop jobs whose title or company contains any of these.

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

Opens each job for the full description (text and HTML), city, state and coordinates, the normalised title, logo and the apply link. The price is the same.

## `newOnly` (type: `boolean`):

Keeps a snapshot per watch name (or per saved task) and returns only jobs that were not there before. Schedule it daily for a job alert.

## `watchName` (type: `string`):

Name of the snapshot used by the new-only mode, for example "nurse-texas". Runs from a saved task get one automatically.

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

Hard cap on returned jobs. When the cap is smaller than the results, every search gets an equal share.

## Actor input object example

```json
{
  "keywords": [
    "accountant"
  ],
  "locations": [
    "Chicago, IL"
  ],
  "postedWithinDays": "0",
  "jobType": "any",
  "sortBy": "relevance",
  "includeDetails": true,
  "newOnly": false,
  "maxItems": 20
}
```

# Actor output Schema

## `jobs` (type: `string`):

One row per job with company, location, salary, job type, benefits, qualifications and full description.

## `summary` (type: `string`):

Jobs matching and returned per search, details read, dropped rows and warnings.

# 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 = {
    "keywords": [
        "accountant"
    ],
    "locations": [
        "Chicago, IL"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("deriverge/simplyhired-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 = {
    "keywords": ["accountant"],
    "locations": ["Chicago, IL"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("deriverge/simplyhired-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 '{
  "keywords": [
    "accountant"
  ],
  "locations": [
    "Chicago, IL"
  ],
  "maxItems": 20
}' |
apify call deriverge/simplyhired-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,deriverge/simplyhired-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/hElc4jDN9frjdhQ5v/builds/AXYFx0cVStsbNm609/openapi.json
