# Greenhouse, Lever & Ashby Jobs Scraper API: Multi-ATS (`clearpathdata/multi-ats-job-postings`) Actor

Scrape every open job from Greenhouse, Lever, Ashby, Recruitee & Personio career pages in one schema. Salary, remote, apply links. Auto-detects the ATS. No login. $2 per 1,000 jobs.

- **URL**: https://apify.com/clearpathdata/multi-ats-job-postings.md
- **Developed by:** [Six Figure Salute](https://apify.com/clearpathdata) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 job returneds

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

## Greenhouse, Lever & Ashby Jobs Scraper API: Multi-ATS

Scrape every open job from Greenhouse, Lever, Ashby, Recruitee & Personio career pages in one schema. Salary, remote, apply links. Auto-detects the ATS. No login. $2 per 1,000 jobs.

### What does it do?

**Multi-ATS Job Postings** is a Greenhouse jobs scraper, Lever jobs scraper, Ashby jobs scraper, Recruitee and Personio job scraper in one. Paste company career page URLs (or slugs) and get every open job back in **one normalized schema**: title, department, location, remote flag, employment type, salary range (when published), posted date, full description and apply URL. It reads each ATS's official public job-board feed, so there is no login, no proxy, no browser and runs finish in seconds.

- ✅ Official public data source: no login, no cookies, no proxies
- ✅ Fast: plain API calls, typical runs finish in seconds
- ✅ Clean, flat JSON / CSV / Excel output, ready for Sheets, BI tools or AI agents
- ✅ Pay only for results: no monthly rental

### Use cases

- **Recruiters & sourcers:** monitor target companies' open roles and catch new reqs the day they post (use *Only new since last run* on a schedule).
- **Sales & GTM teams:** hiring signals. Which accounts are hiring SDRs, data engineers or a Head of Security right now?
- **Job boards & newsletters:** aggregate direct-from-employer postings with apply links, no LinkedIn or Indeed scraping.
- **Market & salary research:** compare departments, locations, remote share and published pay bands across companies.
- **AI agents & RAG:** feed clean JSON job data into LLM workflows via the API or Apify MCP server.

### How to use it

1. Click **Try for free**. The input is prefilled with a working example.
2. Edit the input (see examples below) and click **Start**.
3. Download results as JSON, CSV, Excel or HTML, or pull them via API.

### Input examples

**Monitor 3 companies, engineering roles only**

```json
{
  "companies": [
    "https://boards.greenhouse.io/stripe",
    "https://jobs.lever.co/spotify",
    "https://jobs.ashbyhq.com/ramp"
  ],
  "keywords": [
    "engineer"
  ]
}
```

**Daily new-jobs alert (schedule this)**

```json
{
  "companies": [
    "greenhouse:airbnb",
    "ashby:notion",
    "recruitee:bunq"
  ],
  "onlyNewSinceLastRun": true,
  "stateStoreName": "my-watchlist"
}
```

**Remote jobs in a location**

```json
{
  "companies": [
    "ashby:ramp",
    "lever:palantir"
  ],
  "remoteOnly": true,
  "locations": [
    "United States"
  ]
}
```

### Output

Sample rows:

| company | platform | title | department | location | remote | salaryMin | salaryMax | salaryCurrency | postedAt |
|---|---|---|---|---|---|---|---|---|---|
| ramp | ashby | Security Engineer, Cloud | Engineering | New York, NY (HQ) | False | 211400 | 290600 | USD | 2026-04-07T17:12:35.753+00:00 |
| spotify | lever | Art Director - Mexico | Markets and Subscriber Growth | Mexico City | False |  |  |  | 2026-10-09T17:15:08.174000Z |
| Stripe | greenhouse | Abuse Investigator | 8611 Security Analytics | Dublin |  |  |  |  | 2026-09-03T13:30:34-04:00 |
| Channable | recruitee | Senior Customer Success Manager Benelux | Customer Success | Utrecht, Utrecht, Netherlands | False | 3650 | 5000 | EUR | 2026-10-16 11:35:00 UTC |
| tado GmbH | personio | Team Lead Accounting (m/f/d) | Finance | Germany - Munich |  |  |  |  | 2026-01-22T09:48:25+00:00 |

Sample JSON record (long fields shortened):

```json
{
  "company": "ramp",
  "platform": "ashby",
  "jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "title": "Security Engineer, Cloud",
  "department": "Engineering",
  "location": "New York, NY (HQ)",
  "remote": false,
  "workplaceType": "hybrid",
  "employmentType": "FullTime",
  "salaryMin": 211400,
  "salaryMax": 290600,
  "salaryCurrency": "USD",
  "salaryPeriod": "1 YEAR",
  "salaryText": "$211.4K – $290.6K • Offers Equity",
  "postedAt": "2026-04-07T17:12:35.753+00:00",
  "descriptionText": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams, embedded in the transaction flow of every dollar a business spen...",
  "jobUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
  "companySlug": "ramp",
  "input": "https://jobs.ashbyhq.com/ramp",
  "scrapedAt": "2026-10-19T21:07:05Z",
  "found": true
}
```

### Pricing

Pay per event: **$0.002 per job** ($2.00 per 1,000). No start fee, no monthly rental. Rows for not-found inputs and errors are free.

| Results | Cost |
|---|---|
| 100 jobs | $0.20 |
| 1,000 jobs | $2.00 |
| 10,000 jobs | $20.00 |

Apify's free plan includes monthly platform credit, so you can try it at no cost.

### Integrations

- **Google Sheets:** use Apify's Google Sheets integration, or import the dataset CSV link with `=IMPORTDATA()`.
- **Zapier & Make:** trigger runs and receive the dataset via the official Apify apps.
- **Webhooks & schedules:** run daily or hourly and post results anywhere.
- **AI agents (MCP):** available to Claude, ChatGPT and other agents through the Apify MCP server.
- **API & SDKs:** call from Python, JavaScript or any HTTP client:

```bash
curl -X POST 'https://api.apify.com/v2/acts/clearpathdata~multi-ats-job-postings/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>' \
  -H 'Content-Type: application/json' \
  -d '{"companies": ["https://boards.greenhouse.io/stripe", "https://jobs.lever.co/spotify", "https://jobs.ashbyhq.com/ramp"], "keywords": ["engineer"]}'
```

### FAQ

**Which platforms are supported?**

Greenhouse (boards.greenhouse.io / job-boards.greenhouse.io), Lever (jobs.lever.co), Ashby (jobs.ashbyhq.com), Recruitee (*.recruitee.com) and Personio (*.jobs.personio.de/.com). Workable and other ATSs return a free `found: false` row.

**How do I find a company's ATS slug?**

Open the company's careers page and click a job. The URL shows the ATS, e.g. `jobs.lever.co/spotify/...` → `lever:spotify`, or `boards.greenhouse.io/stripe` → `greenhouse:stripe`. Paste the URL as-is, and the Actor detects it.

**Does it include salary?**

Yes, when the employer publishes it: Ashby and Recruitee expose structured pay ranges, and Lever when salary range is set. Greenhouse and Personio feeds don't include salary.

**How does *Only new since last run* work?**

Job IDs are stored in a named key-value store in your account. The next run returns and charges only jobs it hasn't seen. Use a different `stateStoreName` per watchlist.

**Can it search all companies on Greenhouse?**

No. These APIs are per-company. You supply the list of companies (it can be hundreds).

**Is this legal?**

It only reads public job-board endpoints that each ATS provides so companies can display their jobs, honors robots.txt and rate limits politely. Not affiliated with any ATS vendor.

**Something not working?**

Open an issue on the Actor's Issues tab, and it will be fixed quickly.

### More details

**Scrape-free job postings from five applicant tracking systems in one normalized dataset.** Paste company career page URLs; the platform is auto-detected and every job comes back in the same schema — ideal for recruiters, sourcers, job boards, sales-intelligence and hiring-trend analysis.

Uses only each platform's official, public job-board feed (the same feeds companies use to power their own careers pages): no login, no browser, no proxies.

| Platform | Source used | Example input |
|---|---|---|
| Greenhouse | Job Board API `boards-api.greenhouse.io/v1/boards/{token}/jobs` | `https://boards.greenhouse.io/stripe` |
| Lever | Postings API `api.lever.co/v0/postings/{company}` | `https://jobs.lever.co/spotify` |
| Ashby | Public Job Posting API `api.ashbyhq.com/posting-api/job-board/{name}` | `https://jobs.ashbyhq.com/ramp` |
| Recruitee | Careers Site API `{company}.recruitee.com/api/offers/` | `https://bunq.recruitee.com` |
| Personio | Job XML feed `{company}.jobs.personio.de/xml` | `https://tado.jobs.personio.de` |

#### Output (one schema for all platforms)

`company, companySlug, platform, jobId, title, department, location, remote, workplaceType, employmentType, salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryText, postedAt, descriptionText, jobUrl, applyUrl, scrapedAt`

Fields a platform doesn't publish are `null` (e.g. Greenhouse/Personio feeds don't include salary; Greenhouse has no structured remote flag, so `remote` is inferred from the location text).

