# ATS Job Scraper API — Greenhouse, Lever, Ashby & 6 More (`igor_nersisian/multi-ats-jobs-scraper`) Actor

Scrape jobs from 9 ATS platforms with one actor — Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, BambooHR, Breezy HR & Personio. Auto-detects the ATS from a company slug or URL and returns one unified, normalized JSON feed. Pay per result (~$1/1K jobs), no proxies.

- **URL**: https://apify.com/igor\_nersisian/multi-ats-jobs-scraper.md
- **Developed by:** [Igor Nersisian](https://apify.com/igor_nersisian) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 87.1% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 job posting results

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/platform/actors/running/actors-in-store#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 Job Scraper API — Greenhouse, Lever, Ashby & 6 More Job Boards

Scrape **job postings from 9 applicant tracking systems (ATS) with a single actor**: Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, BambooHR, Breezy HR, and Personio. Give it company names or career-page URLs — it auto-detects the ATS platform and returns every open position in one **unified, normalized schema**.

Ideal for **recruiting intelligence, job aggregators, sales & GTM hiring signals, market research, and job-seeker tools**.

### Why this scraper?

- 🎯 **9 ATS platforms, one output schema** — no need to buy and glue together 9 separate scrapers.
- 🔍 **Auto-detection** — pass a bare company slug (e.g. `stripe`) and the actor finds which ATS the company uses.
- 🧹 **Clean, normalized data** — title, location, remote flag, department, employment type, salary (when published), full description (HTML + plain text), posting date, direct apply URL.
- ⚡ **Fast & reliable** — uses each ATS's official public job-board API. No brittle HTML scraping, no proxies needed, no login.
- 💸 **Pay per result** — you pay only for the jobs you actually get.

### Supported platforms

| Platform | Example input |
|---|---|
| Greenhouse | `https://boards.greenhouse.io/stripe` or `stripe` |
| Lever | `https://jobs.lever.co/octoenergy` |
| Ashby | `https://jobs.ashbyhq.com/linear` |
| Workable | `https://apply.workable.com/joinditto` |
| SmartRecruiters | `https://careers.smartrecruiters.com/Visa` |
| Recruitee | `https://company.recruitee.com` |
| BambooHR | `https://company.bamboohr.com/careers` |
| Breezy HR | `https://company.breezy.hr` |
| Personio | `https://company.jobs.personio.de` |

### Input example

```json
{
    "companies": ["stripe", "https://jobs.ashbyhq.com/linear", "https://jobs.lever.co/octoenergy"],
    "keywords": ["engineer", "developer"],
    "remoteOnly": true,
    "includeDescription": true
}
```

### Output example

```json
{
    "id": "d3bc1ced-3ce4-4086-a050-555055dbb1ff",
    "title": "Senior / Staff Fullstack Engineer",
    "company": "linear",
    "platform": "ashby",
    "url": "https://jobs.ashbyhq.com/linear/d3bc1ced-3ce4-4086-a050-555055dbb1ff",
    "applyUrl": "https://jobs.ashbyhq.com/linear/d3bc1ced-.../application",
    "location": "Europe",
    "isRemote": true,
    "department": "Product",
    "team": "Engineering",
    "employmentType": "FullTime",
    "salary": null,
    "description": "<p>At Linear, we're building...</p>",
    "descriptionText": "At Linear, we're building...",
    "publishedAt": "2021-04-27T20:13:45.158Z",
    "scrapedAt": "2026-07-12T14:00:00.000Z"
}
```

### Use cases

- **Hiring-signal lead generation** — companies actively hiring for a role are in-market for related tools and services. Track competitor or prospect hiring in one feed.
- **Job board & aggregator feeds** — populate your niche job board with fresh, structured postings, including salary data where published.
- **Recruiting market intelligence** — monitor open roles, departments, and locations across any watchlist of companies.
- **Job search automation** — watch a set of dream companies and get every new opening as structured data (pipe it into a spreadsheet, Slack, or email via Apify integrations).

### Filters

- `keywords` — keep only jobs whose title matches any keyword (e.g. `["engineer", "designer"]`).
- `locationFilter` — keep only jobs in a given location (e.g. `"Berlin"`).
- `remoteOnly` — keep only remote positions.
- `maxJobsPerCompany` — cap results per company.

### Scheduling & integrations

Run it on a [schedule](https://docs.apify.com/platform/schedules) to get daily/weekly snapshots. Export to **JSON, CSV, Excel**, or connect **Zapier, Make, webhooks, Google Sheets** and more via Apify integrations. Access results via the [Apify API](https://docs.apify.com/api/v2) or MCP for AI agents.

### FAQ

**Do I need proxies or an account on these ATS platforms?**
No. The actor reads each platform's public job-board endpoints directly.

**What happens if a company isn't found?**
The run continues with the other companies; failures are listed in the run log with a clear reason.

**Can I get salary data?**
Yes — where the employer publishes it (Lever `salaryRange`, Ashby compensation, Recruitee salary fields), it's included in the `salary` field.

**Is this legal?**
The actor only accesses publicly available job postings that employers explicitly publish for distribution. No personal data is collected.

# Actor input Schema

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

Company identifiers to scrape. Accepts bare slugs (e.g. <code>stripe</code>) — the ATS is auto-detected — or full career-page URLs, e.g. <code>https://boards.greenhouse.io/stripe</code>, <code>https://jobs.lever.co/octoenergy</code>, <code>https://jobs.ashbyhq.com/linear</code>, <code>https://apply.workable.com/company</code>, <code>https://company.recruitee.com</code>, <code>https://company.breezy.hr</code>, <code>https://company.bamboohr.com/careers</code>, <code>https://company.jobs.personio.de</code>.

## `platform` (type: `string`):

Force a specific ATS platform for bare company slugs. URLs are always auto-detected from the domain. Leave on auto-detect to let the actor probe all 9 platforms.

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

Only keep jobs whose title contains at least one of these keywords (case-insensitive). Leave empty to keep all jobs.

## `locationFilter` (type: `string`):

Only keep jobs whose location contains this text (case-insensitive), e.g. <code>Berlin</code> or <code>United States</code>.

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

Only keep jobs marked as remote (or with 'remote' in the location).

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

Include the full job description (HTML + plain text) in every result. Turning this off makes runs on some platforms (SmartRecruiters, BambooHR, Breezy) faster because descriptions require extra requests there.

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

Stop after this many jobs per company (after filtering). 0 = unlimited.

## Actor input object example

```json
{
  "companies": [
    "https://boards.greenhouse.io/stripe",
    "https://jobs.ashbyhq.com/linear",
    "octoenergy"
  ],
  "platform": "auto",
  "keywords": [],
  "remoteOnly": false,
  "includeDescription": true,
  "maxJobsPerCompany": 0
}
```

# 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",
        "https://jobs.ashbyhq.com/linear",
        "octoenergy"
    ],
    "keywords": [],
    "locationFilter": ""
};

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

# Run the Actor and wait for it to finish
run = client.actor("igor_nersisian/multi-ats-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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",
    "https://jobs.ashbyhq.com/linear",
    "octoenergy"
  ],
  "keywords": [],
  "locationFilter": ""
}' |
apify call igor_nersisian/multi-ats-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=igor_nersisian/multi-ats-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/yfeuNWCkSlI34aXex/builds/qkHeJbSmshz3htWnI/openapi.json
