# ATS Jobs Aggregator: Greenhouse, Lever, Ashby, Workable (`kempt_horizon_yzk/jobs-ats-aggregator`) Actor

Pull job postings straight from company job boards on Greenhouse, Lever, Ashby and Workable public APIs. One normalized format with salary, remote flag, department, posted date and apply URL. Auto-detect boards from careers pages. Monitor mode returns only new jobs. $0.0005/job.

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

## Pricing

$0.50 / 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

## ATS Jobs Aggregator: Greenhouse, Lever, Ashby & Workable Job Postings API

Get **job postings straight from the source**: the public job-board APIs of **Greenhouse, Lever, Ashby and Workable**, the applicant tracking systems behind the careers pages of tens of thousands of startups and tech companies. Give it company slugs, board URLs or just a company's careers page, and get every open role in **one normalized format**: title, company, location, remote flag, **salary when the company publishes it**, department, team, employment type, posted date and apply URL. Turn on **monitor mode** and a daily schedule returns only new postings.

No LinkedIn or Indeed scraping, no login, no proxies. These are the official public endpoints each ATS provides for showing jobs on company sites.

### For AI agents (MCP / API) quick reference

- **Use when:** you need current open jobs at specific companies, new postings since the last check, hiring signals for sales prospecting, or salary ranges from pay-transparent job posts.
- **Don't use for:** LinkedIn/Indeed search across all employers, companies on Workday, iCIMS, SmartRecruiters or other ATSs, or candidate data.
- **Minimal input:** `{"companies": ["greenhouse:airbnb", "lever:spotify"], "maxItems": 20}`.
- **Output:** one dataset item per job: `jobId`, `title`, `company`, `location`, `locations`, `country`, `remote`, `workplaceType`, `employmentType`, `department`, `team`, `salary` (`min`, `max`, `currency`, `interval`, `text`), `postedAt`, `updatedAt`, `applyUrl`, `jobUrl`, `description` (optional), `source`.
- **Price:** **$0.0005 per job**, no start fee. 1,000 jobs cost $0.50. Pay per event only, limited permissions, so agentic payments (x402, Skyfire, Apify AGI token) work.
- **MCP:** add `https://mcp.apify.com?tools=kempt_horizon_yzk/jobs-ats-aggregator` to your MCP client.

### What can this jobs aggregator do?

- ✅ **Four ATS sources** in one schema: Greenhouse, Lever, Ashby, Workable
- ✅ **Board discovery**: paste a company's careers page and the Actor finds the ATS board it links to or embeds
- ✅ **Salary ranges** where published (Greenhouse pay transparency, Lever salary range, Ashby compensation)
- ✅ **Filters**: title keywords, locations, departments, remote only, posted within N days
- ✅ **Monitor mode**: remembers jobs in a key-value store and returns only new postings
- ✅ Bad slugs are reported in the run summary and don't fail the run

### Who uses it?

Recruiters and sourcing teams, job boards and newsletters, sales teams using hiring as a buying signal, investors tracking headcount growth, salary researchers, and AI job-search agents.

### How much does it cost?

| Event | Price |
|---|---|
| Job posting | **$0.0005** |

Watching 50 companies daily with monitor mode on usually costs a few cents a day, because you only pay for new postings.

### How to use it

1. Click **Try for free** with the example boards.
2. Add your companies as `ats:slug` (the slug is the last part of the board URL, e.g. `jobs.lever.co/**spotify**`), or paste careers page URLs.
3. Add filters, then tick **Only new since last run** and add a daily **Schedule** for alerts to Slack, email, Zapier or Make.

### Input example

```json
{
  "companies": ["greenhouse:airbnb", "lever:spotify", "ashby:ramp", "https://apply.workable.com/blueground/"],
  "careersPages": ["https://www.notion.com/careers"],
  "titleKeywords": ["engineer", "data"],
  "locations": ["United States", "Remote"],
  "postedWithinDays": 14,
  "maxItems": 500,
  "onlyNew": true,
  "stateKey": "eng-jobs-watch"
}
```

### Output example

