# Career Site Jobs Scraper: Workday, Greenhouse, Lever & Ashby (`itzcloud/ats-jobs-scraper`) Actor

Scrape open jobs from company career sites on Workday, Greenhouse, Lever and Ashby. Type a company name or paste a URL. Filters, salary ranges and a monitor mode that only returns new jobs. No browser. $1.50 per 1,000 jobs.

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

## Pricing

from $1.05 / 1,000 job delivereds

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

## Career Site Jobs Scraper: Workday, Greenhouse, Lever & Ashby

**Scrape open jobs straight from company career sites** on **Workday, Greenhouse, Lever and Ashby** and get one clean, normalized row per job: title, location, remote flag, workplace type, employment type, department, posting date, **salary range** and apply URL. Export to CSV, Excel, JSON or Google Sheets, or call it from the API.

Built for **job boards and job aggregators, recruiters and sourcing teams, sales teams tracking hiring signals, labor-market researchers and AI agents** that need fresh postings from the source, not from a stale third-party database.

- 🏢 **Four ATS platforms, one schema.** Workday, Greenhouse, Lever and Ashby rows share the same fields, so you can mix hundreds of companies in a single run.
- 🔎 **Just type the company name.** `stripe`, `notion` or `ramp` is enough: the Actor finds the company's Greenhouse, Lever or Ashby board for you. Or paste any career page URL.
- 🔔 **Monitor mode: only new jobs.** Schedule it daily and it returns (and charges for) only the jobs you haven't seen before. Perfect for job alerts, Slack/Zapier/Make feeds and hiring-signal tracking.
- 🎯 **Filters before you pay.** Title keywords, excluded keywords, locations, remote-only and "posted within N days". Jobs that don't match are never charged.
- 💵 **Salary ranges.** Structured pay from Lever and Ashby, plus ranges written in the description (`$140,000 - $170,000`, `168,000 USD - 264,500 USD`) on every platform.
- 🧱 **Big Workday sites, fully covered.** Workday's search stops at 2,000 results; this Actor splits large career sites by category automatically so you get every job.
- ⚡ **No browser, no proxies.** It reads the platforms' public job feeds, so most companies take a few seconds.
- 💸 **$1.50 per 1,000 jobs.** Career sites that don't exist or have no matching jobs cost nothing.

***

### What you get per job

| Group | Fields |
|---|---|
| **Identity** | `platform` (workday, greenhouse, lever, ashby), `company`, `boardUrl`, `jobId`, `requisitionId`, `title` |
| **Links** | `url`, `applyUrl` |
| **Location** | `location`, `locations[]` (all listed locations), `country`, `remote`, `workplaceType` (Remote, Hybrid, On-site) |
| **Role** | `employmentType` (Full-time, Part-time, Contract, Internship…), `department`, `team` |
| **Dates** | `postedAt`, `postedDaysAgo`, `updatedAt`, `scrapedAt` |
| **Salary** | `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryInterval` (YEAR, MONTH, HOUR…), `salaryText` |
| **Optional** | `description` (plain text), `isNew` (monitor mode) |

### Use cases

- **Job boards and aggregators.** Pull fresh postings from hundreds of employers every day, already normalized, with direct apply links.
- **Job alerts.** Run it on a schedule in monitor mode with your keywords and locations, and pipe only the new jobs to email, Slack or a spreadsheet.
- **Sales intelligence (hiring signals).** A company hiring "Data Engineer" or "Head of Security" is a buying signal. Track target accounts and catch new roles the day they open.
- **Recruiting and sourcing.** Watch competitors' openings, team growth and locations.
- **Salary and labor-market research.** Collect pay ranges by role, seniority and city from pay-transparency postings.
- **AI agents and RAG.** Give your agent live job data with descriptions in plain text.

### How to use it

1. Add companies to **Companies or career site URLs**: a name (`stripe`) or a career page URL. Paste a long list into **Bulk paste**.
2. Optional: set **Job title keywords**, **Locations**, **Remote jobs only** or **Posted within (days)**.
3. Optional: turn on **Only new jobs** and schedule the Actor (for example, daily) to get alerts.
4. Click **Start**, then export as CSV, Excel or JSON, or read the dataset from the API.

#### Supported URLs

| Platform | Examples |
|---|---|
| Greenhouse | `https://boards.greenhouse.io/stripe`, `https://job-boards.greenhouse.io/stripe`, `greenhouse:stripe` |
| Lever | `https://jobs.lever.co/palantir`, `https://jobs.eu.lever.co/company`, `lever:palantir` |
| Ashby | `https://jobs.ashbyhq.com/ramp`, `ashby:ramp` |
| Workday | `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`, `https://wd3.myworkdaysite.com/recruiting/company/site` |
| Any of the first three | Just the company name: `notion`, `figma`, `openai` |

Tip: on a company's careers page, click any job. If the address contains `greenhouse.io`, `lever.co`, `ashbyhq.com` or `myworkdayjobs.com`, paste that address here.

#### Input example

```json
{
  "companies": ["stripe", "https://jobs.ashbyhq.com/ramp", "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
  "keywords": ["data", "machine learning"],
  "excludeKeywords": ["intern"],
  "locations": ["United States", "Remote"],
  "postedWithinDays": 14,
  "onlyNewJobs": true,
  "monitorName": "data-jobs-us"
}
```

#### Output example (a real result)

