# ATS Jobs Scraper – Greenhouse, Lever, Ashby & more (`anxuanng/ats-jobs-scraper`) Actor

Scrape jobs from company career boards on Greenhouse, Lever, Ashby, Workday, Workable, Recruitee and SmartRecruiters in one schema: title, department, location, remote, salary range, posted date, apply URL, description. Company names or URLs in; only-new mode for monitoring.

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

## Pricing

$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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## ATS Jobs Scraper – Greenhouse, Lever, Ashby, Workday, Workable, Recruitee & SmartRecruiters

Get every open job from a company's own career board, straight from the applicant tracking system (ATS) it runs on,
in one clean schema. Give company names like `stripe` or career-page URLs; the Actor finds the board on
**Greenhouse, Lever, Ashby, Workday, Workable, Recruitee or SmartRecruiters** and returns title, department, location,
remote/hybrid, **salary range**, posted date, apply link and the full description.

### What data can I get?

| Field | Example |
|---|---|
| `company` / `companyName` | `ramp` / `Ramp` |
| `source` | `ashby` (which ATS the job came from) |
| `title` | `Senior Backend Engineer` |
| `department`, `team` | `Engineering`, `Backend` |
| `location`, `locations`, `country` | `New York, NY (HQ)`, `["New York, NY (HQ)", "Remote (US)"]`, `USA` |
| `remote`, `workplaceType` | `true`, `hybrid` |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryInterval` | `211400`, `290600`, `USD`, `year` |
| `salaryText`, `salaryFromDescription` | `$211.4K - $290.6K`, `false` |
| `employmentType` | `FullTime` |
| `url`, `applyUrl` | job page and application link |
| `postedAt`, `updatedAt` | ISO dates |
| `description` | full job description as plain text |

Salary comes from the ATS's own salary field when the company publishes one (Ashby, Lever, Recruitee). When it
doesn't, the Actor reads a salary range written in the description (common in US postings on Greenhouse and
Workday, e.g. `168,000 USD - 270,250 USD`) and marks it with `salaryFromDescription: true`, so you always know which is which.

### How much does it cost?

**$1.50 per 1,000 jobs.** You pay only for jobs delivered to your dataset; boards that don't exist or jobs removed
by your filters cost nothing. A company with 150 open roles costs about $0.23.

### How do I use it?

1. Add companies, one per line: `stripe`, `https://jobs.ashbyhq.com/ramp`, `https://jobs.lever.co/palantir`.
2. Optionally filter by title keywords, locations, remote only, or jobs posted in the last N days.
3. Run, then download JSON, CSV or Excel, or call the API.

```json
{
  "companies": ["stripe", "https://jobs.ashbyhq.com/ramp", "huggingface"],
  "keywords": ["engineer"],
  "locations": ["Remote", "London"],
  "onlyNewJobs": false,
  "maxItems": 1000
}
```

### How do I get only new jobs every day?

Turn on **Only new jobs** and schedule the Actor daily. Each run returns only jobs you haven't received before,
so you never pay twice for the same posting. Jobs cut off by your spending limit are not marked as seen and come
back on the next run.

### Which companies and URLs work?

| ATS | Accepted input |
|---|---|
| Greenhouse | `stripe`, `boards.greenhouse.io/stripe`, `job-boards.greenhouse.io/embed/job_board?for=stripe` |
| Lever | `palantir`, `jobs.lever.co/palantir` (EU boards: `jobs.eu.lever.co/...`) |
| Ashby | `ramp`, `jobs.ashbyhq.com/ramp` |
| Workable | `huggingface`, `apply.workable.com/huggingface` |
| Recruitee | `bunq`, `bunq.recruitee.com` |
| SmartRecruiters | `BoschGroup`, `careers.smartrecruiters.com/BoschGroup` |
| Workday | URL only: `nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite` (also `wd3.myworkdaysite.com/recruiting/<tenant>/<site>`) |