```json
{
  "jobId": "greenhouse:airbnb:8238604",
  "title": "Engineering Manager, Guest & Host (Host Listings & Quality)",
  "company": "Airbnb",
  "companySlug": "airbnb",
  "location": "United States",
  "locations": [
    "United States"
  ],
  "country": null,
  "remote": true,
  "workplaceType": "Remote",
  "employmentType": null,
  "department": "Software Engineering",
  "team": null,
  "salary": {
    "min": 212000,
    "max": 265000,
    "currency": "USD",
    "interval": "year",
    "text": "Pay Range"
  },
  "postedAt": "2026-09-29T17:12:47.000Z",
  "updatedAt": "2026-09-30T00:00:54.000Z",
  "applyUrl": "https://careers.airbnb.com/positions/8238604?gh_jid=8238604",
  "jobUrl": "https://careers.airbnb.com/positions/8238604?gh_jid=8238604",
  "description": null,
  "source": "greenhouse",
  "scrapedAt": "2026-10-15T14:00:48.941Z"
}
```

### FAQ

**Is this allowed?** Yes, for these four. Greenhouse, Lever, Ashby and Workable publish these job-board endpoints so companies can show their open jobs anywhere; Lever's docs state published postings are public and may be read by third parties, and robots.txt allows the endpoints. **SmartRecruiters is not included** because its API host's robots.txt disallows all crawlers except LinkedIn.

**How do I find a company's slug?** Open their careers page and look for boards.greenhouse.io/<slug>, jobs.lever.co/<slug>, jobs.ashbyhq.com/<slug> or apply.workable.com/<slug>, or just put the careers page URL in "Careers pages to auto-detect".

**Why is salary empty?** The company didn't publish a range on that posting.

Built and maintained by **Kempt Horizon Data**. Found a bug or need a field? Open an issue on the Actor's Issues tab and we usually reply within a day. Not affiliated with Greenhouse, Lever, Ashby or Workable.

# Actor input Schema

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

ATS:slug pairs (greenhouse:airbnb, lever:spotify, ashby:ramp, workable:blueground) or board URLs (boards.greenhouse.io/x, jobs.lever.co/x, jobs.ashbyhq.com/x, apply.workable.com/x).

## `careersPages` (type: `array`):

Optional company careers page URLs, e.g. https://www.notion.com/careers. The Actor finds the Greenhouse, Lever, Ashby or Workable board linked or embedded there.

## `titleKeywords` (type: `array`):

Optional. Keep jobs whose title contains any of these, e.g. engineer, product manager.

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

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

## `departments` (type: `array`):

Optional. Matches department or team, e.g. Engineering, Sales.

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

Only jobs marked remote.

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

Optional.

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

Adds plain-text descriptions (bigger output, same price).

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

Maximum jobs to save (and pay for) per run.

## `onlyNew` (type: `boolean`):

Remembers jobs already returned for the same boards and filters (or monitor name) in a key-value store and returns only new postings.

## `stateKey` (type: `string`):

Optional name for the monitor state.

## Actor input object example

```json
{
  "companies": [
    "greenhouse:airbnb",
    "lever:spotify",
    "ashby:ramp",
    "workable:blueground"
  ],
  "remoteOnly": false,
  "includeDescription": false,
  "maxItems": 20,
  "onlyNew": false
}
```

# Actor output Schema

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

No description

## `all` (type: `string`):

No description

## `summary` (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": [
        "greenhouse:airbnb",
        "lever:spotify",
        "ashby:ramp",
        "workable:blueground"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("kempt_horizon_yzk/jobs-ats-aggregator").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": [
        "greenhouse:airbnb",
        "lever:spotify",
        "ashby:ramp",
        "workable:blueground",
    ],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("kempt_horizon_yzk/jobs-ats-aggregator").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": [
    "greenhouse:airbnb",
    "lever:spotify",
    "ashby:ramp",
    "workable:blueground"
  ],
  "maxItems": 20
}' |
apify call kempt_horizon_yzk/jobs-ats-aggregator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kempt_horizon_yzk/jobs-ats-aggregator"
        }
    }
}
```

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/hCoJ7KSazsSzOVdbV/builds/XCe9Dpwfas0zcYKf9/openapi.json