```json
{
  "platform": "ashby",
  "company": "ramp",
  "jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "title": "Security Engineer, Cloud",
  "url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
  "location": "New York, NY (HQ)",
  "locations": ["New York, NY (HQ)", "Remote (Canada)", "Remote (US)", "Miami, FL"],
  "country": "USA",
  "remote": true,
  "workplaceType": "Hybrid",
  "employmentType": "Full-time",
  "department": "Engineering",
  "team": "Backend",
  "postedAt": "2026-04-07T17:12:35.753Z",
  "postedDaysAgo": 204,
  "salaryMin": 211400,
  "salaryMax": 290600,
  "salaryCurrency": "USD",
  "salaryInterval": "YEAR",
  "salaryText": "$211.4K - $290.6K"
}
```

### Monitor mode (only new jobs)

Turn on **Only new jobs** and the Actor remembers which jobs it already returned for each career site. Later runs return only jobs that appeared since then, each with `isNew: true`, and **you only pay for those**.

- The first run returns every matching job and saves them as the baseline.
- Use a different **Monitor name** for each saved search, so their memories don't mix.
- Schedule it in Apify (Schedules → daily) and connect an integration (email, Slack, Google Sheets, Zapier, Make or a webhook) to get alerts automatically.

### Pricing

Pay-per-event. Platform usage is included.

| Event | Price |
|---|---|
| Job delivered | **$0.0015** ($1.50 per 1,000 jobs) |
| Career site not found, or no matching jobs | **Free** (you get a row explaining why) |
| Jobs filtered out by your filters, or already seen in monitor mode | **Free** |
| Run start | Apify's standard start fee (a fraction of a cent per run) |

Higher Apify plans get automatic volume discounts. Set **Maximum cost per run** in the run options to cap any run: the Actor stops cleanly at your limit and keeps everything delivered so far.

### FAQ

**Which companies use these platforms?** Thousands. Greenhouse, Lever and Ashby are common at tech companies and startups (Stripe, Notion, Ramp, Palantir, Figma…); Workday is common at large enterprises (NVIDIA, Salesforce, banks, hospitals, universities).

**How do I know which platform a company uses?** Open any job on its careers page and look at the address bar (see the tip above), or just try the company name: the Actor checks Greenhouse, Lever and Ashby for you.

**Why do some jobs have no salary?** Only jobs whose company publishes pay (structured, or written in the description) have one. Pay-transparency locations like California, Colorado, New York and Washington usually include it.

**Is the data fresh?** Yes. Every run reads the company's own career site at that moment. Jobs that were closed are no longer returned.

**Does it log in or bypass anything?** No. It only reads the same public job listings any visitor can see.

**Can I get descriptions?** Turn on **Include job description**. It's off by default to keep exports light; salary ranges are extracted either way.

### Limits

- Lever, Greenhouse and Ashby boards are read in one request each, so even very large boards finish in seconds.
- Workday sites need one request per 20 jobs plus one per job for the details. With **Workday: fetch job details** turned off, a 2,000-job site takes well under a minute but returns only title, location, requisition ID and an approximate posting date.
- Custom career sites that don't run on these four platforms are not supported (you get a free row explaining it).

# Actor input Schema

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

One per line. Paste a career page URL (<code>https://boards.greenhouse.io/stripe</code>, <code>https://jobs.lever.co/palantir</code>, <code>https://jobs.ashbyhq.com/ramp</code>, <code>https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite</code>) or just a company name (<code>stripe</code>): names are looked up on Greenhouse, Lever and Ashby automatically. Workday always needs the URL.

## `companiesText` (type: `string`):

Paste a whole column of company names or career URLs, separated by new lines, commas or spaces.

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

Keep jobs whose title contains at least one of these (case and accents don't matter). Leave empty to get every job.

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

Drop jobs whose title contains any of these (e.g. <code>intern</code>, <code>senior</code>).

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

Keep jobs whose location or country contains at least one of these (e.g. <code>London</code>, <code>Germany</code>, <code>Remote</code>).

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

Keep only jobs marked as remote by the company.

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

Keep only jobs published in the last N days. 0 = any date.

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

Remembers the jobs returned in previous runs and only returns (and charges for) jobs you haven't seen yet. The first run returns everything. Ideal for a daily schedule that feeds job alerts.

## `monitorName` (type: `string`):

Separate monitors keep separate memories. Use a different name for each saved search (e.g. <code>remote-data-jobs</code>).

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

Adds the full job description as plain text. Salary ranges written in the description are extracted either way.

## `workdayDetails` (type: `boolean`):

Workday lists only title and location. With this on, each job page is read to get the exact date, country, time type, salary and description. Turn it off for a faster title-only export.

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

Stop after this many matching jobs per career site. 0 = no limit.

## `maxConcurrency` (type: `integer`):

How many career sites are processed in parallel. Leave empty for automatic.

## Actor input object example

```json
{
  "companies": [
    "stripe",
    "https://jobs.ashbyhq.com/ramp"
  ],
  "keywords": [
    "engineer"
  ],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "onlyNewJobs": false,
  "includeDescription": false,
  "workdayDetails": true,
  "maxJobsPerCompany": 0
}
```

# Actor output Schema

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

No description

## `salaries` (type: `string`):

No description

## `allFields` (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",
        "https://jobs.ashbyhq.com/ramp"
    ],
    "keywords": [
        "engineer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("itzcloud/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",
        "https://jobs.ashbyhq.com/ramp",
    ],
    "keywords": ["engineer"],
}

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

```

## MCP server setup

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