# Job Postings API: 1M+ Fresh Jobs (Greenhouse, Lever, Workday) (`cleanrowdata/fresh-jobs-index`) Actor

Search 1.17M open jobs from 17,000+ company career sites on Greenhouse, Lever, Ashby, Workday, Workable, SmartRecruiters, Recruitee, Personio & Rippling. Refreshed hourly (Workday daily). Jobs posted in the last hour, 24h or 7d, plus closed jobs. Results in seconds. A LinkedIn jobs alternative.

- **URL**: https://apify.com/cleanrowdata/fresh-jobs-index.md
- **Developed by:** [Clean Row Data](https://apify.com/cleanrowdata) (community)
- **Categories:** Jobs, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 job results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 API: 1,170,000+ fresh jobs from Greenhouse, Lever, Ashby, Workday & 5 more ATS

**Search 1,170,000+ open jobs from 17,000+ companies' own career sites, refreshed hourly (Workday daily), and get results in seconds.** This Actor is a **jobs API on top of a ready-made index**: we continuously collect job postings straight from the applicant tracking systems (ATS) that companies use for their careers pages: **Greenhouse, Lever, Ashby, Workday, Workable, SmartRecruiters, Recruitee, Personio and Rippling**. You ask for, say, *"software engineer jobs in the US or remote, posted in the last 7 days"* and get clean, deduplicated rows with the direct apply link. No scraping happens during your run, so a typical run finishes in **5-15 seconds** and costs only for the jobs it returns.

Looking for a **LinkedIn jobs or Indeed scraper alternative** without logins, proxies, reposts or rate limits? This is it: every job comes from the employer's own ATS board.

### Why people use it

- ⚡ **Fast and fresh**: Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Personio and Rippling are re-checked **every hour**; Workday once a day. Filter to jobs posted in the **last hour, 24 hours, 7 days or 30 days**.
- 🏢 **Straight from the source**: 20,000+ verified company job boards. Every row links to the original job page and apply page.
- 🧹 **One clean schema for 9 ATS platforms**: title, company, department, team, locations, country, remote flag, workplace type, employment type, posted date, first/last seen, salary (when published), job URL, apply URL.
- 🎯 **Filters that matter**: job title (with wildcards), keywords, exclusions, location, remote only, workplace type, ATS, company or domain, employment type, "salary published".
- ♻️ **Deduplicated**: one row per company + title + location by default.
- 🧹 **No aggregator spam**: reposting marketplaces such as Jobgether are skipped by default, and Workday tenant codes are shown as real company names (e.g. `ghr` → Bank of America, `globalhr` → RTX), so you can also filter by the name you know.
- 🗑️ **Expired jobs**: get the jobs that **closed in the last 7 days** to clean up your own job board or CRM.
- 💸 **$2.50 per 1,000 jobs**, pay only for rows returned. Set **Max results** and the run stops exactly there.

### Quick start (first run in under a minute)

1. Click **Start**. The prefilled input returns **50 software engineer jobs in the US or remote, posted in the last 7 days** (about $0.13).
2. Change **Job title contains** to your role (`data engineer`, `account executive`, `nurse`, `product designer`...), and **Location contains** to your market.
3. Export to **CSV, Excel, JSON or Google Sheets**, or call it from the API, Make, Zapier, n8n or an AI agent.

### Use cases and ready-to-paste inputs

#### 1. Recruiting and staffing agencies: new roles to fill, every week

Find companies that just opened roles you can fill, with the direct link to each job. Switch to "Last 24 hours" for a daily run.

```json
{
  "timeRange": "7d",
  "titleSearch": ["data engineer", "analytics engineer"],
  "locationSearch": ["United States", "Remote"],
  "titleExclusionSearch": ["intern"],
  "limit": 500
}
```

#### 2. Sales teams: hiring signals for outbound

A company hiring its first RevOps person, or five security engineers at once, is a buying signal. Pull new roles by function and push them into your CRM or Clay.

```json
{
  "timeRange": "7d",
  "titleSearch": ["revops", "revenue operations", "sales operations"],
  "locationSearch": ["United States"],
  "dedupe": true,
  "limit": 1000
}
```

Tip: match rows to accounts in your CRM on `company` (and `company_domain` when the ATS provides it); `board` + `ats` identify the careers page.

#### 3. Job boards and newsletters: fill a niche board automatically

Fill the board once with "Last 7 days" (below), then schedule the Actor **hourly with "Last hour"** (or daily with "Last 24 hours") to get only new jobs each time. Run it once a day with **Job status = Recently closed** to expire jobs that are gone.

```json
{
  "timeRange": "7d",
  "titleSearch": ["designer*"],
  "remoteOnly": true,
  "limit": 200
}
```

#### 4. Labor-market and compensation research

Track hiring by company, function, location or ATS over time; pull jobs with published salary ranges.

```json
{
  "timeRange": "30d",
  "titleSearch": ["machine learning", "ml engineer", "ai engineer", "data scientist"],
  "hasSalary": true,
  "limit": 5000
}
```

#### 5. Watch specific companies

```json
{
  "timeRange": "all",
  "companies": ["stripe", "openai.com", "databricks"],
  "limit": 1000
}
```

### Sample output

Real rows from the default input (software engineer, US or remote, last 7 days), October 2026 (the full 50-row example dataset: [CSV](https://api.apify.com/v2/datasets/sfWbeMoN8LHy61OpQ/items?format=csv) · [JSON](https://api.apify.com/v2/datasets/sfWbeMoN8LHy61OpQ/items?format=json) · [Excel](https://api.apify.com/v2/datasets/sfWbeMoN8LHy61OpQ/items?format=xlsx)):

| Company | Title | Location | Remote | ATS | Posted | Salary |
|---|---|---|---|---|---|---|
| Reddit | Software Engineer, Agent Optimization & Evaluation | Remote - United States | yes | Greenhouse | 2026-10-19 | |
| Perplexity | Member of Technical Staff (Software Engineer, Enterprise Agent Evals & Efficiency) | San Francisco | no | Ashby | 2026-10-19 | $220,000-$405,000 |
| Clear Street | Senior / Staff Software Engineer, Mobile | Remote | yes | Greenhouse | 2026-10-18 | |
| Abnormal | Software Engineer 1 - Cloud Infrastructure | Remote - USA | yes | Greenhouse | 2026-10-17 | |
| Airbyte | Senior Software Engineer, Platform Fullstack | San Francisco | yes | Ashby | 2026-10-17 | $196,000-$235,000 |
| TeamSnap | Staff Software Engineer (Android) | Remote | yes | Lever | 2026-10-17 | |
| BILL | Software Engineer II - Growth | United States | no | Greenhouse | 2026-10-17 | |
| Applied | Full-Stack Software Engineer, People Intelligence | Sunnyvale | no | Ashby | 2026-10-17 | $138,000-$208,000 |

Each row as JSON (the Airbyte row above):

```json
{
  "id": "34bd86369b0f7f7c",
  "title": "Senior Software Engineer, Platform Fullstack",
  "company": "Airbyte",
  "company_domain": null,
  "ats": "ashby",
  "board": "airbyte",
  "job_id": "735d5deb-ba6e-49b2-88ba-5ebdf8d315a0",
  "requisition_id": null,
  "department": "Engineering",
  "team": "Engineering",
  "location": "San Francisco",
  "locations": [
    "San Francisco"
  ],
  "country": "United States",
  "remote": true,
  "workplace_type": "hybrid",
  "employment_type": "FULL_TIME",
  "posted_at": "2026-10-17T02:12:12Z",
  "first_seen": "2026-10-18T02:22:18Z",
  "last_seen": "2026-10-19T01:50:06Z",
  "status": "active",
  "closed_at": null,
  "salary_min": 196000,
  "salary_max": 235000,
  "salary_currency": "USD",
  "salary_period": "YEAR",
  "salary_text": "$196K - $235K",
  "job_url": "https://jobs.ashbyhq.com/airbyte/735d5deb-ba6e-49b2-88ba-5ebdf8d315a0",
  "apply_url": "https://jobs.ashbyhq.com/airbyte/735d5deb-ba6e-49b2-88ba-5ebdf8d315a0/application"
}
```

Each run also writes a **Run summary** (`RUN_SUMMARY`): how many jobs matched, how many duplicates were removed and **when the index was last refreshed**.

### How it compares

| | **Fresh Jobs API (this Actor)** | LinkedIn / Indeed job scrapers | Single-ATS scrapers (one per Greenhouse, Lever...) | [Careers Page Jobs Scraper](https://apify.com/cleanrowdata/careers-jobs-feed) (our live scraper) |
|---|---|---|---|---|
| Source | Employers' own ATS boards | Job board listings (reposts, promoted jobs) | One ATS | Employers' own ATS boards |
| Coverage | 17,000+ companies, 9 ATS, searchable all at once | Whatever the board's search returns | Only companies you list, one ATS | Companies you list, 6 ATS |
| Speed | Seconds (pre-built index) | Minutes, proxies, blocks | Minutes | Seconds to minutes per company |
| Find companies you don't know yet | ✅ search by title/location across all companies | ✅ | ❌ | ❌ |
| Full job descriptions | ❌ not yet | ✅ | usually ✅ | ✅ |
| New / closed jobs | ✅ time windows + closed in last 7 days | partial | rarely | ✅ per-company new/closed feed |
| Price | $2.50 / 1,000 jobs | varies | varies | $2 / 1,000 jobs + $0.002 per company |

**Use this Actor** to discover jobs across thousands of companies by title and location. **Use the [Careers Page Jobs Scraper](https://apify.com/cleanrowdata/careers-jobs-feed)** when you already know the companies and need full descriptions.

### Pricing (pay per event)

| Event | Price |
|---|---|
| Job returned (row in the dataset) | **$0.0025** (= **$2.50 per 1,000 jobs**) |
| Actor start | $0.00005 (Apify's standard start event) |

Examples: the default input (50 jobs) = **$0.13**. 100 new jobs a day for a month = 3,000 jobs = **$7.50/month**. A one-off pull of 5,000 jobs = **$12.50**. Platform usage is tiny because no scraping happens during your run.

### Coverage and freshness

| ATS | Verified boards | Open jobs |
|---|---|---|
| Workday | 2,213 | 725,218 |
| Greenhouse | 6,556 | 199,487 |
| Lever | 2,152 | 73,927 |
| Ashby | 3,692 | 59,842 |
| Workable | 2,914 | 59,778 |
| SmartRecruiters | 31 | 21,141 |
| Recruitee | 1,032 | 17,847 |
| Personio | 847 | 9,370 |
| Rippling | 844 | 8,372 |
| **Total** | **20,281** | **1,174,982** |

- Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Personio and Rippling are refreshed **every 1 hour**; Workday is refreshed **once a day**. A new job reaches the index at the next refresh, and `first_seen` records when we first saw it. The `RUN_SUMMARY` record of every run shows the exact time of the last refresh.
- When the ATS publishes an exact posting time (Greenhouse, Lever, Ashby, SmartRecruiters and others), **Posted within** uses it.
- When a company is first added to the index, its existing jobs are not counted as "new": for those, time filters use the date the company posted them.
- Closed jobs stay in the index for 7 days with `status: "closed"` and `closed_at`.
- Company boards are discovered from public sources (the Common Crawl URL index, public ATS directories, startup directories and public job lists) and each one is verified against the ATS's public job-board API. New boards are added over time. Missing a company? Use the [Careers Page Jobs Scraper](https://apify.com/cleanrowdata/careers-jobs-feed) with its careers URL, or tell us in the Issues tab.

### FAQ

**How fresh is the data?**
All ATS platforms except Workday are re-checked every hour; Workday once a day. Each run's `RUN_SUMMARY` shows when the index was last refreshed, so you never have to guess.

**How do I get only new jobs since my last run?**
Schedule the Actor with a matching window: hourly + "Last hour", or daily + "Last 24 hours". Dedupe on `id` in your own system to be safe.

**How do I remove jobs that were filled or taken down?**
Run with **Job status = Recently closed jobs** and a time window; you get every job that disappeared from its company's board, with `closed_at`.

**Is this a LinkedIn jobs alternative?**
For most hiring at tech, startup and mid-to-large companies, yes: those companies publish their jobs on their own ATS first, and the apply link goes straight to the employer. It does not include jobs that exist only on LinkedIn or Indeed, or companies on ATS platforms we don't cover yet (for example iCIMS, Taleo or SuccessFactors).

**Do you have job descriptions?**
Not yet. Keywords match the title, department, team and company name. For full descriptions of specific companies, use the [Careers Page Jobs Scraper](https://apify.com/cleanrowdata/careers-jobs-feed).

**Are there agency or reposted jobs?**
Rows come from companies' own ATS boards, not from job boards. A few recruiting firms and job aggregators also run ATS boards. The best-known ones (Jobgether, AO Garcia Agency, Bjakcareer, Pavago...) are skipped by default (**Exclude job aggregators**); drop any others with **Exclude companies**.

**Is it legal?**
The index only contains job postings that companies publish through their ATS's public job-board endpoints, the same data their careers pages show to everyone. No logins, no personal data about applicants or recruiters.

**Can I use it from code, Make, Zapier, n8n, Clay or an AI agent?**
Yes. Every Apify Actor has an API, client libraries for JavaScript and Python, integrations, and works through the Apify MCP server.

**How many jobs can I get per run?**
Up to 5,000. For more, split by time window, title, location or ATS.

### Limitations

- No full job descriptions yet (see above).
- Up to 5,000 jobs per run.
- Location matching is text matching on what the company wrote (`US`, `USA`, `United States` and city names vary), so add the variants you care about. `Remote` also matches jobs the ATS flags as remote.
- Salary is only present when the ATS publishes it as structured data.
- Rippling boards don't publish a posting date, so their jobs that were already open when we added the company only show up with **Posted within = Any time**; jobs they post later are dated by when we first see them.

### Related Actors

- [Careers Page Jobs Scraper: Greenhouse, Lever, Workday, Ashby](https://apify.com/cleanrowdata/careers-jobs-feed): live scrape of the companies you choose, with full descriptions, salary extraction and a daily new/closed jobs feed.
- [Hiring Signals API: Companies Hiring Now](https://apify.com/cleanrowdata/hiring-signals-api): one row per hiring company with new jobs by function and seniority, for sales and recruiting lead lists.
- [Remote Jobs API: Remote Jobs by Region](https://apify.com/cleanrowdata/remote-jobs-api): remote-only jobs filtered by where you can work from (US, Canada, Europe, LATAM, anywhere), with function, seniority and salary filters.

Data attribution: part of the board discovery uses the LastRound AI ATS Company Directory (CC BY 4.0).

Questions or a missing feature? Open an issue on the Actor's **Issues** tab.

# Changelog

This Actor's version history is a separate document: https://apify.com/cleanrowdata/fresh-jobs-index/changelog.md

# Actor input Schema

## `timeRange` (type: `string`):

Only jobs that appeared within this window. For jobs found when a company was first added to the index, the date the company posted them is used instead.

## `titleSearch` (type: `array`):

Match any of these words or phrases in the job title (whole words, case-insensitive). Add \* for a prefix: <code>engineer\*</code> matches engineer and engineering.

## `titleExclusionSearch` (type: `array`):

Skip jobs whose title contains any of these words, e.g. senior, intern, sales.

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

Match any of these words in the title, department, team or company name.

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

Skip jobs whose title, department, team or company contains any of these words.

## `locationSearch` (type: `array`):

Match any of these in the job location, e.g. <code>New York</code>, <code>London</code>, <code>United States</code>, <code>US</code>. Use <code>remote</code> to include remote jobs.

## `locationExclusionSearch` (type: `array`):

Skip jobs whose location contains any of these.

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

Only jobs marked remote by the ATS or with 'remote' in the location.

## `workplaceTypes` (type: `array`):

Only jobs with one of these workplace types (when the ATS states it).

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

Only jobs from these applicant tracking systems. Leave empty for all.

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

Only jobs from companies whose name, board id or domain contains any of these (e.g. <code>stripe</code>, <code>openai.com</code>).

## `companyExclusion` (type: `array`):

Skip these companies (name, board id or domain contains).

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

Only these employment types (when the ATS states them).

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

Only jobs where the ATS publishes a salary range.

## `jobStatus` (type: `string`):

Closed = jobs removed from the company's board in the last 7 days; with a time range, filtered by when they closed. Use it to expire jobs in your own database.

## `dedupe` (type: `boolean`):

Return one row per company + title + location (companies often list the same role on several boards).

## `excludeAggregators` (type: `boolean`):

Skip reposting marketplaces and staffing aggregators (Jobgether, AO Garcia Agency, Bjakcareer, Pavago...) that copy other companies' jobs onto their own ATS boards. On by default, so every row is a direct employer posting.

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

Newest in index first (default) or by the date the company says it posted the job.

## `limit` (type: `integer`):

Maximum jobs to return (you pay per job returned). Up to 5,000 per run.

## Actor input object example

```json
{
  "timeRange": "7d",
  "titleSearch": [
    "software engineer"
  ],
  "locationSearch": [
    "United States",
    "Remote"
  ],
  "remoteOnly": false,
  "hasSalary": false,
  "jobStatus": "active",
  "dedupe": true,
  "excludeAggregators": true,
  "sortBy": "newest",
  "limit": 50
}
```

# Actor output Schema

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

Matching job postings, newest first.

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

Counts (matched, returned, duplicates removed) and when the index was last refreshed.

# 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 = {
    "timeRange": "7d",
    "titleSearch": [
        "software engineer"
    ],
    "locationSearch": [
        "United States",
        "Remote"
    ],
    "limit": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("cleanrowdata/fresh-jobs-index").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 = {
    "timeRange": "7d",
    "titleSearch": ["software engineer"],
    "locationSearch": [
        "United States",
        "Remote",
    ],
    "limit": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("cleanrowdata/fresh-jobs-index").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 '{
  "timeRange": "7d",
  "titleSearch": [
    "software engineer"
  ],
  "locationSearch": [
    "United States",
    "Remote"
  ],
  "limit": 50
}' |
apify call cleanrowdata/fresh-jobs-index --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cleanrowdata/fresh-jobs-index"
        }
    }
}
```

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/qHOWjRO8ZpKycbNbA/builds/fFM3h4Hnsl98Ss4bQ/openapi.json
