# ATS Jobs Scraper - Greenhouse, Lever, Ashby & 5 More (`tenfoldfleet/ats-jobs-scraper`) Actor

Get job postings from Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Personio and BambooHR: all jobs on a company career page or job board in one schema with title, location, remote, salary, description, apply URL and dates. No browser. $2 per 1,000 jobs; failed companies are free.

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

## Pricing

from $2.00 / 1,000 job postings

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

### What does ATS Jobs Scraper do?

**ATS Jobs Scraper** pulls **job postings straight from company applicant-tracking systems** through their public job-board APIs and returns them in **one normalised schema**. One actor covers **8 ATS**:

- **[Greenhouse](https://www.greenhouse.com/) jobs API** (boards.greenhouse.io, job-boards.greenhouse.io)
- **[Lever](https://www.lever.co/) jobs scraper** (jobs.lever.co)
- **[Ashby](https://www.ashbyhq.com/) jobs** (jobs.ashbyhq.com), with salary ranges
- **Workable** (apply.workable.com)
- **SmartRecruiters** (jobs.smartrecruiters.com)
- **Recruitee** (company.recruitee.com)
- **Personio** (company.jobs.personio.de / .com)
- **BambooHR** (company.bamboohr.com/careers)

Paste job board URLs, `ats:slug` shorthands like `greenhouse:stripe`, or just a company's **careers page**: the actor finds the embedded ATS for you. You get title, department, team, location, **remote flag**, employment type, **salary range**, full **job description** (text and HTML), apply URL and posting dates for every open role. Plain HTTP API calls, no browser, so it is fast and cheap: **$2 per 1,000 jobs**.

### Why use an ATS jobs API?

- 🧲 **Hiring signals for B2B prospecting**: a company hiring 5 SDRs, a first data engineer or a Head of Security is a buying signal. Track open roles at your target accounts and reach out at the right moment.
- 📊 **Job board aggregation**: build a niche job board (remote, climate, crypto, AI) from hundreds of company boards with one schema instead of eight integrations.
- 🕵️ **Competitor and market intelligence**: see which teams competitors are growing, which locations they hire in and what they pay.
- 🧑‍💼 **Recruiting and talent sourcing**: monitor new roles at companies your candidates want to join; filter by keyword, location, remote and posting date.
- 💰 **Salary benchmarking**: Greenhouse, Ashby, Recruitee, Personio and Lever expose pay ranges where companies publish them.
- 🤖 **AI agents and data pipelines**: call it from the Apify API, MCP server, Make, Zapier, n8n or Clay and get clean JSON.

### What data can it extract?

| Field | Example |
|---|---|
| `company` | `Airbnb` |
| `ats` | `greenhouse`, `lever`, `ashby`, `workable`, `smartrecruiters`, `recruitee`, `personio`, `bamboohr` |
| `jobId` | `8232207` |
| `title` | `Senior Software Engineer, Payments` |
| `department`, `team` | `Engineering`, `Backend` |
| `location` | `New York, NY; Remote (US)` |
| `remote` | `true` / `false` / `null` (unknown) |
| `employmentType` | `Full-time` |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryInterval` | `211400`, `290600`, `USD`, `year` |
| `descriptionText`, `descriptionHtml` | full job description |
| `applyUrl`, `sourceUrl` | application form and job page |
| `postedAt`, `updatedAt`, `scrapedAt` | ISO 8601 timestamps |

### How to scrape jobs from Greenhouse, Lever, Ashby and other ATS

1. Click **Try for free**.
2. Add companies to **Companies**, one per line: a board URL (`https://jobs.lever.co/spotify`), a shorthand (`ashby:ramp`) or a careers page (`https://www.figma.com/careers`).
3. Optionally filter by **job title**, **location**, **remote only** or **posted within N days**.
4. Click **Start**, then download the jobs as **JSON, CSV, Excel or HTML**, or fetch them through the API.

### How much does it cost?

You pay **per job saved: $0.002**, which is **$2 per 1,000 jobs**, across all 8 ATS. Companies that fail (wrong slug, ATS not detected, empty board) are reported in the dataset with an `error` field and are **never charged**. Set a maximum cost per run in the run options and the actor stops cleanly when it is reached. Apify's free plan credit covers thousands of jobs a month.

### Input

```json
{
    "companies": [
        "https://boards.greenhouse.io/airbnb",
        "lever:spotify",
        "https://jobs.ashbyhq.com/ramp",
        "https://apply.workable.com/tetrascience",
        "smartrecruiters:BoschGroup",
        "https://www.figma.com/careers"
    ],
    "keyword": "engineer",
    "location": "",
    "remoteOnly": false,
    "postedWithinDays": 30,
    "includeDescription": true,
    "maxJobsPerCompany": 1000
}
```

Shorthand prefixes: `greenhouse:`, `lever:`, `ashby:`, `workable:`, `smartrecruiters:`, `recruitee:`, `personio:` (add `.com` for jobs.personio.com boards, e.g. `personio:acme.com`) and `bamboohr:`.

### Output

```json
{
    "company": "ramp",
    "ats": "ashby",
    "jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
    "title": "Security Engineer, Cloud",
    "department": "Engineering",
    "team": "Backend",
    "location": "New York, NY (HQ); Remote (Canada); Remote (US); Miami, FL",
    "remote": true,
    "employmentType": "Full-time",
    "salaryMin": 211400,
    "salaryMax": 290600,
    "salaryCurrency": "USD",
    "salaryInterval": "year",
    "descriptionText": "About Ramp\nRamp is building the smart infrastructure for finance teams...",
    "descriptionHtml": "<h1><strong>About Ramp</strong></h1>...",
    "applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
    "postedAt": "2026-04-07T17:12:35.753Z",
    "updatedAt": null,
    "sourceUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
    "scrapedAt": "2026-10-01T09:00:00.000Z",
    "input": "https://jobs.ashbyhq.com/ramp"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. Failed companies appear as `{ "input": "...", "error": "..." }` rows.

### Tips

- **Board URLs are the most reliable input.** Careers-page detection works when the page embeds or links the ATS (Figma, Notion, Linear, Vercel, Palantir...). Pages that load jobs only through JavaScript may report "ATS not detected"; open the job list once and copy the board URL.
- **SmartRecruiters slugs are case-sensitive** (`BoschGroup`, not `boschgroup`).
- Turn off **Include job description** for a light, fast list of roles; SmartRecruiters and BambooHR then skip one request per job.
- Schedule the actor daily with **Posted within: 1 day** to get a feed of new roles only.
- Filters run before you are charged: you only pay for jobs that match.

### FAQ

#### Is this a Greenhouse jobs API alternative?

Yes. It reads the same public Greenhouse Job Board API that powers company career pages and returns cleaner, normalised data, alongside Lever, Ashby and 5 more ATS in the same format.

#### Which salary data is included?

Whatever the company publishes through the ATS: Greenhouse pay-transparency ranges, Ashby compensation tiers, Recruitee and Personio salary fields, and Lever and SmartRecruiters salary ranges when set. Many companies publish pay only for US-based roles, so expect gaps elsewhere.

#### Why is `remote` sometimes null?

Some ATS (Personio, some Greenhouse boards) have no remote field. The actor then marks a job as remote only when its location says so and leaves `null` when unknown, rather than guessing `false`.

#### Can I scrape thousands of companies?

Yes. Companies are fetched in parallel and each board is one or a few API calls. Duplicate inputs pointing to the same board are fetched once.

#### Can I use it from code or AI agents?

Yes, through the Apify API, the JavaScript or Python client, or the Apify MCP server.

#### Support

Missing an ATS or found a board that does not parse? Open an issue in the **Issues** tab.

This actor only reads publicly published job postings through the official public job-board endpoints of each ATS. It does not log in, bypass access controls or collect personal data about candidates.

### More tools from Tenfold Fleet

| Actor | Price |
|---|---|
| [Website Contact Scraper - Emails, Phones & Socials](https://apify.com/tenfoldfleet/company-contact-finder) | $8 per 1,000 (website with contacts) |
| [Website Technology Detector - Wappalyzer Alternative](https://apify.com/tenfoldfleet/tech-stack-detector) | $10 per 1,000 (website analyzed) |
| [URL to Markdown - Web Page to LLM-Ready Text for AI Agents](https://apify.com/tenfoldfleet/url-to-markdown) | $1 per 1,000 (page converted) |
| [YouTube Transcript Scraper - Captions & Subtitles API](https://apify.com/tenfoldfleet/youtube-transcript-scraper) | $3 per 1,000 (transcript extracted) |

# Actor input Schema

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

One company per line. Accepts an ATS job board URL (boards.greenhouse.io/stripe, jobs.lever.co/spotify, jobs.ashbyhq.com/ramp, apply.workable.com/x, jobs.smartrecruiters.com/x, x.recruitee.com, x.jobs.personio.de, x.bamboohr.com/careers), a shorthand like greenhouse:stripe or lever:spotify, or a company careers-page URL (the embedded ATS is detected automatically).

## `keyword` (type: `string`):

Only keep jobs whose title contains this text (case-insensitive), e.g. engineer or sales.

## `location` (type: `string`):

Only keep jobs whose location contains this text (case-insensitive), e.g. London, Germany or Remote.

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

Only keep jobs the ATS marks as remote.

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

Only keep jobs posted in the last N days. 0 = no date filter. Jobs without a posting date are dropped when this is set.

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

Add the full job description as plain text and HTML. Turn off for smaller, faster results (SmartRecruiters and BambooHR need one extra request per job for it).

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

Stop after this many jobs per company (after filters).

## Actor input object example

```json
{
  "companies": [
    "https://boards.greenhouse.io/airbnb",
    "lever:spotify",
    "https://jobs.ashbyhq.com/ramp",
    "https://apply.workable.com/tetrascience"
  ],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "includeDescription": true,
  "maxJobsPerCompany": 1000
}
```

# 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": [
        "https://boards.greenhouse.io/airbnb",
        "lever:spotify",
        "https://jobs.ashbyhq.com/ramp",
        "https://apply.workable.com/tetrascience"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tenfoldfleet/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/airbnb",
        "lever:spotify",
        "https://jobs.ashbyhq.com/ramp",
        "https://apply.workable.com/tetrascience",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("tenfoldfleet/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/airbnb",
    "lever:spotify",
    "https://jobs.ashbyhq.com/ramp",
    "https://apply.workable.com/tetrascience"
  ]
}' |
apify call tenfoldfleet/ats-jobs-scraper --silent --output-dataset

```

## MCP server setup

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