# ATS Jobs Scraper API: Greenhouse, Lever & Ashby + AI (`data-drip/ats-jobs-scraper`) Actor

Scrape every open job from any company's Greenhouse, Lever or Ashby board via their official public APIs. One clean schema with salary, remote, department, location and dates, plus optional AI seniority, skills and salary estimates.

- **URL**: https://apify.com/data-drip/ats-jobs-scraper.md
- **Developed by:** [Ibraheem Ganayim](https://apify.com/data-drip) (community)
- **Categories:** Jobs, AI, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## ATS Jobs Scraper API: Greenhouse, Lever & Ashby + AI

**ATS Jobs Scraper at a glance:** data from the Greenhouse, Lever and Ashby public job-board APIs · no login, no browser, no proxies · **$1.50 per 1,000 jobs** · optional AI with your own key · JSON, CSV, Excel export, API and MCP ready

### What does the ATS Jobs Scraper do?

Scrape **every open job** from any company that hires through **Greenhouse, Lever or Ashby**. Results come back in **one clean, unified schema** with salary ranges, remote status, departments, locations and posting dates. You can also turn on **AI enrichment**, which adds seniority, job function, skills, years of experience, visa sponsorship and a salary estimate to each job.

Data comes straight from each ATS's **official public job-board APIs**, the same feeds that power company careers pages. There is no browser, no login and no proxy, so runs are fast, cheap and very reliable.

### Why this jobs scraper?

- **3 ATS platforms, 1 schema.** Greenhouse, Lever and Ashby jobs share the same fields, so you can merge thousands of companies into one dataset.
- **Just paste names.** Use careers-page URLs, `greenhouse:stripe`-style slugs, or plain names like `notion`. Plain names are auto-detected across all three platforms.
- **Salary data included.** Native compensation fields from Ashby and Lever, plus salary parsing from description text.
- **Filters built in.** Keywords, locations, remote only, and posted within N days.
- **Optional AI layer.** Structured skills and seniority for job-market analytics, using your own LLM key.
- **Company job data only.** No candidate or recruiter personal data. Emails and phone numbers are stripped from descriptions.

### Use cases

- Build a niche job board or job alert newsletter, for example remote AI jobs at Series B+ startups
- Track **hiring signals** for sales, such as which companies are hiring sales or data teams this month
- Run competitor and talent-market research on headcount growth by department and location
- Compare salary ranges by role, seniority and city
- Feed fresh job data into RAG pipelines, AI agents or recruiting tools

### How to use the ATS Jobs Scraper

1. Click **Try for free** (or **Start**) on this page and sign in to Apify.
2. Add companies as careers-page URLs, `greenhouse:stripe`-style slugs or plain names like `notion`.
3. Optionally filter by keywords, locations, remote only or posted within N days.
4. Optionally enable AI enrichment and paste your OpenAI or OpenRouter key.
5. Click **Start**, then download results as JSON, CSV or Excel, or fetch them via the API.

### Input

| Field | Description |
|---|---|
| `companies` | Careers URLs (`https://boards.greenhouse.io/stripe`, `https://jobs.lever.co/palantir`, `https://jobs.ashbyhq.com/ramp`), prefixed slugs (`greenhouse:stripe`, `lever:palantir`, `ashby:ramp`) or plain names (`notion`) |
| `keywords` | Keep only jobs whose title or description contains any of these words |
| `locations` | Keep only jobs whose location contains any of these strings |
| `remoteOnly` | Keep only remote jobs |
| `postedWithinDays` | Keep only jobs posted or updated in the last N days |
| `includeDescription` | Include the plain-text job description (default `true`) |
| `maxJobsPerCompany` / `maxJobsTotal` | Limits, so you control spend |
| `enableAi`, `llmProvider`, `llmApiKey`, `llmModel` | Optional AI enrichment with your own key |

```json
{
  "companies": ["https://boards.greenhouse.io/stripe", "lever:palantir", "ashby:ramp", "notion"],
  "keywords": ["engineer"],
  "remoteOnly": false,
  "maxJobsPerCompany": 200
}
```

### Output example

One row per job, straight from the Greenhouse, Lever and Ashby public job-board APIs:

```json
{
  "company": "Stripe",
  "companySlug": "stripe",
  "ats": "greenhouse",
  "jobId": "8172503",
  "title": "Abuse Research Engineer",
  "department": "8611 Security Analytics",
  "team": null,
  "location": "Remote from the US",
  "allLocations": [
    "US"
  ],
  "remote": true,
  "workplaceType": "remote",
  "employmentType": null,
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryInterval": null,
  "salaryText": null,
  "postedAt": "2026-09-09T10:52:09-04:00",
  "updatedAt": "2026-10-29T10:42:09-04:00",
  "jobUrl": "https://stripe.com/jobs/search?gh_jid=8172503",
  "applyUrl": "https://stripe.com/jobs/search?gh_jid=8172503",
  "descriptionText": "Who we are\n About Stripe\n Stripe is a financial infrastructure platform for businesses. Millions of companies—from the world’s largest enterprises to the mos...",
  "scrapedAt": "2026-10-31T15:04:03.392Z"
}
```

With AI turned on, each job also gets an `ai` object: `seniority`, `jobFunction`, `remotePolicy`, `skills[]`, `yearsExperienceMin`, `salaryEstimate`, `visaSponsorship`, `languages[]` and `summary`.

Export to JSON, CSV, Excel or HTML, or pull results through the Apify API, webhooks, Zapier, Make, n8n or MCP.

### How much does it cost?

This Actor uses **pay per event** pricing: you pay only for results saved to your dataset, with no monthly fee. Apify platform compute is included.

| Event | Price |
|---|---|
| Job scraped | **$0.0015** per job ($1.50 per 1,000) |
| AI enrichment | **$0.002** per enriched job (plus your own LLM tokens) |

You only pay for jobs that are actually saved. The Actor stops cleanly when your **max cost per run** is reached.

**Examples**

- 1,000 jobs: **$1.50**
- 10,000 jobs: **$15**
- 1,000 jobs with AI: **$3.50** plus your LLM tokens (typically cents with `gpt-4o-mini`)

Apify's Free plan includes $5 of monthly usage, enough for about **3,333 jobs** without AI. Set **Maximum cost per run** in the run options to cap spend; the Actor stops cleanly at the limit.

### Use it via API, Python, n8n, Make or AI agents

Run the Actor and get results in one call (replace `<APIFY_TOKEN>` with your token):

```bash
curl -X POST "https://api.apify.com/v2/acts/data-drip~ats-jobs-scraper/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \
  -H 'Content-Type: application/json' \
  -d '{"companies": ["stripe", "lever:palantir", "ashby:ramp"], "keywords": ["engineer"], "maxJobsPerCompany": 50}'
```

```python
from apify_client import ApifyClient

client = ApifyClient('<APIFY_TOKEN>')
run = client.actor('data-drip/ats-jobs-scraper').call(run_input={"companies": ["stripe", "lever:palantir", "ashby:ramp"], "keywords": ["engineer"], "maxJobsPerCompany": 50})
for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

- **Schedules**: run it hourly, daily or weekly from Apify Schedules.
- **Integrations**: send results to Google Sheets, Slack, Zapier, Make, n8n or a webhook.
- **AI agents (MCP)**: add `data-drip/ats-jobs-scraper` as a tool in the Apify MCP server (`https://mcp.apify.com`) for Claude, Cursor and other MCP clients.

### Limitations

- Covers Greenhouse, Lever and Ashby only (not Workday, LinkedIn or Indeed).
- Returns jobs that are currently open; closed postings are not archived.
- Salary fields are only as complete as each company publishes them.

### FAQ

**Is this legal?** The Actor reads public job postings from the official, unauthenticated job-board APIs that Greenhouse, Lever and Ashby publish for exactly this purpose. It collects no personal data. You remain responsible for how you use the data.

**How do I find a company's slug?** It is the last part of its careers URL: `boards.greenhouse.io/<slug>`, `jobs.lever.co/<slug>` or `jobs.ashbyhq.com/<slug>`. You can also just type the company name.

**What about Workday, LinkedIn or Indeed?** They are not supported. This Actor focuses on the open ATS APIs, which never break or get blocked.

**Do I need an AI key?** No. Without a key the Actor runs as a fast, plain scraper and you pay only for results. To turn on AI, paste your own OpenAI or OpenRouter key into the **LLM API key** field. It is stored as an encrypted secret input and only used to call the provider you picked. LLM tokens are billed by your provider, not by us.

**Which models work?** The default is `gpt-4o-mini`, or `openai/gpt-4o-mini` on OpenRouter. Any chat model that supports JSON output works. Set it in **LLM model**.

**A company returned 0 jobs?** It either uses a different ATS or has no open roles. The log tells you which platforms were tried.

**Can I schedule it?** Yes. Use Apify Schedules (for example daily) and connect the dataset to Google Sheets, Slack or a webhook to get only fresh jobs.

**How do I get help or request a feature?** Open an issue on the Actor's **Issues** tab.

***

**Related searches:** greenhouse scraper, lever jobs scraper, ashby jobs api, job board scraper, ats scraper, job postings data, hiring signals, remote jobs scraper, salary data, careers page scraper.

# Actor input Schema

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

Careers-page URLs (boards.greenhouse.io/stripe, jobs.lever.co/palantir, jobs.ashbyhq.com/ramp), prefixed slugs (greenhouse:stripe, lever:palantir, ashby:ramp), or plain slugs (auto-detected across all three ATSs).

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

Keep only jobs whose title, department or team contains any of these words (case-insensitive). Leave empty for all jobs.

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

Keep only jobs whose location contains any of these strings, e.g. "London", "Spain", "Remote".

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

Keep only remote jobs.

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

Only jobs first published within the last N days (0 = no limit). Applies where the ATS exposes a publish date.

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

Stop after this many jobs per company.

## `maxJobsTotal` (type: `integer`):

Stop after this many jobs across all companies.

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

Include the plain-text job description (emails and phone numbers are removed).

## `enableAi` (type: `boolean`):

Extract seniority, job function, skills, remote policy, salary and a short summary with an LLM. Requires your own OpenAI or OpenRouter API key.

## `llmProvider` (type: `string`):

Which API your key belongs to.

## `llmApiKey` (type: `string`):

Your OpenAI or OpenRouter API key. Stored encrypted; only used for this run.

## `llmModel` (type: `string`):

Defaults to gpt-4o-mini (OpenAI) or openai/gpt-4o-mini (OpenRouter).

## Actor input object example

```json
{
  "companies": [
    "https://boards.greenhouse.io/stripe",
    "lever:palantir",
    "ashby:ramp"
  ],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "maxJobsPerCompany": 500,
  "maxJobsTotal": 5000,
  "includeDescription": true,
  "enableAi": false,
  "llmProvider": "openai"
}
```

# Actor output Schema

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

No description

## `aiInsights` (type: `string`):

No description

# 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 = {
    "companies": [
        "https://boards.greenhouse.io/stripe",
        "lever:palantir",
        "ashby:ramp"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("data-drip/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 = { "companies": [
        "https://boards.greenhouse.io/stripe",
        "lever:palantir",
        "ashby:ramp",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("data-drip/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 '{
  "companies": [
    "https://boards.greenhouse.io/stripe",
    "lever:palantir",
    "ashby:ramp"
  ]
}' |
apify call data-drip/ats-jobs-scraper --silent --output-dataset

```

## MCP server setup

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