Multi-ATS Jobs Scraper: Greenhouse, Lever, Ashby avatar

Multi-ATS Jobs Scraper: Greenhouse, Lever, Ashby

Pricing

from $1.58 / 1,000 results

Go to Apify Store
Multi-ATS Jobs Scraper: Greenhouse, Lever, Ashby

Multi-ATS Jobs Scraper: Greenhouse, Lever, Ashby

Scrape jobs from Greenhouse, Lever, Ashby, Workable, Recruitee and SmartRecruiters career pages in one unified dataset. ATS auto-detected from a URL or company name. Salary, location, remote, department, posted date, description. No login. $1.75 per 1,000 jobs.

Pricing

from $1.58 / 1,000 results

Rating

0.0

(0)

Developer

Joe Pena

Joe Pena

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 hours ago

Last modified

Features

Limited permissions

Share

What is Multi-ATS Jobs Scraper?

Multi-ATS Jobs Scraper is one job scraper for company career pages on Greenhouse, Lever, Ashby, Workable, Recruitee and SmartRecruiters. Paste careers-page URLs or company names. It auto-detects the applicant tracking system (ATS) and returns every open job in one unified format: title, location, remote flag, salary range, department, employment type, posted date, apply URL and full description.

It reads each ATS's official public job-board feed. So there's no login, no API key, no proxies and no browser, and runs are fast and cheap. If you only need Greenhouse, the Greenhouse Jobs Scraper is a little cheaper.

Supported ATS platforms

ATSExample input
Greenhouse jobshttps://job-boards.greenhouse.io/stripe or airbnb
Lever jobs (US and EU)https://jobs.lever.co/spotify
Ashby jobshttps://jobs.ashbyhq.com/ramp
Workable jobshttps://apply.workable.com/huggingface
Recruitee jobshttps://bunq.recruitee.com
SmartRecruiters jobshttps://jobs.smartrecruiters.com/BoschGroup

Bare names such as notion are tried on each ATS in turn. You can force one with a prefix, e.g. lever:palantir.

What data can you extract?

Every job, whatever the ATS, has the same fields: jobId, title, company, companySlug, ats, url, location, isRemote, workplaceType, departments, offices, employmentType, postedAt, updatedAt, salaryMin, salaryMax, salaryCurrency, salaryInterval, salarySource, requisitionId, description, scrapedAt.

Features

  • 🔀 Unified schema across 6 ATS, so you never write per-platform parsers again
  • 🧭 ATS auto-detection from a careers URL or a bare company name
  • 🔎 Filters: title keywords, excluded words, location, remote only, posted within N days, per-company and total limits
  • 💰 Salary data: structured pay ranges from Lever, Ashby and Recruitee, plus pay-transparency ranges parsed from descriptions
  • 🧾 Plain-text descriptions ready for LLMs and search
  • ⚠️ SUMMARY record lists every company, the detected ATS, and whether it was found
  • 🔔 Monitor mode: only jobs that are new since the last run, for scheduled alerts
  • 🔁 Scheduling, API, webhooks, and integrations with Google Sheets, Slack, Make, Zapier and more

How to scrape Lever, Ashby and Greenhouse jobs

  1. Add companies as careers-page URLs or names.
  2. Optionally set keywords, locations, Remote jobs only or Posted within last N days.
  3. Click Start, then export from the Output tab (JSON, CSV, Excel) or use the API.

Input example

{
"companies": ["https://jobs.lever.co/spotify", "https://jobs.ashbyhq.com/ramp", "airbnb", "notion"],
"keywords": ["engineer", "data"],
"postedWithinDays": 7,
"maxItems": 2000
}

Output example

{
"title": "Risk Operations Specialist, Onboarding",
"company": "ramp",
"companySlug": "ramp",
"ats": "ashby",
"location": "New York, NY (HQ)",
"isRemote": true,
"employmentType": "FullTime",
"salaryMin": 100000,
"salaryMax": 155000,
"salaryCurrency": "USD",
"salaryInterval": "year",
"salarySource": "ats",
"postedAt": "2026-11-12T01:19:57.296000+00:00",
"url": "https://jobs.ashbyhq.com/ramp/55bd9ab4-8edc-4493-b577-4277ad2f9ae6"
}

Monitor mode: only new jobs since the last run

Turn on Only new jobs since last run (onlyNew: true) and the Actor remembers every job it has returned for that search. The next run returns only jobs it hasn't returned before, so you pay only for new results.

  • The first run returns everything that currently matches and saves it as the baseline.
  • Seen IDs are stored in a named key-value store in your Apify account (data-factory-ats-monitor), one record per search. The record name comes from your search filters, so different searches keep separate histories.
  • Want to keep one history while you adjust filters? Set Monitor name (monitorKey), e.g. "daily-alert".
  • To start over, delete that record (or the whole store) in Storage → Key-value stores.

Schedule it for daily alerts

  1. Configure your search, turn on Only new jobs since last run, and save it as a task.
  2. Create an Apify Schedule for that task (daily or hourly).
  3. Add an integration (Slack, email, Google Sheets, Zapier, Make or a webhook) to push each run's new jobs where your team works.
{ "companies": ["https://jobs.lever.co/palantir", "https://jobs.ashbyhq.com/ramp", "stripe"], "remoteOnly": true, "onlyNew": true, "maxItems": 500 }

How much does it cost to scrape ATS jobs?

Pay-per-result: $1.75 per 1,000 jobs ($0.00175 per job), whichever ATS they come from. You pay only for jobs saved to the dataset.

  • 1,000 jobs = $1.75
  • 10,000 jobs = $17.50
  • Apify's free plan includes $5 of monthly usage, which covers roughly 2,800 jobs with this Actor.

Tip: SmartRecruiters descriptions need one extra request per job. Turn off Include full job description for the fastest SmartRecruiters runs.

Use cases

  • Build a job board or job aggregator from hundreds of startup career pages
  • Sales prospecting and lead generation: find companies hiring for roles that signal they need your product
  • Recruiting intelligence: monitor competitors' hiring by department and location
  • Salary benchmarking with pay-transparency data
  • Daily job alerts with Apify Schedules plus Slack, Google Sheets or Zapier

Run it from your code (API)

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("data_factory_nerd/ats-jobs-scraper").call(
run_input={"companies": ["https://jobs.lever.co/spotify", "ramp"], "maxItems": 500}
)
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
print(job["ats"], job["company"], job["title"])

FAQ

The Actor reads only job postings that employers publish on public career-page feeds. It doesn't log in and doesn't collect candidate data. Use the data in line with the laws that apply to you.

A company isn't found. Why?

It may use an ATS that isn't supported yet (for example Workday or iCIMS), or a different slug. Paste the exact careers-page URL and check the SUMMARY record.

Do you support Workday?

Not yet. Open an issue on the Issues tab if you need it; requests decide what we build next.

How do I get only new jobs?

Turn on Only new jobs since last run and schedule a daily run (see Monitor mode above). Each run returns only jobs you haven't seen before, across all 6 ATS.

ActorWhat it does
Greenhouse Jobs ScraperGreenhouse-only, $1.50 per 1,000 jobs
SAM.gov Contract Opportunities ScraperUS federal contract opportunities with NAICS, set-aside, deadlines and contacts