#### Features

- **Auto-detect platform** from URLs, or use `platform:slug` (e.g. `lever:spotify`) or a `defaultPlatform` for bare slugs.
- **Filters:** keywords (title/department), locations, remote only, max jobs per company.
- **Only new since last run:** stores seen job IDs in a named key-value store, so scheduled runs return — and charge for — only new postings. Perfect for job alerts and hiring-signal monitoring.
- Unknown companies, and unsupported platforms such as Workable, return a free `found: false` row.

#### Pricing

Pay per event: **$0.002 per job** returned. No start fee; not-found rows and jobs filtered out are free.

#### Limits

- You supply the companies; these APIs have no cross-company search.
- Only public, listed postings. Custom-domain career pages must be given as their ATS URL/slug.
- Salary only where the employer publishes it (Lever, Ashby, Recruitee).
- Polite: one company at a time, ≥1s between requests (Lever Crawl-delay honored).

#### FAQ

**Is this legal?** It reads only public job-board endpoints each vendor provides for displaying jobs, and honors robots.txt. Not affiliated with Greenhouse, Lever, Ashby, Tellent/Recruitee or Personio.

# Actor input Schema

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

Career board URLs (boards.greenhouse.io/x, jobs.lever.co/x, jobs.ashbyhq.com/x, x.recruitee.com, x.jobs.personio.de) or 'platform:slug' (e.g. greenhouse:stripe). Bare slugs need defaultPlatform.

