# Job Postings Dataset: 320k+ Open Jobs, Updated Daily (`redomic/job-postings-dataset`) Actor

320,000+ open jobs from 10,000+ company career sites (Greenhouse, Lever, Ashby), updated daily with first-seen and closed dates. Bulk export or daily new/closed delta. $1.20 per 1,000 jobs.

- **URL**: https://apify.com/redomic/job-postings-dataset.md
- **Developed by:** [Redomic](https://apify.com/redomic) (community)
- **Categories:** Jobs
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.96 / 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

## Job Postings Dataset: 324,000 Open Jobs from Company Career Sites, Updated Daily

Every open job on more than 11,000 company career sites, collected fresh each day: 324,634 jobs on 15 November 2026, about 150,000 of them with a posted salary. The jobs come straight from employers' own Greenhouse, Lever and Ashby boards, so there are no reposts from job aggregators and no expired ads.

Export the whole table or a filtered slice to CSV, Excel or JSON. Or schedule it and get only the jobs that opened and closed since your last run.

### Who uses it

- **Sales and recruiting teams** looking for companies that are hiring right now. A company that opens five sales roles has budget.
- **Job boards and HR tech products** that need a daily feed of real jobs from employers.
- **Researchers and analysts** tracking hiring by company, role, country and pay, with the date each job opened and closed.

### What you get

US jobs with a posted salary that first appeared on 14 and 15 November 2026:

| Company | Job | Location | Pay (USD per year) | Posted |
|---|---|---|---|---|
| Ashby | Senior DevSecOps Engineer | Remote, US | 178,000 to 250,000 | 13 Nov |
| Fieldguide | Principal/Staff Product Manager, Risk Advisory | San Francisco or remote | 225,000 to 315,000 | 13 Nov |
| Crusoe | Senior Software Engineer, Storage | San Francisco, CA | 170,000 to 190,000 | 13 Nov |
| Airwallex | Senior Manager, Obligations Management | Dallas | 128,000 to 210,000 | 12 Nov |
| Coder | Senior Account Executive (US West) | United States | 123,000 to 167,000 | 13 Nov |
| Finni Health | Board Certified Behavior Analyst | Remote, US | 80,000 to 85,000 | 13 Nov |

Each row has about 25 columns: company, title, department, location, country code, remote/hybrid/onsite, employment type, salary range with currency and period, job function, seniority and the apply link. You also get two dates nobody else gives you: `firstSeen`, the day we first saw the job, and `closedOn`, the day it came down.

### Three ways to use it

| Mode | What you get | Good for |
|---|---|---|
| `snapshot` (default) | Every open job that matches your filters | One-off exports, research |
| `new` | Jobs first seen in the last N days (`newWithinDays`) | A daily "who started hiring" list |
| `changes` | Jobs that opened or closed since your last run | Scheduled feeds, CRM and Sheets sync |

### Price

$1.20 per 1,000 jobs. There's no start fee. 100 jobs cost $0.12. In `changes` mode a day with nothing new costs nothing.

For scale: the default filters (jobs posted in the last 30 days, evergreen ads left out) matched 93,976 jobs on 15 November, so the full export costs about $113. Set `maxItems` to cap a run.

### How to run it

Engineering jobs in Germany:

```json
{
  "countries": ["Germany"],
  "roleFamilies": ["Engineering"],
  "maxItems": 500
}
```

US jobs paying $150,000 to $250,000:

```json
{
  "countries": ["United States"],
  "minSalary": 150000,
  "maxSalary": 250000,
  "maxItems": 500
}
```

A daily feed into Google Sheets. Save this as a task, schedule it daily and connect the Google Sheets integration. Each run appends only the jobs it hasn't sent you before, always in the same column order:

```json
{
  "countries": ["United Kingdom"],
  "roleFamilies": ["Sales"],
  "outputFormat": "sheets_flat",
  "cursor": "auto",
  "maxItems": 200
}
```

Ready-made searches, each with sample results on its own page:

- [New US job postings today](https://apify.com/redomic/job-postings-dataset/examples/new-us-job-postings-today)
- [Remote engineering jobs in Germany](https://apify.com/redomic/job-postings-dataset/examples/remote-engineering-job-postings-germany)
- [UK sales jobs](https://apify.com/redomic/job-postings-dataset/examples/uk-sales-job-postings)
- [Jobs opened and closed at Spotify](https://apify.com/redomic/job-postings-dataset/examples/job-changes-at-a-company)

### Input

| Field | Default | What it does |
|---|---|---|
| `mode` | `snapshot` | `snapshot`, `new` or `changes` (see above). |
| `newWithinDays` | `1` | For `new`: how many days back to look. |
| `search` | none | Keywords that must all appear in the title, description, company or department. |
| `titleContains`, `excludeTitleKeywords` | none | Keep jobs that mention any of these words, then drop jobs that mention any of those. |
| `companies`, `excludeCompanies` | all | `companies` limits to named companies or board tokens. `excludeCompanies` drops jobs from named companies or board tokens before that include, so excluded jobs are never returned. |
| `ats` | all | `greenhouse`, `lever` or `ashby`. |
| `countries` | all | Country names or codes: `Germany`, `US`. |
| `locations` | all | Any part of the location: `Berlin`, `EMEA`. |
| `roleFamilies` | all | For example `Engineering`, `Sales`, `Data/Analytics`, `Product Management`. |
| `seniority` | all | `Intern`, `Junior`, `Mid`, `Senior`, `Lead/Principal`. |
| `remoteOnly` | `false` | Remote jobs only. |
| `hasSalary` | `false` | Only jobs with a posted pay range. |
| `minSalary`, `maxSalary` | none | Keep jobs whose posted range overlaps this band. |
| `postedWithinDays` | `30` | Jobs posted in the last N days. `0` means any date. |
| `includeEvergreen` | `false` | Include talent-pool ads and ads posted 180 or more days ago. |
| `includeAggregators` | `false` | Include staffing boards that repost other companies' jobs. |
| `newlyHiringCompanies` | `false` | One row per company that opened at least one role in the last `newlyHiringWithinDays` (7 by default). |
| `output` | `rows` | `events` returns a compact feed of new, changed and closed jobs. |
| `outputFormat` | `rows` | `sheets_flat` keeps one fixed column order for spreadsheets. |
| `cursor` | none | `auto` returns only jobs this exact input hasn't returned before. |
| `maxItems` | `100` | The most jobs to return. `0` returns every match. |

### Output fields

`changeType` (`open`, `new` or `closed`), `id`, `company`, `ats`, `board`, `title`, `department`, `location`, `countryCode`, `workplaceType`, `employmentType`, `postedAt`, `url`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `roleFamily`, `seniority`, `firstSeen`, `trackedSince`, `generalApplication`, `evergreen`, `closedOn`, `daysOpen` (closed jobs), `dataAsOf`.

Every column is flat, so the file opens cleanly in Excel or Google Sheets.

### FAQ

**How fresh is it?**
We collect every board once a day, around 23:00 UTC. `dataAsOf` on each row gives the date.

**Which sites does it cover?**
Company career sites hosted on Greenhouse (5,838 companies), Ashby (3,501) and Lever (1,903). It doesn't include LinkedIn, Indeed or Workday.

**How far back does the closed-job history go?**
We started tracking on 31 October 2026, so `closedOn` and `daysOpen` cover the days since then, and the history grows by a day every day.

**Why do some jobs have no salary?**
The employer didn't post one. We never estimate missing values. Set `hasSalary: true` to get only jobs with a range.

**Where do `roleFamily` and `seniority` come from?**
We assign them from the job title and department. The employer doesn't provide them, so treat them as a good guide rather than an official label.

**How is this different from ATS Jobs Search?**
Both read the same data. [ATS Jobs Search](https://apify.com/redomic/ats-jobs-search) is built for keyword searches and single companies. This Actor is built for bulk exports and daily change feeds.

**I need a filter that isn't here.**
Open an issue on the Issues tab and tell us what you're trying to pull.

### Ready-made examples

Each one opens a saved run you can copy and start with one click.

- [New US job postings today](https://apify.com/redomic/job-postings-dataset/examples/new-us-job-postings-today): Every job first seen in the last 24 hours at US employers, from 11,000+ company career boards on Greenhouse, Lever and Ashby
- [Remote engineering job postings in Germany](https://apify.com/redomic/job-postings-dataset/examples/remote-engineering-job-postings-germany)
- [UK sales job postings](https://apify.com/redomic/job-postings-dataset/examples/uk-sales-job-postings): Sales job postings in London
- [Job postings opened and closed at Spotify](https://apify.com/redomic/job-postings-dataset/examples/job-changes-at-a-company): Which jobs a company opened and closed since the last snapshot, here Spotify

### Use it from AI agents (MCP) and Python

**AI agents.** Add this Actor as a tool in Claude, Cursor, VS Code or any MCP client through the Apify MCP server. The agent reads the input schema, so a plain request is enough.

```json
{
  "mcpServers": {
    "job-postings-dataset": {
      "url": "https://mcp.apify.com?tools=redomic/job-postings-dataset",
      "headers": {
        "Authorization": "Bearer <YOUR_APIFY_TOKEN>"
      }
    }
  }
}
```

**Python.** `pip install apify-client`, then:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("redomic/job-postings-dataset").call(run_input={"mode": "snapshot", "maxItems": 5})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

### More from us

- [Allabolag Scraper - Swedish Company Data](https://apify.com/redomic/allabolag-company-scraper): Scrape allabolag.se for Swedish company financials, industry, status and board role titles by search, org number or URL
- [Ashby Jobs Scraper with Salaries](https://apify.com/redomic/ashby-jobs-monitor): Ashby jobs scraper for any startup careers board (OpenAI, Ramp, Notion and thousands more), with salary ranges as numbers: min, max, currency, period, plus equity and bonus flags
- [ATS Jobs Search: Greenhouse, Lever & Ashby Jobs API](https://apify.com/redomic/ats-jobs-search): Search 300,000+ open jobs from 11,000+ companies on Greenhouse, Lever and Ashby in one run
- [Blocket Scraper: Car Monitor](https://apify.com/redomic/blocket-se-scraper): Blocket scraper: each run returns up to 2,500 Blocket Bil and Torget listings as flat rows with price, make, model, year, mileage, VIN, inspections and seller
- [Closed Jobs Tracker: Filled Roles & Time-to-Fill](https://apify.com/redomic/closed-jobs-tracker): Search closed jobs from 11,000+ companies with closedOn, daysOpen and time-to-fill signals
- [Google Jobs Scraper - Job Postings API](https://apify.com/redomic/google-jobs): Google Jobs and job postings scraper: get job title, company, location, posted date, salary, full description and every apply link for any search
- [Google Trends API: Trending Now & Interest Over Time](https://apify.com/redomic/google-trends): Trending-now searches and new-trends alerts/monitoring per country with the news behind them, plus interest over time, interest by region, and related and rising queries for any keyword
- [GovDeals Scraper](https://apify.com/redomic/govdeals-scraper): Search and monitor GovDeals government surplus auctions
- [Greenhouse Jobs Monitor & Scraper](https://apify.com/redomic/greenhouse-jobs-monitor): Monitor Greenhouse jobs from any company careers board (Airbnb, Stripe, Discord and thousands more)
- [Lever Jobs Scraper with Salaries](https://apify.com/redomic/lever-jobs-monitor): Lever jobs scraper for any company's careers page (Palantir, Spotify, Zoox, Shield AI and thousands more): flat rows with title, team, location, workplace, commitment, apply link, salary as numbers and the full description merged
- [Marktplaats.nl Scraper](https://apify.com/redomic/marktplaats-nl): Scrape Marktplaats.nl listings into clean rows: title, price in EUR, condition, seller, location, images
- [Otodom Scraper: Poland Property Listings & Price Monitor](https://apify.com/redomic/otodom-scraper): Scrape Otodom.pl property listings in Poland
- [Otomoto.pl Scraper](https://apify.com/redomic/otomoto-scraper): Scrape Otomoto.pl Polish car listings: one run returns used-car rows with price, make, model, year, mileage, fuel, gearbox, seller and URL
- [Personio Jobs Scraper](https://apify.com/redomic/personio-jobs): Scrape open jobs from Personio company career pages (jobs.personio.de/.com XML feeds)
- [Salary Data API: Pay Ranges by Job Title & Level](https://apify.com/redomic/salary-data): Get salary benchmarks (p10-p90, annualised, with n) and pay ranges from 150,000+ employer-posted jobs across 11,000+ companies, updated daily
- [SIRET Company Scraper](https://apify.com/redomic/siret-company-scraper): Search French companies by name, SIREN or SIRET
- [SUUMO Scraper - Japan Property Listings](https://apify.com/redomic/suumo-scraper): Scrape SUUMO Japan property listings from search URLs for rentals and sales
- [Talabat Scraper — Menus, Prices & Delivery Fees](https://apify.com/redomic/talabat-scraper): Talabat menus, prices and delivery fees as flat rows in 8 MENA markets
- [Workday Jobs Scraper](https://apify.com/redomic/workday-jobs): Search and monitor public Workday (myworkdayjobs.com) job postings

# Changelog

This Actor's version history is a separate document: https://apify.com/redomic/job-postings-dataset/changelog.md

# Actor input Schema

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

snapshot = every open job matching filters. new = jobs first seen within newWithinDays. changes = stateful monitor: returns jobs new and jobs closed since the previous run with the same filters (first run saves a baseline snapshot).

## `output` (type: `string`):

"rows" returns job rows (default). "events" returns a daily delta of new, changed and closed jobs with asOf, source board and salary/location diffs; an unchanged run ends SUCCEEDED with 0 events.

## `newWithinDays` (type: `integer`):

For mode 'new': jobs first seen in the last N days. Default 1. Ignored in other modes.

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

Limit to these companies (board token or company name). Empty = all.

## `excludeCompanies` (type: `array`):

Drop jobs whose company name or board token matches any of these values (case-insensitive). Applied before companies include; excluded rows are never returned or billed. Empty = none.

## `ats` (type: `array`):

Limit to Greenhouse, Lever or Ashby. Empty = all three.

## `countries` (type: `array`):

Keep jobs whose location mentions any of these countries (e.g. Germany, United States, UK). Matched as words in the location text.

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

Keep jobs whose location contains any of these (city/region text, e.g. Berlin, EMEA).

## `roleFamilies` (type: `array`):

Job function (e.g. Engineering, Sales, Data/Analytics). 'Engineering' covers engineering families. Empty = all.

## `seniority` (type: `array`):

e.g. Junior, Mid, Senior, Lead/Principal, Intern. Empty = all.

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

Only remote jobs.

## `hasSalary` (type: `boolean`):

Only jobs that publish a pay range.

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

Inclusive lower salary bound. A job matches when its posted range overlaps this amount (its salaryMax, or salaryMin if no max, is >= this value). Jobs without any salary are excluded. 0 = no minimum.

## `maxSalary` (type: `integer`):

Inclusive upper salary bound. A job matches when its posted range overlaps this amount (its salaryMin, or salaryMax if no min, is <= this value). Jobs without any salary are excluded. 0 = no maximum.

## `postedWithinDays` (type: `integer`):

Only jobs posted in the last N days. 0 = any date. Defaults to 30 for a fresh-first export.

## `includeEvergreen` (type: `boolean`):

Include evergreen/talent-pool postings (generalApplication=true or posted 180+ days ago). Off by default; default export excludes them and reports evergreen counts.

## `includeAggregators` (type: `boolean`):

Aggregator/staffing boards re-post other companies' jobs and are left out by default. Turn on to include them.

## `newlyHiringCompanies` (type: `boolean`):

When enabled, return one row per company with at least one role first seen in the last N days (default 7, configurable with 'Newly hiring within (days)') instead of job rows. Each company row includes open role count, top role titles, locations, salary coverage %, dataAsOf and sampleSize plus newRoleEvidence with firstSeen for every included role.

## `newlyHiringWithinDays` (type: `integer`):

Window for newly hiring companies: include roles first seen in the last N days. 0 uses 7 days when newly hiring mode is enabled.

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

Maximum job rows returned (and billed). 0 = no cap (returns every matching job; can be large).

## `outputFormat` (type: `string`):

sheets_flat projects every job row onto the same fixed flat column order with no nested JSON, ready to append to Google Sheets or Excel. Default rows keeps the full field set.

## `cursor` (type: `string`):

auto = append-only delta for scheduled runs: the run returns only job rows it has not delivered before for this exact input hash, and saves the delivered keys in the monitor key-value store. The first run returns the first maxItems matching rows; later runs return only new rows; an unchanged day returns 0 job rows, $0 and SUCCEEDED. Works with any mode; in changes mode it also appends jobs closed since the last run. Leave empty for a normal full run.

## `search` (type: `string`):

Keyword search in the job title, description, company and department. All words must appear (case-insensitive). Leave empty for no text filter.

## `titleContains` (type: `array`):

Keep jobs whose title or description contains at least one of these keywords (case-insensitive). Empty = no include filter.

## `excludeTitleKeywords` (type: `array`):

Drop jobs whose title or description contains any of these keywords (case-insensitive). Applied after titleContains.

## Actor input object example

```json
{
  "mode": "snapshot",
  "output": "rows",
  "newWithinDays": 1,
  "companies": [],
  "excludeCompanies": [],
  "ats": [],
  "countries": [],
  "locations": [],
  "roleFamilies": [],
  "seniority": [],
  "remoteOnly": false,
  "hasSalary": false,
  "minSalary": 0,
  "maxSalary": 0,
  "postedWithinDays": 30,
  "includeEvergreen": false,
  "includeAggregators": false,
  "newlyHiringCompanies": false,
  "newlyHiringWithinDays": 7,
  "maxItems": 100,
  "outputFormat": "rows",
  "cursor": "",
  "search": "",
  "titleContains": [],
  "excludeTitleKeywords": []
}
```

# Actor output Schema

## `results` (type: `string`):

All result rows from the default dataset.

# 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("redomic/job-postings-dataset").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("redomic/job-postings-dataset").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 redomic/job-postings-dataset --silent --output-dataset

```

## MCP server setup

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

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/gAxx7rKcBaVxjLou4/builds/7gy2aqaCcjKvrZtnb/openapi.json
