# ATS Jobs Scraper: Greenhouse, Lever, Ashby & Workday Jobs (`forgedata/ats-jobs-scraper`) Actor

Scrape job postings from company career sites on Greenhouse, Lever, Ashby, Workday, Recruitee and Personio. Type a company name or careers URL, or search a directory of 390 employers. Salary, remote, location, full descriptions and new-job alerts. $1.50 per 1,000 jobs.

- **URL**: https://apify.com/forgedata/ats-jobs-scraper.md
- **Developed by:** [Data Forge](https://apify.com/forgedata) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workday & More

Get **job postings straight from company career sites**: title, department, location, remote status, salary range, posting date, apply link and the full job description. One actor covers **Greenhouse, Lever, Ashby, Workday, Recruitee and Personio**, and finds the right platform for you. **$1.50 per 1,000 jobs.** No login, no cookies, no browser.

These are the real postings, read from each company's own public job board, so they are fresher and cleaner than job aggregators: no reposts, no expired listings, no spam.

### Why this one

- **Just type a company name.** Enter "Stripe" or "Ramp" and the actor finds the company's job board on Greenhouse, Lever, Ashby or Recruitee. Or paste any careers page (like stripe.com/jobs) and it detects the platform behind it.
- **Workday included.** Most Fortune 500 companies post on Workday. Paste the Workday careers URL and get every job, with full descriptions.
- **Built-in company directory.** Turn on **Search the company directory** with a keyword like "data engineer" to search about 390 tech, AI, fintech and Fortune 500 employers at once.
- **Salary data.** Structured pay ranges where the platform provides them, and pay ranges found in the job description where it does not (common for US pay transparency laws).
- **New jobs only.** Monitoring mode remembers what it has seen and returns only jobs posted since your last run. Schedule it daily for job alerts.

### What you can use it for

- **Recruiting and sales intelligence:** see who is hiring, for what, and where. Hiring is a buying signal for staffing firms, SaaS sales and agencies.
- **Job boards and newsletters:** power a niche job board or a weekly jobs email with fresh postings from target companies.
- **Market and salary research:** track hiring trends and pay ranges by role, company and city.
- **Job seekers and career coaches:** watch dream companies and get only new openings.
- **AI and data teams:** clean, structured job data with full descriptions for analysis or training.

### What you get for each job

| Field | Example |
|---|---|
| title | Senior Software Engineer, Payments |
| company / ats / boardSlug | Stripe / greenhouse / stripe |
| department / team | Engineering / Payments |
| location / allLocations / country | New York, NY |
| isRemote / workplaceType | true / Remote |
| employmentType / seniority | FullTime |
| salaryMin / salaryMax / salaryCurrency / salaryInterval | 180000 / 250000 / USD / year |
| salaryText | $180,000 - $250,000 |
| postedAt / updatedAt | 2026-10-21T14:03:00.000Z |
| url / applyUrl | the posting and the apply link |
| description | full job description as plain text |
| isNew | true in monitoring mode for jobs not seen before |
| jobId, scrapedAt | |

### How to use it

1. Add **companies**, one per line. Any of these work:
   - a name: `Stripe`, `Notion`, `Anthropic`
   - a job board URL: `https://boards.greenhouse.io/stripe`, `https://jobs.lever.co/spotify`, `https://jobs.ashbyhq.com/ramp`, `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`, `https://bunq.recruitee.com`, `https://acme.jobs.personio.de`
   - a careers page: `https://stripe.com/jobs`
2. Optional: turn on **Search the company directory** to add the built-in list of employers.
3. Filter by **title keywords**, excluded words, **locations**, **remote only**, **departments** and **posted within N days**.
4. Turn on **Only new jobs since my last run** for alerts, and schedule the actor daily.
5. Set **Max jobs**, run, and download as JSON, CSV or Excel, or use the API.

Companies in the directory (including the Fortune 500 employers on Workday) work by name. For other Workday and Personio employers, paste their careers URL. The run's **COMPANIES** record shows which platform and board was detected for each company.

### Pricing

**$1.50 per 1,000 jobs** saved, pay per result, and less on paid Apify plans (Starter $1.35, Scale $1.20, Business $1.05). You are never charged for jobs removed by your filters, companies that could not be found, or anything beyond your Max jobs.

### Is it legal?

This actor reads only the public job board feeds that Greenhouse, Lever, Ashby, Workday, Recruitee and Personio publish so that companies' jobs can be listed and shared. It does not log in, it checks each site's robots.txt before reading it, and it does not collect any personal data. This actor is not affiliated with any of these platforms.

### Integrations and API

Run it from the Apify API, schedule it, or connect it to Make, Zapier, n8n, Google Sheets, Slack, Airtable and AI agents through the Apify MCP server.

### More from Data Forge

- [App Store Reviews Scraper](https://apify.com/forgedata/app-store-reviews-scraper): Apple App Store reviews from 100+ countries
- [Luma Events Scraper](https://apify.com/forgedata/luma-events-scraper): tech and startup events by city
- [Remote Jobs Aggregator](https://apify.com/forgedata/remote-jobs-aggregator): remote jobs from the top remote job boards and 390 company career sites, deduplicated
- [Jobs Database](https://apify.com/forgedata/jobs-database): search 800K+ jobs from 12,000+ company career sites in seconds

# Actor input Schema

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

Company names (Stripe), board names, job board URLs (boards.greenhouse.io/stripe, jobs.lever.co/spotify, jobs.ashbyhq.com/ramp, nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite, bunq.recruitee.com, acme.jobs.personio.de), or a company's own careers page (stripe.com/jobs). The platform is detected automatically.

## `searchDirectory` (type: `boolean`):

Also search the built-in directory of companies with known job boards (tech, AI, fintech, Fortune 500 on Workday and more). Combine with Keywords, for example to find every open 'data engineer' role across all of them.

## `keywords` (type: `string`):

Keep jobs whose title mentions any of these words. Separate several with commas, e.g. product manager, data engineer, recruiter. A word also matches longer forms, so engineer finds engineering.

## `searchInDescription` (type: `boolean`):

Match keywords in the full job description too, not only the title. Good for skills like Python, Salesforce or SOC 2.

## `excludeKeywords` (type: `string`):

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

## `locations` (type: `string`):

Keep jobs whose location mentions any of these, separated by commas, e.g. New York, London, Remote, Germany.

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

Keep only jobs marked remote by the company.

## `departments` (type: `string`):

Keep jobs in these departments or teams, separated by commas, e.g. Engineering, Sales, Marketing.

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

Keep only jobs posted in the last N days. 0 means any date.

## `onlyNewJobs` (type: `boolean`):

Monitoring mode. Remembers the jobs it has seen (in a storage called ats-jobs-monitor in your account) and returns only jobs that appeared since the previous run. The first run returns everything. Schedule it daily for job alerts.

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

Add the full job description as plain text. Turn off for smaller, faster output.

## `maxJobs` (type: `integer`):

Stop after saving this many jobs in total. You pay only for jobs saved.

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

Optional cap per company so one big employer does not fill your results. 0 means no cap.

## Actor input object example

```json
{
  "companies": [
    "stripe",
    "ramp",
    "https://jobs.lever.co/spotify"
  ],
  "searchDirectory": false,
  "keywords": "",
  "searchInDescription": false,
  "excludeKeywords": "",
  "locations": "",
  "remoteOnly": false,
  "departments": "",
  "postedWithinDays": 0,
  "onlyNewJobs": false,
  "includeDescription": true,
  "maxJobs": 200,
  "maxJobsPerCompany": 0
}
```

# Actor output Schema

## `results` (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": [
        "stripe",
        "ramp",
        "https://jobs.lever.co/spotify"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("forgedata/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": [
        "stripe",
        "ramp",
        "https://jobs.lever.co/spotify",
    ] }

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

```

## MCP server setup

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