## `defaultPlatform` (type: `string`):

Used when an entry is just a slug like 'stripe'.

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

Keep jobs whose title or department contains any of these (case-insensitive).

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

Keep jobs whose location contains any of these (e.g. 'London', 'United States', 'Remote').

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

Only remote jobs.

## `onlyNewSinceLastRun` (type: `boolean`):

Remember job IDs in a named key-value store and only return (and charge for) jobs not seen in earlier runs. Great for schedules.

## `stateStoreName` (type: `string`):

Named key-value store used by new-only mode. Use different names for separate watchlists.

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

Include plain-text job description.

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

0 = no limit.

## Actor input object example

```json
{
  "companies": [
    "https://boards.greenhouse.io/stripe",
    "https://jobs.lever.co/spotify",
    "https://jobs.ashbyhq.com/ramp"
  ],
  "remoteOnly": false,
  "onlyNewSinceLastRun": false,
  "stateStoreName": "multi-ats-job-postings-state",
  "includeDescription": true,
  "maxJobsPerCompany": 10
}
```

# Actor output Schema

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

// Run the Actor and wait for it to finish
const run = await client.actor("clearpathdata/multi-ats-job-postings").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.lever.co/spotify",
        "https://jobs.ashbyhq.com/ramp",
    ],
    "maxJobsPerCompany": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("clearpathdata/multi-ats-job-postings").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/stripe",
    "https://jobs.lever.co/spotify",
    "https://jobs.ashbyhq.com/ramp"
  ],
  "maxJobsPerCompany": 10
}' |
apify call clearpathdata/multi-ats-job-postings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,clearpathdata/multi-ats-job-postings"
        }
    }
}
```

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/yp41aByUif26oYECe/builds/NGGIxHC7ZBo1NVRl3/openapi.json
