# Greenhouse, Lever, Ashby & Workable Jobs Scraper (7 ATS) (`aaronallday89/ats-job-board-scraper`) Actor

Scrape every open job from Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee and Personio in one unified format: title, department, locations, remote/hybrid, salary, posted date, apply URL and description. Official public APIs, no login, no proxies. $1 per 1,000 jobs.

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

## Pricing

from $0.70 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 & Workable Jobs Scraper (7 ATS)

**Who it's for:** Job boards and aggregators, recruiters, sales teams prospecting on hiring signals, and market researchers.

**The problem it solves:** Startups and tech companies post jobs on their ATS careers pages, often before LinkedIn, and each ATS uses a different format. This Actor pulls them from seven ATS platforms' official feeds into one identical schema.

**Use cases:**

- Power a niche job board or job alerts
- Sales prospecting: find companies hiring for a given role
- Hiring-velocity and competitor intelligence
- Salary benchmarking from published ranges

**Quick example:** `{"companies":["greenhouse:airbnb","lever:spotify","ramp"],"titleKeywords":["engineer"]}` → one row per job: `title`, `department`, `allLocations`, `workplaceType`/`isRemote`, `salaryMin`/`salaryMax`, `postedAt`, `applyUrl`, `descriptionText`.

**Price:** **$1.00 per 1,000 jobs** on the Free plan, lower on paid plans. Comparable Greenhouse/Lever/Ashby scrapers in the Store charge $1.50 to $2.00 per 1,000 jobs, and most cover fewer platforms.

Get **every open job from any company that hires through Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee or Personio**, in **one unified format**: title, department, team, all locations, remote/hybrid/onsite, employment type, **salary range** (when the company publishes it), posted date, job and apply URLs, and the full description as clean text.

It uses the seven platforms' **official public job-board APIs and feeds**, the same feeds that power the companies' own careers pages. That means no login, no proxies and no browser. It's fast (about 400 jobs in under 5 seconds), cheap and very reliable.

#### Want alerts instead of scraping?

