ATS Job Board Scraper: Greenhouse, Lever, Ashby, Workable avatar

ATS Job Board Scraper: Greenhouse, Lever, Ashby, Workable

Pricing

from $0.60 / 1,000 jobs

Go to Apify Store
ATS Job Board Scraper: Greenhouse, Lever, Ashby, Workable

ATS Job Board Scraper: Greenhouse, Lever, Ashby, Workable

Scrape every open job from Greenhouse, Lever, Ashby & Workable job boards in one run. Auto-detects the ATS from a company name or careers page. Normalized fields, salaries, remote flag, filters and a pay-only-for-new-jobs monitor mode.

Pricing

from $0.60 / 1,000 jobs

Rating

0.0

(0)

Developer

Hydro Core

Hydro Core

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 hours ago

Last modified

Share

ATS Job Board Scraper: Greenhouse, Lever, Ashby & Workable Jobs API

Get every open job from any company that hires through Greenhouse, Lever, Ashby or Workable, in one run, in one clean format, for about $1 per 1,000 jobs.

Paste company names, careers-page URLs or job-board links. The Actor detects which applicant tracking system (ATS) each company uses, reads the employer's official public job-board feed, and returns the same normalized fields for every job: title, department, location, remote flag, salary range, posted date, apply link and full description. Export to JSON, CSV or Excel, or pull it through the API.

⚡ In our test run on Apify, the default input (Airbnb, Spotify, Ramp and Hugging Face) returned 472 jobs in about 5 seconds at 256 MB memory.

✨ What does ATS Job Board Scraper do?

  • 🏢 Four ATS platforms, one schema: Greenhouse, Lever, Ashby and Workable all map to the same fields, so you don't have to merge four different formats.
  • 🔎 Auto-detects the ATS: give it ramp, lever:spotify or https://www.figma.com/careers/, and it finds the right job board.
  • 💰 Salary data: structured pay ranges when the ATS provides them, plus pay-transparency ranges parsed from the description (for example $212,000—$265,000 USD).
  • 🎯 Filters: title keywords, excluded words, locations, remote only, departments, posted within the last N days, max jobs per company and in total. Filtered-out jobs aren't saved, so they aren't charged.
  • 🔔 Monitoring mode (only new jobs): schedule it, and each run returns only postings you haven't received before. You pay only for new jobs.
  • 🤖 AI-ready: plain-text descriptions (or HTML, or both) that go straight into LLM, RAG and enrichment pipelines.

🧩 Supported job boards

