# Job Board Scraper: Greenhouse, Lever & Ashby Jobs API (`f0rty7even/ats-jobs-scraper`) Actor

Scrape and aggregate open jobs from any company's Greenhouse, Lever, or Ashby board into one unified, structured dataset. Filter by keyword, niche, location, and remote. Public data, no login.

- **URL**: https://apify.com/f0rty7even/ats-jobs-scraper.md
- **Developed by:** [Michael Yousrie](https://apify.com/f0rty7even) (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 $10.00 / 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/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

## Job Board Scraper — Greenhouse, Lever & Ashby Jobs API

**Scrape open jobs from any company's careers page — across three major ATS platforms — into one clean, structured dataset.** This **job board scraper** pulls live postings from **Greenhouse**, **Lever**, and **Ashby** boards, normalizes them into a single unified schema, and filters by **keyword, niche, location, and remote** — so you get exactly the roles you care about, from every company you track, in one run.

Most scrapers do one platform and dump raw fields. This one **aggregates all three** and gives you consistent, ready-to-use job data.

### Why this actor

- **Multi-ATS in one** — mix Greenhouse, Lever, and Ashby boards in a single input; get one unified output schema.
- **Niche filtering** — keep only the roles matching your keywords (e.g. `engineer`, `data`, `designer`), location, or remote status.
- **Clean, public data** — powered by each platform's official public JSON API. No login, no anti-bot workarounds, no personal data.
- **Structured output** — title, location, department, team, employment type, salary (where available), apply URL, and description per job.

### Use cases

- **Recruiters / sourcers** — monitor competitor and target-company hiring in a niche.
- **Job seekers** — build a filtered feed of roles across your favorite companies.
- **Market research** — track hiring trends, team growth, and locations across an industry.
- **ATS / job-board builders** — ingest normalized postings from many companies at once.

### Input

| Field | Description |
|---|---|
| `boards` | Company boards to scrape — board URLs (Greenhouse/Lever/Ashby) or `platform:slug` (e.g. `greenhouse:stripe`). |
| `keywords` | Keep only jobs whose title matches ANY keyword (empty = all). |
| `keywordsInDescription` | Also search the description, not just the title. |
| `location` | Keep only jobs whose location contains this text. |
| `remoteOnly` | Keep only remote-flagged jobs. |
| `maxJobsPerBoard` | Cap on matching jobs per board (main cost lever). |

**Finding a board slug:** it's the company name in the careers URL — `boards.greenhouse.io/`**`stripe`**, `jobs.lever.co/`**`spotify`**, `jobs.ashbyhq.com/`**`ramp`**.

### Output

Each matching job becomes one dataset item, unified across platforms:

```json
{
  "company": "ramp",
  "platform": "ashby",
  "title": "Software Engineer, Platform",
  "location": "Remote (US)",
  "remote": true,
  "department": "Engineering",
  "team": "Platform",
  "employmentType": "FullTime",
  "description": "About Ramp ... (plain text)",
  "salary": { "min": 180000, "max": 240000, "currency": "USD" },
  "url": "https://jobs.ashbyhq.com/ramp/....",
  "publishedAt": "2026-07-07T20:47:09Z",
  "jobId": "https://jobs.ashbyhq.com/ramp/....",
  "sourceBoard": "ashby:ramp"
}
```

### Pricing

Pay-per-result: you're charged **per matching job returned** — no monthly fee, and no charge for boards that can't be fetched or return nothing.

### Notes

- Supports **Greenhouse**, **Lever**, and **Ashby** boards (the three most common public-API ATS platforms). More platforms are on the roadmap.
- Reads **public, published job postings** only — it does not log in or submit applications.
- A board slug that has moved off the platform (or is private) returns an error record, not a charge.

### FAQ

**Which platforms are supported?** Greenhouse, Lever, and Ashby. Paste any mix of their board URLs.

**How do I filter to a niche?** Use `keywords` (e.g. `["machine learning", "data"]`) and optionally `keywordsInDescription`, `location`, and `remoteOnly`.

**What formats can I export?** JSON, JSONL, CSV, or Excel, or via the Apify API.

# Actor input Schema

## `boards` (type: `array`):

Company career boards to scrape. Paste board URLs (Greenhouse, Lever, or Ashby) or use platform:slug shorthand, e.g. `https://jobs.lever.co/spotify` or `greenhouse:stripe`.

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

Only keep jobs whose title matches ANY of these keywords (case-insensitive). Leave empty to keep all jobs.

## `keywordsInDescription` (type: `boolean`):

Also search the job description, not just the title.

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

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

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

Only keep jobs flagged as remote.

## `maxJobsPerBoard` (type: `integer`):

Cap on matching jobs returned per board (main cost lever).

## Actor input object example

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

# Actor output Schema

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

One normalized job per matching posting. Export as JSON, JSONL, CSV, or Excel.

# 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 = {
    "boards": [
        "https://boards.greenhouse.io/stripe",
        "https://jobs.lever.co/spotify",
        "https://jobs.ashbyhq.com/ramp"
    ],
    "keywords": [
        "engineer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("f0rty7even/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 = {
    "boards": [
        "https://boards.greenhouse.io/stripe",
        "https://jobs.lever.co/spotify",
        "https://jobs.ashbyhq.com/ramp",
    ],
    "keywords": ["engineer"],
}

# Run the Actor and wait for it to finish
run = client.actor("f0rty7even/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 '{
  "boards": [
    "https://boards.greenhouse.io/stripe",
    "https://jobs.lever.co/spotify",
    "https://jobs.ashbyhq.com/ramp"
  ],
  "keywords": [
    "engineer"
  ]
}' |
apify call f0rty7even/ats-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/cAIekwnPCoxUnBDkS/builds/4pg3duK7GKC7XSXyI/openapi.json