HiringPing emails or Slacks you when target companies post new jobs matching your filters — free plan for 3 companies. [Get alerts](https://hiringping.hiringping.workers.dev)

### Why use it

- **One schema for seven ATSs.** Mix Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee and Personio companies in one run and get identical columns.
- **Paste anything:** a careers-page URL, `greenhouse:airbnb`, or just `ramp`. Bare slugs are checked against all seven platforms automatically (the board with the most jobs wins; use `ats:slug` to force one).
- **Salary data:** structured min / max / currency / interval from Ashby, Lever and Recruitee when published.
- **Strong in Europe:** Workable, Recruitee and Personio power thousands of EU/UK startups and SMBs that the US-centric scrapers miss.
- **Filters:** title keywords (include / exclude), locations, departments, remote only, posted within N days, and per-company or total caps.
- **Built for monitoring:** schedule daily runs and track new roles, hiring velocity or which companies are hiring for a given role.

### Use cases

Job boards and aggregators · recruiting and sourcing pipelines · sales prospecting ("companies hiring data engineers") · market and competitor intelligence · salary benchmarking · alerts for your dream companies.

### Input

| Field | Default | Description |
|---|---|---|
| `companies` | `greenhouse:airbnb`, `lever:spotify`, `ashby:ramp` | Job board URLs, `ats:slug`, or bare slugs |
| `titleKeywords` | – | Keep titles containing any of these words |
| `excludeTitleKeywords` | – | Drop titles containing any of these words |
| `locations` | – | Keep jobs where any location contains one of these strings |
| `departments` | – | Keep jobs whose department or team matches |
| `remoteOnly` | false | Only jobs the ATS marks as remote or remote-eligible |
| `postedWithinDays` | 0 | Only recent jobs (0 = any) |
| `maxJobsPerCompany` / `maxJobs` | 0 | Caps (0 = no limit) |
| `includeDescription` | true | Plain-text description (SmartRecruiters needs one extra request per saved job, so turning it off makes huge SmartRecruiters boards faster) |
| `includeDescriptionHtml` | false | Original HTML description |

Accepted URL formats include `boards.greenhouse.io/<slug>`, `job-boards.greenhouse.io/<slug>`, `boards.greenhouse.io/embed/job_board?for=<slug>`, `jobs.lever.co/<slug>`, `jobs.eu.lever.co/<slug>` `jobs.ashbyhq.com/<slug>`, `apply.workable.com/<slug>`, `<slug>.workable.com`, `jobs.smartrecruiters.com/<CompanyId>`, `careers.smartrecruiters.com/<CompanyId>`, `<slug>.recruitee.com` and `<slug>.jobs.personio.de` / `.com`. Explicit prefixes: `greenhouse:`, `lever:`, `ashby:`, `workable:`, `smartrecruiters:`, `recruitee:`, `personio:`.

```json
{
  "companies": ["https://boards.greenhouse.io/stripe", "https://jobs.lever.co/palantir", "openai", "workable:blueground", "https://bunq.recruitee.com", "personio:1komma5grad"],
  "titleKeywords": ["engineer"],
  "excludeTitleKeywords": ["intern"],
  "locations": ["remote", "new york", "london"],
  "postedWithinDays": 30
}
```

### Output

These are real items from the default run on 10 Oct 2026 (descriptions shortened here):

```json
[
{
  "ats": "ashby",
  "company": "ramp",
  "companyName": null,
  "jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "title": "Security Engineer, Cloud",
  "department": "Engineering",
  "team": "Backend",
  "location": "New York, NY (HQ)",
  "allLocations": ["New York, NY (HQ)", "Remote (Canada)", "Remote (US)", "Miami, FL"],
  "workplaceType": "hybrid",
  "isRemote": true,
  "employmentType": "FullTime",
  "postedAt": "2026-04-07T17:12:35.753Z",
  "updatedAt": null,
  "jobUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
  "salaryMin": 211400,
  "salaryMax": 290600,
  "salaryCurrency": "USD",
  "salaryInterval": "year",
  "salaryText": "$211.4K - $290.6K",
  "descriptionText": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams, embedded in the transaction flow of every dollar a business spends. We automate how ove…",
  "inputCompany": "ashby:ramp",
  "scrapedAt": "2026-10-10T17:31:59.341Z"
},
{
  "ats": "greenhouse",
  "company": "airbnb",
  "companyName": "Airbnb",
  "jobId": "8184174",
  "title": "Account Manager",
  "department": "Business Development",
  "team": null,
  "location": "London, United Kingdom",
  "allLocations": ["London, United Kingdom"],
  "workplaceType": "hybrid",
  "isRemote": false,
  "employmentType": null,
  "postedAt": "2026-09-09T08:35:19.000Z",
  "updatedAt": "2026-09-30T00:00:54.000Z",
  "jobUrl": "https://careers.airbnb.com/positions/8184174?gh_jid=8184174",
  "applyUrl": "https://careers.airbnb.com/positions/8184174?gh_jid=8184174",
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryInterval": null,
  "salaryText": null,
  "descriptionText": "Airbnb was born in 2007 when two hosts welcomed three guests to their San Francisco home, and has since grown to over 5 million hosts who have welcomed over 2 b…",
  "inputCompany": "greenhouse:airbnb",
  "scrapedAt": "2026-10-10T17:31:59.341Z"
}
]
```

Items from the new platforms, from a cloud run on 10 Oct 2026 (descriptions shortened, 5 jobs per company):

```json
[
  {
    "ats": "workable",
    "company": "blueground",
    "companyName": "Blueground",
    "jobId": "186545F8C1",
    "title": "Client Experience Coordinator (English & Greek Speaker) - Talent Pool",
    "department": "Shared Services",
    "team": "Customer Service",
    "location": "Athens, Attica, Greece",
    "allLocations": [
      "Athens, Attica, Greece"
    ],
    "workplaceType": null,
    "isRemote": false,
    "employmentType": "Full-time",
    "postedAt": "2026-02-12T00:00:00.000Z",
    "updatedAt": null,
    "jobUrl": "https://apply.workable.com/j/186545F8C1",
    "applyUrl": "https://apply.workable.com/j/186545F8C1/apply",
    "salaryMin": null,
    "salaryMax": null,
    "salaryCurrency": null,
    "salaryInterval": null,
    "salaryText": null,
    "descriptionText": "🌍 Redefining how people live. At Blueground, we believe that when your base is reliable, the world opens up. That’s why we’re building the w…",
    "inputCompany": "https://apply.workable.com/blueground",
    "scrapedAt": "2026-10-10T17:59:42.282Z"
  },
  {
    "ats": "smartrecruiters",
    "company": "BoschGroup",
    "companyName": "Bosch Group",
    "jobId": "744000154830680",
    "title": "APONTADOR DE PRODUÇÃO (36158)",
    "department": null,
    "team": "Production",
    "location": "Curitiba, PR, Brazil",
    "allLocations": [
      "Curitiba, PR, Brazil"
    ],
    "workplaceType": "onsite",
    "isRemote": false,
    "employmentType": "Full-time",
    "postedAt": "2026-10-10T14:19:07.559Z",
    "updatedAt": null,
    "jobUrl": "https://jobs.smartrecruiters.com/BoschGroup/744000154830680-apontador-de-producao-36158-",
    "applyUrl": "https://jobs.smartrecruiters.com/BoschGroup/744000154830680-apontador-de-producao-36158-?oga=true",
    "salaryMin": null,
    "salaryMax": null,
    "salaryCurrency": null,
    "salaryInterval": null,
    "salaryText": null,
    "descriptionText": "Descrição da empresa Na Bosch, moldamos o futuro por meio das inovações tecnológicas de alta qualidade e de serviços que despertam entusiasm…",
    "inputCompany": "smartrecruiters:BoschGroup",
    "scrapedAt": "2026-10-10T17:59:42.282Z"
  },
  {
    "ats": "recruitee",
    "company": "bunq",
    "companyName": "bunq",
    "jobId": "2771751",
    "title": "Deputy AML Manager - Belgium",
    "department": null,
    "team": null,
    "location": "Brussels, Brussels, Belgium",
    "allLocations": [
      "Brussels, Brussels, Belgium"
    ],
    "workplaceType": "hybrid",
    "isRemote": false,
    "employmentType": "fulltime permanent",
    "postedAt": "2026-10-05T16:05:18.000Z",
    "updatedAt": "2026-10-08T10:14:42.000Z",
    "jobUrl": "https://careers.bunq.com/o/deputy-aml-manager-belgium",
    "applyUrl": "https://careers.bunq.com/o/deputy-aml-manager-belgium/c/new",
    "salaryMin": null,
    "salaryMax": null,
    "salaryCurrency": null,
    "salaryInterval": null,
    "salaryText": null,
    "descriptionText": "Ready to Get Shit Done? At bunq, we're more than just a bank, we're transforming how people experience banking across Europe. Our users dese…",
    "inputCompany": "https://bunq.recruitee.com",
    "scrapedAt": "2026-10-10T17:59:42.282Z"
  },
  {
    "ats": "personio",
    "company": "1komma5grad",
    "companyName": "1KOMMA5° GmbH",
    "jobId": "2800938",
    "title": "(Junior) SEO & AI Marketing Manager (m/w/d)",
    "department": "Marketing",
    "team": "1K5° Holding Marketing",
    "location": "Berlin",
    "allLocations": [
      "Berlin",
      "Berlin (Remote)"
    ],
    "workplaceType": "remote",
    "isRemote": true,
    "employmentType": "permanent, full-time",
    "postedAt": "2026-09-17T07:57:12.000Z",
    "updatedAt": null,
    "jobUrl": "https://1komma5grad.jobs.personio.de/job/2800938",
    "applyUrl": "https://1komma5grad.jobs.personio.de/job/2800938#apply",
    "salaryMin": null,
    "salaryMax": null,
    "salaryCurrency": null,
    "salaryInterval": null,
    "salaryText": null,
    "descriptionText": "1KOMMA5° Bei 1KOMMA5° verfolgen wir eine Vision: Living on wind and sunlight forever for free. Dafür bauen wir mit Heartbeat AI das Energies…",
    "inputCompany": "https://1komma5grad.jobs.personio.de",
    "scrapedAt": "2026-10-10T17:59:42.282Z"
  }
]
```

Lever jobs have the same fields (for example Spotify: `"employmentType": "Permanent"`, `"allLocations": ["London", "Stockholm"]`). `isRemote` means the ATS marks the job as remote or remote-eligible. On Ashby that includes hybrid roles that also allow remote work. Fields a platform doesn't provide are `null`. For example, Greenhouse's public API has no structured salary.

The run summary (`SUMMARY` in the key-value store) lists boards found or missing and job counts for each company:

```json
{"companies": 3, "boardsFound": 3, "boardsMissing": [], "jobsTotal": 410, "jobsMatched": 410, "jobsSaved": 410}
```

### Pricing

**Pay per result: from $1.00 per 1,000 jobs** ($0.001 per job), lower on paid Apify plans:

| Apify plan | Price per 1,000 jobs |
|---|---|
| Free | $1.00 |
| Starter (Bronze) | $0.90 |
| Scale (Silver) | $0.80 |
| Business (Gold) and above | $0.70 |

You only pay for jobs saved to your dataset. Missing boards, filtered-out jobs, duplicates and errors are free. Set a **maximum cost per run** and the Actor stops cleanly when it reaches that limit. Example: all ~410 open jobs at Airbnb, Spotify and Ramp cost about $0.41 on the Free plan.

### Related Actors

More no-login, pay-per-result tools from the same developer:

- [Sitemap URL Extractor](https://apify.com/aaronallday89/sitemap-url-extractor): every URL from a website's sitemaps (indexes, gzip, RSS), with lastmod and priority.
- [Bulk PageSpeed Insights & Lighthouse Audit](https://apify.com/aaronallday89/pagespeed-bulk-audit): Lighthouse scores and Core Web Vitals for a list of URLs.
- [Whole-Site PageSpeed Audit (Sitemap → Lighthouse)](https://apify.com/aaronallday89/whole-site-pagespeed-audit): enter a homepage and get PageSpeed audits of its pages plus a site summary.
- [SEO Meta Tags & Structured Data Auditor](https://apify.com/aaronallday89/seo-meta-structured-data-auditor): titles, descriptions, canonical, noindex, Open Graph and Schema.org rich-result checks per URL.
- [Wayback Machine Snapshot Finder](https://apify.com/aaronallday89/wayback-snapshot-finder): archived snapshots, first/last capture and every archived URL of a domain.
- [Domain Health Checker: WHOIS, DNS & SSL](https://apify.com/aaronallday89/domain-health-checker): domain age and expiry, DNS/SPF/DMARC, SSL certificate and HTTPS redirects.

### FAQ

**How do I find a company's slug?**
Open their careers page and look at the job links. `boards.greenhouse.io/airbnb` means the slug is `airbnb`, and `jobs.ashbyhq.com/ramp` means it's `ramp`. You can paste the URL directly.

**A company isn't found.**
It may use a different ATS (Workday, iCIMS, Taleo and so on) or a custom slug. SmartRecruiters company IDs are case-sensitive (`BoschGroup`, not `bosch`). The run still succeeds, and the company is listed under `boardsMissing` in the summary.

**Is this allowed?**
Yes. These are the official public job-board APIs and XML feeds that each platform provides so companies can publish open roles. The Actor reads only public job postings and collects no candidate or personal data.

**How fresh is the data?**
It's live: every run reads the boards at that moment. Closed jobs disappear from the feeds immediately.

**What does each platform provide?**
All seven give title, location(s), posted date, job/apply URLs and the description. Department/team: all except some Recruitee boards. Structured salary: Ashby, Lever, Recruitee (when the company publishes it). Workplace type (remote/hybrid/onsite): Greenhouse (from location text), Ashby, SmartRecruiters, Recruitee; Workable and Personio only flag remote.

**Can I get only new jobs?**
Use `postedWithinDays` (for example 1 for a daily schedule), or compare `jobId`s between scheduled runs.

### More tools from the same developer

- [Sitemap URL Extractor: Get All URLs From Any Website](https://apify.com/aaronallday89/sitemap-url-extractor): SEO specialists, agencies, developers and data/AI teams
- [Bulk PageSpeed Insights Checker: Lighthouse & Core Web Vitals](https://apify.com/aaronallday89/pagespeed-bulk-audit): SEO agencies, web developers, site owners and performance teams
- [Whole-Site PageSpeed & Core Web Vitals Audit (via Sitemap)](https://apify.com/aaronallday89/whole-site-pagespeed-audit): SEO consultants, agencies and site owners
- [Bulk WHOIS, DNS & SSL Expiry Checker: Domain Health](https://apify.com/aaronallday89/domain-health-checker): IT admins, agencies managing client domains, email deliverability teams, domain investors and lead-enrichment workflows

# Actor input Schema

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

One per line. Accepts job board URLs (boards.greenhouse.io/airbnb, jobs.lever.co/spotify, jobs.ashbyhq.com/ramp, apply.workable.com/blueground, jobs.smartrecruiters.com/BoschGroup, bunq.recruitee.com, 1komma5grad.jobs.personio.de), explicit 'ats:slug' (greenhouse, lever, ashby, workable, smartrecruiters, recruitee, personio), or a bare slug like 'ramp' (auto-detects the ATS).

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

Keep jobs whose title contains at least one of these words (case-insensitive). Leave empty for all jobs.

## `excludeTitleKeywords` (type: `array`):

Drop jobs whose title contains any of these words, e.g. 'intern', 'senior'.

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

Keep jobs where any location contains one of these strings, e.g. 'London', 'Remote', 'United States'.

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

Keep jobs whose department or team contains one of these strings, e.g. 'Engineering'.

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

Keep only jobs marked remote by the ATS (or with 'Remote' in the location).

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

0 = any date. Jobs without a published date are kept.

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

0 = no limit.

## `maxJobs` (type: `integer`):

0 = no limit (the run's maximum cost still applies).

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

Full job description as clean text. (SmartRecruiters needs one extra request per job; turn off for faster, cheaper runs on huge SmartRecruiters boards.)

## `includeDescriptionHtml` (type: `boolean`):

Also include the original HTML description.

## `maxConcurrency` (type: `integer`):

Job boards fetched in parallel.

## Actor input object example

```json
{
  "companies": [
    "greenhouse:airbnb",
    "lever:spotify",
    "ashby:ramp"
  ],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "maxJobsPerCompany": 0,
  "maxJobs": 0,
  "includeDescription": true,
  "includeDescriptionHtml": false,
  "maxConcurrency": 5
}
```

# Actor output Schema

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

All matched job postings (default dataset, 'Jobs' view).

## `summary` (type: `string`):

JSON summary: boards found/missing, jobs total/matched/saved, per-company counts and errors.

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aaronallday89/ats-job-board-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": [
        "greenhouse:airbnb",
        "lever:spotify",
        "ashby:ramp",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("aaronallday89/ats-job-board-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": [
    "greenhouse:airbnb",
    "lever:spotify",
    "ashby:ramp"
  ]
}' |
apify call aaronallday89/ats-job-board-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aaronallday89/ats-job-board-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/YksDBDor8Mkyf9Ibp/builds/WDcFrmK4eedKs2b1a/openapi.json