ATSBoard URL formatPrefixed input
Greenhousehttps://job-boards.greenhouse.io/airbnb or boards.greenhouse.io/airbnbgreenhouse:airbnb
Leverhttps://jobs.lever.co/spotifylever:spotify
Ashbyhttps://jobs.ashbyhq.com/rampashby:ramp
Workablehttps://apply.workable.com/huggingfaceworkable:huggingface
Auto-detecta bare slug (ramp) or a company careers page (https://linear.app/careers)—

👥 Who is it for?

  • Recruiters and staffing agencies: see which target companies are hiring in your niche and when new roles open.
  • Job boards and newsletters: fill a niche board (remote, AI, climate, fintech…) straight from employer sources.
  • Sales and lead generation: hiring is a buying signal. "Company X just opened 5 data-engineering roles" → pitch your data tool.
  • Market research and investors: track hiring volume, departments, locations and pay ranges across companies.
  • AI agents and developers: one call returns structured job data, usable as a tool through the Apify API or MCP server.

⚙️ How it works

  1. Resolve: each input is matched to a job board. URLs and ats:slug inputs are used directly. Bare slugs are checked against all four ATSs (when a slug is found on more than one, the board with the most jobs wins and the others are listed in the run summary). Careers pages are scanned for an embedded Greenhouse, Lever, Ashby or Workable board.
  2. Fetch: the Actor reads each board's public JSON job feed, the same feed the employer's own careers page uses. There's no headless browser, no proxies and no login, which is why runs take seconds and cost little.
  3. Normalize and filter: every job is mapped to one schema, salaries are extracted, and your filters are applied.
  4. Save: matching jobs go to the dataset. A per-company RUN_SUMMARY (jobs on the board, matched, saved, plus any input that couldn't be resolved) is saved to the key-value store.

The Actor respects robots.txt (including Crawl-delay) and spaces requests to each host.

🏆 Why use this instead of a single-ATS scraper?

  • One tool, four ATSs: a mixed list of companies works in a single run with a single output format.
  • You don't need to know the ATS: auto-detection handles company names and careers pages.
  • Normalized schema: the same field names for remote flag, location, salary and dates on every ATS.
  • Built-in monitoring: the Only new jobs mode replaces your own deduplication logic.
  • Fast and light: public JSON feeds, no browser. In our test runs: 472 jobs in about 5 s; 35 jobs from 7 boards (with descriptions) in about 5 s.
  • Simple, tiered pricing: about $1.00 per 1,000 jobs, cheaper on higher Apify plans (see below).

📥 Input example

{
"companies": [
"https://job-boards.greenhouse.io/airbnb",
"lever:spotify",
"ramp",
"https://apply.workable.com/huggingface",
"https://www.figma.com/careers/"
],
"keywords": ["engineer", "data"],
"excludeKeywords": ["intern"],
"locations": ["Remote", "New York", "London"],
"postedWithinDays": 30,
"includeDescription": true,
"descriptionFormat": "text",
"onlyNewJobs": false
}

Only companies is required. Everything else is optional.

📤 Output example

Each job is one dataset item (a real Ashby job, description shortened):

{
"ats": "ashby",
"company": "Linear",
"companySlug": "Linear",
"jobId": "f272fc4a-91a7-4dcf-9cb5-3600ebaf14e1",
"title": "Analytics Engineer",
"department": "Operations",
"team": "Operations",
"employmentType": "FullTime",
"workplaceType": "Remote",
"isRemote": true,
"location": "North America",
"locations": ["North America"],
"country": "United States",
"salaryMin": 192000,
"salaryMax": 208000,
"salaryCurrency": "USD",
"salaryInterval": "1 YEAR",
"salaryText": "$192K - $208K",
"salarySource": "ats",
"url": "https://jobs.ashbyhq.com/Linear/f272fc4a-91a7-4dcf-9cb5-3600ebaf14e1",
"applyUrl": "https://jobs.ashbyhq.com/Linear/f272fc4a-91a7-4dcf-9cb5-3600ebaf14e1/application",
"publishedAt": "2026-08-11T00:36:47.459Z",
"updatedAt": null,
"descriptionText": "At Linear, we're building the product development system for teams and agents…",
"descriptionHtml": null,
"sourceInput": "https://linear.app/careers",
"scrapedAt": "2026-11-02T20:27:25.790Z"
}
FieldDescription
atsgreenhouse, lever, ashby or workable
company, companySlugCompany name and board slug
jobIdThe job's ID on its ATS
title, department, team, employmentTypeJob basics
workplaceType, isRemote, location, locations, countryWhere the job is
salaryMin, salaryMax, salaryCurrency, salaryInterval, salaryText, salarySourcePay range. salarySource is ats (structured) or description (parsed from the text, best effort)
url, applyUrlPosting and application links
publishedAt, updatedAtISO 8601 dates
descriptionText, descriptionHtmlFull description in the format you chose
sourceInput, scrapedAtWhich input produced the job, and when it was scraped

Fields an ATS doesn't provide are null.

💵 Pricing

Pay per event. You pay only for jobs saved to your dataset, and platform usage is included in the price.

EventFree planBronzeSilverGold / Platinum / Diamond
Job saved$0.0010$0.0009$0.0008$0.0006
Actor start (per run)$0.00005$0.00005$0.00005$0.00005

That's $1.00 per 1,000 jobs on the Free plan, down to $0.60 per 1,000 on Gold and above. Inputs that can't be resolved, errors, jobs removed by your filters and (in monitoring mode) jobs you've already received are never charged. The Actor also stops at your Max cost per run limit.

❓ FAQ

Is it legal to scrape job postings? The Actor reads only public job postings that employers publish on purpose so candidates, job boards and search engines can find them. It uses the ATS vendors' public job-board feeds, doesn't log in or bypass any protection, respects robots.txt, and collects no candidate or employee data. Job descriptions are the employer's content, so make sure your use (for example republishing full descriptions) fits your jurisdiction and the employer's terms. If unsure, link to url and show a short excerpt. This isn't legal advice.

Which companies can I scrape? Any company whose public job board is hosted on Greenhouse, Lever, Ashby or Workable. Many tech companies and startups use one of these four. Workday, SmartRecruiters, iCIMS and other ATSs aren't supported yet.

How do I find a company's slug or board URL? Open the company's careers page and click any job. If the link contains greenhouse.io, lever.co, ashbyhq.com or workable.com, paste that board URL. The slug is the part right after the domain (e.g. jobs.lever.co/spotify → spotify). You can also just try the company name; the Actor checks all four ATSs.

How does monitoring mode work? Turn on Only new jobs. The Actor remembers which job IDs it delivered (in a named key-value store, set by Monitoring memory name) and returns only jobs that are new since the last run. The first run returns all matching jobs. Use a different memory name for each watchlist.

How much will a run cost? Number of jobs saved × the price for your plan, plus $0.00005 per run. For example, 472 jobs ≈ $0.47 on the Free plan. A monitoring run that finds no new jobs costs only the start event. Use Max jobs per company, Max jobs in total or filters to control volume.

Can I schedule it? Yes. Save your input as a Task, then add a Schedule in Apify Console (e.g. daily at 8 AM). Combined with Only new jobs, that gives you a daily new-jobs feed.

Can I use it with the API, Zapier, Make, n8n or an AI agent? Yes. Run it through the Apify API or the JavaScript/Python clients, connect it with Apify's integrations (Zapier, Make, n8n, Google Sheets, Slack, webhooks), or call it as a tool from AI agents through the Apify MCP server.

What happens if a company can't be found? The run continues with the other companies. The unresolved input is logged with a warning and listed in RUN_SUMMARY with status not_found. Nothing is saved for it, so it's not charged. Paste the direct board URL to fix it.

Are there rate limits or blocking issues? The Actor uses public feeds, spaces requests to each host, follows Crawl-delay, and retries failed requests up to 3 times. It doesn't need proxies. Very large lists simply take a bit longer.

How fresh is the data? Live. Every run reads the employer's current job board.

I found a bug or need another ATS. Where do I ask? Open an issue on the Issues tab of this Actor. Requests for new ATSs are welcome.