A bare name is tried on each ATS in that order (Workday needs the career-site URL, since a name alone can't locate the board). If the same name exists on two ATSs, pin it with a URL or a prefix
such as `lever:acme`.

### Use cases

- **Recruiting and sourcing:** track every opening at your target companies in one sheet.
- **Sales prospecting:** companies hiring for a role are buying signals (e.g. hiring "RevOps" → needs revenue tools).
- **Job boards and newsletters:** feed fresh, first-party postings with salary data.
- **Market research:** compare salary bands, remote share and hiring volume across companies.

### FAQ

**Is it legal?** The Actor reads the public job-board endpoints that each ATS provides for career pages. It does not
log in or collect personal data: recruiter emails and names are never copied.

**Do I need a proxy?** No. These are public APIs; the Actor runs at 256 MB without a proxy.

**How fresh is the data?** It is read live from the board at run time.

**Workday boards with thousands of jobs.** Workday's own search returns at most 2,000 jobs per query. With a single title keyword the Actor searches server-side, so large boards like NVIDIA stay fully reachable for that role. Locations use each board's own spelling (NVIDIA writes `US, CA, Santa Clara`), so filter with the text you see on the career site.

**A company isn't found.** It may use an ATS not supported yet (e.g. iCIMS, Oracle) or a custom domain. Open its careers
page, click a job, and paste the job-board URL you land on.

### More scrapers by the same developer

- [Chotot Scraper](https://apify.com/anxuanng/chotot-scraper): Scrape Chợ Tốt (chotot.com), Vietnam's largest classifieds site: cars, motorbikes, real estate, phones, laptops and more, with prices in VND, location and all item attributes. Pay per listing.
- [Prediction Markets Scraper](https://apify.com/anxuanng/prediction-markets-scraper): Kalshi and Polymarket markets in one schema: yes/no probabilities, bid/ask, volume, liquidity, close time and results, with keyword and category filters and an only-changed mode for monitoring.
- [SEEK, JobStreet & JobsDB Jobs Scraper](https://apify.com/anxuanng/seek-jobs-scraper): Job listings from SEEK (Australia, New Zealand), JobStreet (Malaysia, Singapore, Philippines, Indonesia) and JobsDB (Hong Kong, Thailand) in one schema, with salary, work type, classification and an only-new mode.
- [Substack Scraper](https://apify.com/anxuanng/substack-scraper): Posts from any Substack newsletter with likes, comments, word count, free or paid flag and the full text of free posts. Search publications by keyword; only-new mode for monitoring.
- [Telegram Channel Scraper](https://apify.com/anxuanng/telegram-channel-scraper): Scrape public Telegram channels: posts, views, reactions, media, links, forwards, plus channel stats. Incremental mode for daily monitoring. Pay per post.
- [Vietnam Jobs Scraper](https://apify.com/anxuanng/vietnam-jobs-scraper): Scrape job postings from VietnamWorks, TopCV and ITviec in one unified schema. Extract title, company, salary in VND/USD, location, level, skills, deadline and full description. Pay per job, JSON/CSV export, API and MCP access.

# Actor input Schema

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

Company board names or career-page URLs, one per line. A bare name like 'stripe' is looked up on Greenhouse, Lever, Ashby, Workable, Recruitee and SmartRecruiters. URLs pin the ATS: boards.greenhouse.io/stripe, jobs.lever.co/palantir, jobs.ashbyhq.com/ramp, apply.workable.com/huggingface, bunq.recruitee.com, careers.smartrecruiters.com/BoschGroup, and Workday career sites like nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite (Workday needs the URL).

## `ats` (type: `string`):

Where to look up bare company names. 'Auto' tries Greenhouse, Lever, Ashby, Workable, Recruitee and SmartRecruiters in that order and uses the first board that exists. Ignored for URLs.

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

Keep jobs whose title contains any of these words (case-insensitive), e.g. 'engineer', 'sales'. Empty keeps all.

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

Keep jobs whose location contains any of these (case-insensitive), e.g. 'London', 'Remote', 'Germany'. Empty keeps all.

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

Keep only jobs the board marks as remote.

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

Keep only jobs published in the last N days. Leave empty for all open jobs.

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

Add the full job description as plain text. Also lets the Actor read salary ranges written in the text when the ATS has no salary field.

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

Return only jobs you have not received in earlier runs of this Actor. Turn this on for scheduled daily or weekly monitoring so you never pay twice for the same job.

## `maxItems` (type: `integer`):

Stop after this many jobs across all companies. You are only charged per job delivered.

## Actor input object example

```json
{
  "companies": [
    "stripe",
    "https://jobs.ashbyhq.com/ramp",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "ats": "auto",
  "remoteOnly": false,
  "includeDescription": true,
  "onlyNewJobs": false,
  "maxItems": 1000
}
```

# Actor output Schema

## `listings` (type: `string`):

All job rows as JSON; append ?format=csv for CSV or ?format=xlsx for Excel.

## `runSummary` (type: `string`):

Counts of pushed/skipped/failed rows and whether the budget limit was hit.

# 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",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("anxuanng/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",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("anxuanng/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",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ]
}' |
apify call anxuanng/ats-jobs-scraper --silent --output-dataset

```

## MCP server setup

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