# Greenhouse, Lever & Ashby Jobs Scraper API | $1/1K Jobs (`moneyreset/ats-jobs-scraper`) Actor

Cheapest ATS jobs API: $1 per 1,000 jobs. Scrape every open job from any company on Greenhouse, Lever or Ashby (Stripe, OpenAI, Airbnb, Notion, Ramp). Salary ranges, remote flag, department, apply link, full description. Only-new-jobs mode for daily alerts. No proxy, no login.

- **URL**: https://apify.com/moneyreset/ats-jobs-scraper.md
- **Developed by:** [Money Reset](https://apify.com/moneyreset) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 91.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 job scrapeds

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

## Greenhouse, Lever & Ashby Jobs Scraper API | $1 per 1,000 jobs

**$1 per 1,000 jobs.** Scrape every open job from any company that hires through **Greenhouse, Lever or Ashby**, the applicant tracking systems behind **Stripe, OpenAI, Airbnb, Notion, Ramp, Spotify, Palantir, Figma, Discord** and thousands of startups.

It reads each ATS's **official public job-board API**, so it's fast and reliable, with no proxy, no browser and no login. Every job comes back in **one unified schema**, whatever ATS the company uses.

### What you get

Title, department, team, location(s), remote/hybrid, workplace type, employment type, **salary range** (min, max, currency, interval), posted and updated dates, job URL, apply URL, and full description (text + HTML).

### Use cases

- **Job alerts and job boards:** schedule it daily with *Only new jobs since last run* and get just the fresh postings.
- **Sales and recruiting intelligence:** see who's hiring, for which teams and where. A company hiring 10 sales reps is a hot lead.
- **Salary benchmarking:** structured pay from Ashby and Lever, plus pay ranges parsed from description text.
- **Market research and investing:** track hiring velocity at competitors or portfolio companies.
- **AI and LLM pipelines:** clean JSON that's ready for RAG, matching or classification.

### Pricing

Pay per result: **$1.00 per 1,000 jobs** ($0.001 per job). You don't pay any monthly rental, and filtered-out or already-seen jobs are free.

| What you scrape | Jobs | Cost |
|---|---|---|
| One company (e.g. Stripe) | ~500 | ~$0.50 |
| 20 tech companies | ~5,000 | ~$5 |
| Daily new-jobs alert for 50 companies | ~100/day | ~$3/month |

Apify's free plan includes $5 of monthly credit, which covers about 5,000 jobs a month for free.

### Input example

```json
{
  "boards": ["greenhouse:stripe", "https://jobs.lever.co/spotify", "ashby:openai", "notion"],
  "keywords": ["engineer", "sales"],
  "locationFilter": "Remote",
  "onlyNewSinceLastRun": true
}
```

| Field | Description |
|---|---|
| `boards` | Board URLs, prefixed slugs (`greenhouse:stripe`, `lever:palantir`, `ashby:ramp`) or bare slugs (`notion`, auto-detected) |
| `keywords` | Keep only jobs whose title, department or team contains any of these |
| `locationFilter`, `remoteOnly` | Location filters |
| `onlyNewSinceLastRun`, `stateKey` | Output only jobs not seen in earlier runs (monitoring) |
| `includeDescription` | Full description text + HTML (default on) |
| `maxJobsPerCompany` | Limit per company (0 = all). The input form starts at 10 so your first test run stays cheap. If `boards` is empty, a small example runs (10 jobs per example board). |

### Sample output

```json
{
  "ats": "ashby", "company": "openai", "title": "Software Engineer, Infrastructure",
  "department": "Engineering", "team": "Infrastructure", "location": "San Francisco",
  "isRemote": false, "workplaceType": "onsite", "employmentType": "FullTime",
  "salaryMin": 310000, "salaryMax": 460000, "salaryCurrency": "USD", "salaryInterval": "1 YEAR",
  "salaryText": "$310K – $460K", "salarySource": "ats",
  "postedAt": "2026-09-30T17:02:11.000Z",
  "jobUrl": "https://jobs.ashbyhq.com/openai/…", "applyUrl": "https://jobs.ashbyhq.com/openai/…/application",
  "uid": "ashby:openai:…", "isNew": true, "scrapedAt": "2026-10-14T15:00:00.000Z"
}
```

A run summary (jobs per board, boards not found) is saved as `SUMMARY` in the run's key-value store.

### Field availability by ATS

- **Greenhouse:** no team, workplace type or structured salary in the public API. Salary is parsed from the description when it's stated.
- **Lever:** structured salary when the company publishes it, otherwise parsed from the description.
- **Ashby:** the richest data, with structured compensation, a remote flag and workplace type.

### Integrations: API, Make, Zapier, n8n, Google Sheets

- **API:** call `https://api.apify.com/v2/acts/moneyreset~ats-jobs-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN` with your input as JSON and get results back in one request.
- **No-code:** use the official Apify apps for **Make**, **Zapier** and **n8n** to send results to Google Sheets, Airtable, Slack, HubSpot or email.
- **Schedules:** use Apify Schedules to run it daily or weekly, and add a webhook to get pinged when it finishes.
- **Export:** JSON, CSV, Excel, XML or RSS from the dataset tab.
- **AI agents:** works through the Apify MCP server, so Claude, ChatGPT and other agents can call it as a tool.

### FAQ

**How do I find a company's board slug?** Open the company's careers page and click a job. The URL shows it, for example `boards.greenhouse.io/<slug>`, `jobs.lever.co/<slug>` or `jobs.ashbyhq.com/<slug>`. You can also just enter the company name (e.g. `notion`) and it tries all three.
**Do I need a proxy or login?** No.
**Is it legal?** It reads only the public, no-login job-board APIs that Greenhouse, Lever and Ashby document for publishing jobs, and returns job postings (no applicant data). This isn't legal advice: you're responsible for how you use the data and for following the terms that apply to you.
**How fresh is the data?** It's live. Every run calls the ATS directly.
**Workday, iCIMS or SmartRecruiters?** They're on the roadmap. Open an issue to vote for one.
**Something broke?** Open an issue on the Issues tab. We'll take a look.

# Actor input Schema

## `boards` (type: `array`):

One per line. Accepts board URLs (https://boards.greenhouse.io/stripe, https://jobs.lever.co/spotify, https://jobs.ashbyhq.com/openai), prefixed slugs (greenhouse:stripe, lever:palantir, ashby:ramp) or bare slugs (auto-detected). Leave empty to run a small example (10 jobs from each example board).

## `defaultAts` (type: `string`):

Which ATS to use for bare slugs like "stripe". Auto tries Greenhouse, then Lever, then Ashby.

## `onlyNewSinceLastRun` (type: `boolean`):

Remember job IDs between runs (in a named key-value store) and output only jobs not seen before. The first run outputs everything. Ideal for scheduled daily alerts.

## `stateKey` (type: `string`):

Use different names to keep separate 'seen jobs' memories for different schedules/tasks.

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

Keep only jobs whose title, department or team contains any of these (case-insensitive). Empty = all.

## `locationFilter` (type: `string`):

Keep only jobs whose location contains this text, e.g. "New York" or "Remote".

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

Keep only jobs marked remote.

## `includeDescription` (type: `boolean`):

Include full description (text + HTML). Turn off for smaller, faster output.

## `maxJobsPerCompany` (type: `integer`):

0 = no limit (every job). The form starts at 10 so a first test run stays cheap; set 0 to get every open job.

## Actor input object example

```json
{
  "boards": [
    "greenhouse:stripe",
    "https://jobs.lever.co/spotify",
    "https://jobs.ashbyhq.com/openai"
  ],
  "defaultAts": "auto",
  "onlyNewSinceLastRun": false,
  "stateKey": "default",
  "remoteOnly": false,
  "includeDescription": true,
  "maxJobsPerCompany": 10
}
```

# Actor output Schema

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

Jobs in 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 = {
    "boards": [
        "greenhouse:stripe",
        "https://jobs.lever.co/spotify",
        "https://jobs.ashbyhq.com/openai"
    ],
    "maxJobsPerCompany": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("moneyreset/ats-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 = {
    "boards": [
        "greenhouse:stripe",
        "https://jobs.lever.co/spotify",
        "https://jobs.ashbyhq.com/openai",
    ],
    "maxJobsPerCompany": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("moneyreset/ats-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 '{
  "boards": [
    "greenhouse:stripe",
    "https://jobs.lever.co/spotify",
    "https://jobs.ashbyhq.com/openai"
  ],
  "maxJobsPerCompany": 10
}' |
apify call moneyreset/ats-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,moneyreset/ats-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/YV16kW2MdM7bYfkST/builds/6g9cZhv56MMHfroXS/openapi.json
