ATS Job Scraper: Greenhouse, Lever, Ashby, Workable +2 avatar

ATS Job Scraper: Greenhouse, Lever, Ashby, Workable +2

Pricing

from $1.00 / 1,000 jobs

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

ATS Job Scraper: Greenhouse, Lever, Ashby, Workable +2

Scrape job postings from Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee job boards in one schema. Paste any careers page and the ATS is auto-detected. $1 per 1,000 jobs.

Pricing

from $1.00 / 1,000 jobs

Rating

0.0

(0)

Developer

TechyMaki Labs

TechyMaki Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

20 hours ago

Last modified

Categories

Share

ATS Jobs: Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee

Pull every open job from a company's applicant tracking system (ATS) in one clean, identical format. Give it a board URL, an ats:slug pair such as greenhouse:airbnb, or just the company's own careers page. The actor detects which ATS the page uses.

Use it as a Greenhouse jobs scraper, Lever jobs scraper, Ashby jobs scraper, Workable jobs scraper, SmartRecruiters scraper or Recruitee scraper, or as one ATS scraper for a whole list of company careers pages. $1 per 1,000 jobs.

It calls each ATS's public JSON endpoint. It does not scrape HTML job pages, so it is fast and rarely breaks. It does not log in, use proxies, or bypass anything.

What you get

One item per job, the same fields for all six ATS. A field the ATS does not provide is null, never guessed.

{
"ats": "ashby",
"company": "ramp",
"jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"title": "Security Engineer, Cloud",
"department": "Engineering",
"team": "Backend",
"location": "New York, NY (HQ)",
"remote": true,
"employmentType": "FullTime",
"postedAt": "2026-04-07T17:12:35.753Z",
"updatedAt": null,
"url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
"salary": { "min": 211400, "max": 290600, "currency": "USD", "interval": "year" },
"scrapedAt": "2026-10-26T13:01:48.619Z"
}

That item is real output (see samples/sample-output.json for 47 more). descriptionText is added when you turn on includeDescription.

Supported ATS

Checked against live endpoints on 2026-10-26.

ATSBoard inputSalaryPosted dateUpdated dateApply URLRemote flagTeam
Greenhouseboards.greenhouse.io/x, job-boards.greenhouse.io/xYes, when the company enables pay transparency (min/max/currency, no interval)YesYesNo (null)Only if the location text says "Remote"No
Leverjobs.lever.co/xNoYesNoYesYesYes
Ashbyjobs.ashbyhq.com/xYes, when the company publishes it (min/max/currency/interval)YesNoYesYesYes
Workableapply.workable.com/xNoYes (date only)NoYesYesNo
SmartRecruiterscareers.smartrecruiters.com/x, jobs.smartrecruiters.com/xNoYesNoOnly with includeDescriptionYesNo
Recruiteex.recruitee.comMapped if the company fills it in; empty on the board we testedYesYesYesYesNo

Notes on honesty:

  • remote is true, false or null. Ashby and Recruitee send their own flag. Lever's remote comes from its workplace type (hybrid and on-site are false). Greenhouse has no flag, so it is true only when the location text contains the word "Remote", otherwise null.
  • employmentType is passed through as the ATS words it (FullTime, Full-time, Permanent, fulltime_permanent). It is not remapped.
  • Workable and SmartRecruiters answer "200, zero jobs" for boards that do not exist. Those inputs come back as an error item, as do boards with no open jobs.

Input

FieldMeaning
companies (required)List of board URLs, ats:slug pairs, or careers page URLs. Example: ["greenhouse:airbnb", "https://jobs.lever.co/spotify", "https://www.notion.com/careers"]
keywordKeep jobs whose title contains this text (case-insensitive)
locationKeep jobs whose location text contains this
remoteOnlyKeep only jobs with remote: true
postedWithinDaysKeep only jobs published in the last N days. Jobs without a date are dropped
includeDescriptionAdd descriptionText as plain text

Careers page auto-detect

If an entry is not an ATS URL, the actor downloads that page and looks for embedded ATS links and scripts (for example boards.greenhouse.io/embed/job_board?for=x, jobs.lever.co/x, jobs.ashbyhq.com/x). It uses the board referenced most often. Tested on notion.com/careers (Ashby) and vercel.com/careers (Greenhouse). Pages that load their job list purely from a different, private API, or that block plain requests, cannot be detected. Use ats:slug for those.

Unresolvable inputs

An input that cannot be resolved returns one item { "input": "...", "error": "..." }. It is not charged.

Pricing

Pay per event: $0.001 per job returned ($1 per 1,000), plus Apify's standard start event of $0.00005 per run. Platform compute is included. Error items are free. Set a maximum charge on the run and it stops cleanly when the limit is reached.

Measured run

One local run, 9 inputs: greenhouse:airbnb, lever:spotify, ashby:ramp, workable:huggingface, smartrecruiters:Ubisoft2, https://bunq.recruitee.com, https://www.notion.com/careers, https://vercel.com/careers, and one board that does not exist.

  • 1,055 jobs in 8.5 seconds (Greenhouse 287 across airbnb and vercel, Lever 89, Ashby 308 across ramp and notion, Workable 6, SmartRecruiters 344, Recruitee 21), plus 1 error item.
  • Run from a home connection. Platform timings will differ.

Limits

  • Boards are fetched one company at a time. Very large boards (SmartRecruiters BoschGroup has about 5,000 postings) take many pages.
  • Lever EU (jobs.eu.lever.co) and Greenhouse EU boards are not supported.
  • Greenhouse, Lever, Ashby and Workable return the whole board in one response, so memory grows with board size. A 2.7 MB board is normal.