ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workday and more
Pricing
$2.00 / 1,000 jobs
ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workday and more
Get every open job from company career boards on Greenhouse, Lever, Ashby, Workable, Recruitee and Workday in one normalized format, with salary, remote flag, filters and new-jobs-only monitoring. Uses the boards' official public APIs. No login, no proxy.
Pricing
$2.00 / 1,000 jobs
Rating
0.0
(0)
Developer
Scott Williams
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 hours ago
Last modified
Categories
Share
ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workable, Recruitee and Workday
Get every open job from company career sites in one clean, normalized format. Paste board URLs, ats:slug pairs, bare company slugs, or even a company careers page, and the Actor figures out which applicant tracking system (ATS) the company uses.
At a glance: $2.00 per 1,000 jobs. Pay per result with no subscription, set a maximum cost per run, export to JSON, CSV or Excel, or call it from the Apify API, Make, Zapier or n8n.
It reads the official public job-board endpoints that these ATS vendors publish for career-site embedding. No login, no cookies, no browser, no proxy. That makes runs fast, cheap and stable.
What you get
- 6 ATS platforms, one schema: Greenhouse, Lever (US and EU), Ashby, Workable, Recruitee, Workday.
- Auto-detection: enter
stripeorhttps://www.figma.com/careers/and the Actor finds the board. If a slug exists on several ATSs, the board with the most open jobs wins and the others are logged. - Salary data: structured pay ranges from the ATS when published (Ashby, Lever, Recruitee), and pay ranges parsed from the description text otherwise (common for US roles with pay transparency laws).
salarySourcetells you which. - Remote and workplace type:
isRemoteandworkplaceType(remote, hybrid, onsite) where the ATS exposes it. - Filters: title keywords, excluded keywords, locations, departments, remote only, posted within N days.
- Monitoring mode:
onlyNewJobsreturns only postings you have not seen in earlier runs. Schedule it daily and you get a clean feed of new jobs, and you pay only for the new ones. - Polite by design: robots.txt is checked for every host at runtime, each host is rate limited (and Lever's
Crawl-delayis honored), and retries back off on 429 and 5xx.
Use cases
- Job boards and aggregators that need fresh, de-duplicated listings from company sources.
- Recruiters and sales teams tracking which companies are hiring for which roles (hiring signals).
- Market and salary research across companies, teams and locations.
- Job seekers watching a short list of target companies for new openings.
- AI agents and LLM pipelines that need structured job data via the Apify API or MCP.
Input
| Field | Type | Description |
|---|---|---|
companies | array (required) | Board URLs, ats:slug, bare slugs, or careers page URLs. Up to 2000 per run. |
keywords | array | Keep titles containing any of these words. |
excludeKeywords | array | Drop titles containing any of these words. |
searchInDescription | boolean | Match keywords in the description too. |
locations | array | Keep jobs whose location contains any of these strings. |
remoteOnly | boolean | Only remote jobs. |
departments | array | Keep jobs whose department or team contains any of these strings. |
postedWithinDays | integer | Only jobs first published in the last N days. |
includeUndatedJobs | boolean | Keep jobs without a date when postedWithinDays is set (default true). |
onlyNewJobs | boolean | Monitoring mode, see above. |
stateStoreName | string | Named key-value store for monitoring state. Use one name per monitor. |
includeDescription | boolean | Include the full description (default true). |
descriptionFormat | text, html, both | Description format (default text). |
maxJobsPerCompany | integer | Cap per company, 0 for no cap. |
maxTotalJobs | integer | Cap per run, 0 for no cap. |
maxConcurrency | integer | Companies scraped in parallel (1 to 20, default 5). |
Accepted company formats
https://boards.greenhouse.io/airbnb Greenhousehttps://job-boards.greenhouse.io/stripe Greenhousegreenhouse:airbnb Greenhouse, explicithttps://jobs.lever.co/leverdemo Lever (US)https://jobs.eu.lever.co/<company> Lever (EU)https://jobs.ashbyhq.com/ramp Ashbyhttps://apply.workable.com/huggingface Workablehttps://bunq.recruitee.com Recruiteehttps://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite Workday (site name required)stripe bare slug, auto-detectedhttps://www.figma.com/careers/ careers page with an embedded board
Example input
{"companies": ["https://boards.greenhouse.io/airbnb", "ashby:ramp", "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],"keywords": ["engineer"],"excludeKeywords": ["intern"],"locations": ["United States", "Remote"],"postedWithinDays": 30,"onlyNewJobs": true}
Output
One dataset item per job. Example (description shortened):
{"uid": "ashby:ramp:34413f8d-26bf-4bbc-8ade-eb309a0e2245","id": "34413f8d-26bf-4bbc-8ade-eb309a0e2245","ats": "ashby","companySlug": "ramp","companyName": "ramp","title": "Security Engineer, Cloud","department": "Engineering","team": "Backend","location": "New York, NY (HQ)","locations": ["New York, NY (HQ)", "Remote (Canada)", "Remote (US)", "Miami, FL"],"country": "USA","isRemote": true,"workplaceType": "Hybrid","employmentType": "FullTime","postedAt": "2026-04-07T17:12:35.753000+00:00","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","salaryMin": 211400,"salaryMax": 290600,"salaryCurrency": "USD","salaryPeriod": "YEAR","salaryText": "$211.4K – $290.6K • Offers Equity","salarySource": "ats","hiringEntity": null,"requisitionId": null,"descriptionText": "ABOUT RAMP ...","scrapedAt": "2026-10-27T17:02:28.662167+00:00"}
Fields are always present. A field is null when the ATS does not publish it. uid is stable across runs and safe to use as a primary key.
A RUN_SUMMARY record in the default key-value store lists every board with jobs found, matched and returned, and any error. Boards that fail (wrong slug, removed board) never stop the run.
Pricing
Pay per result: you pay only for jobs returned to your dataset. Filtered out jobs and, in monitoring mode, already seen jobs are free. Set Maximum cost per run in the run options and the Actor stops cleanly when it is reached.
Tips
- Workday returns the list fast but needs one extra request per job for the description. Turn off
includeDescriptionfor quick counts, or usekeywordsso only matching jobs are fetched in detail. - Workday's public listing endpoint returns at most about 2,000 jobs per site. Use
keywordsto split very large employers. - For monitoring, schedule the Actor (for example daily) with
onlyNewJobs: trueand connect a webhook, Slack, Google Sheets or Zapier integration to the dataset.
Supported and unsupported
Supported: Greenhouse, Lever, Ashby, Workable, Recruitee, Workday.
Not supported: SmartRecruiters (its API robots.txt disallows automated clients), iCIMS, Taleo, SuccessFactors and other platforms without a public job-board API. Requests for more platforms are welcome in the Issues tab.
Is this legal?
The Actor only reads job postings that companies publish openly so that anyone can apply, through endpoints the ATS vendors provide for public career sites. It does not log in, does not bypass any access control, respects robots.txt and rate limits, and does not collect personal data about candidates or employees. You are responsible for how you use the data, including compliance with the terms of the sites you use it with. If in doubt, consult a lawyer.
FAQ
Why is a company not found? The slug is wrong or the company uses another ATS. Open the company's careers page, click any job, and paste the board URL you land on.
How fresh is the data? Live. Every run reads the boards at run time.
Can I use it from code or an AI agent? Yes, through the Apify API, the Apify Python and JavaScript clients, or Apify's MCP server.