ATS Job Scraper: Greenhouse, Lever, Ashby, Workable +2
Pricing
from $1.00 / 1,000 jobs
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
Maintained by CommunityActor 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.
| ATS | Board input | Salary | Posted date | Updated date | Apply URL | Remote flag | Team |
|---|---|---|---|---|---|---|---|
| Greenhouse | boards.greenhouse.io/x, job-boards.greenhouse.io/x | Yes, when the company enables pay transparency (min/max/currency, no interval) | Yes | Yes | No (null) | Only if the location text says "Remote" | No |
| Lever | jobs.lever.co/x | No | Yes | No | Yes | Yes | Yes |
| Ashby | jobs.ashbyhq.com/x | Yes, when the company publishes it (min/max/currency/interval) | Yes | No | Yes | Yes | Yes |
| Workable | apply.workable.com/x | No | Yes (date only) | No | Yes | Yes | No |
| SmartRecruiters | careers.smartrecruiters.com/x, jobs.smartrecruiters.com/x | No | Yes | No | Only with includeDescription | Yes | No |
| Recruitee | x.recruitee.com | Mapped if the company fills it in; empty on the board we tested | Yes | Yes | Yes | Yes | No |
Notes on honesty:
remoteistrue,falseornull. Ashby and Recruitee send their own flag. Lever'sremotecomes from its workplace type (hybrid and on-site arefalse). Greenhouse has no flag, so it istrueonly when the location text contains the word "Remote", otherwisenull.employmentTypeis 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
| Field | Meaning |
|---|---|
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"] |
keyword | Keep jobs whose title contains this text (case-insensitive) |
location | Keep jobs whose location text contains this |
remoteOnly | Keep only jobs with remote: true |
postedWithinDays | Keep only jobs published in the last N days. Jobs without a date are dropped |
includeDescription | Add 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
BoschGrouphas 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.