ATS Jobs Scraper — Greenhouse, Lever, Ashby, Workday & more
Pricing
from $2.00 / 1,000 job scrapeds
ATS Jobs Scraper — Greenhouse, Lever, Ashby, Workday & more
Scrape open roles from company career sites across 11 ATS platforms via official public APIs. Extract titles, locations, salaries, full descriptions and apply links. Auto-detects the ATS from a plain company website.
Pricing
from $2.00 / 1,000 job scrapeds
Rating
0.0
(0)
Developer
Dataloft Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Pull open roles straight from company career sites — Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee, Personio, Teamtailor, BambooHR and Rippling — through each platform's own public API. Give it a board URL, or just a company website and it finds the board for you.
What this scraper does
Most job data on the internet is second-hand: aggregated, re-listed, days stale. This one goes to the source. Every posting comes from the applicant tracking system the company actually publishes to, which means you get the role the moment it is live, with the real requisition ID and the real apply link.
It reads 11 ATS platforms through their official public endpoints. No login, no cookies, no browser automation, no personal data.
What data you get
Every posting is normalised into one flat schema, so a Greenhouse role and a Workday role look identical to your code:
| Field | Notes |
|---|---|
title, company, companySlug | |
atsPlatform | which system it came from |
department, team, employmentType, seniority | when the platform exposes them |
location, locations[], country, isRemote | isRemote is inferred when the ATS has no explicit flag |
compensation | {min, max, currency, interval} — structured where published, parsed from text otherwise |
descriptionHtml, descriptionText | full posting, both formats |
applyUrl, jobUrl, companyCareerUrl | |
postedAt, updatedAt, scrapedAt | ISO 8601 |
source, sourceUrl | exact endpoint the row came from |
Point it at a company, not a board
The part people usually have to do by hand is finding the board. You do not.
Put stripe.com in Company websites and the scraper reads the careers page, spots the ATS behind it, verifies the board actually serves jobs, and pulls everything. If no link is visible it falls back to probing each platform's public API with the obvious slug. In testing, plain domains resolved for 8 of 10 well-known companies — including one that had been acquired and moved onto its parent's board.
That makes a target list of 200 companies a single run instead of 200 manual lookups.
How to use it
- Paste board URLs into Job board URLs, company websites into Company websites, or both.
- Add filters if you want a slice rather than everything — title, location, department, keyword, posted-after, remote-only.
- Set Max jobs in total on your first run so you can see the shape of the output before scraping at scale.
- Run it, then export as JSON, CSV, Excel or pull it from the API.
Input example
{"boards": ["https://job-boards.greenhouse.io/airbnb","https://jobs.ashbyhq.com/openai","https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],"companyDomains": ["stripe.com", "figma.com"],"titleIncludes": ["engineer", "developer"],"locationIncludes": ["remote", "berlin"],"postedAfter": "2026-08-01","maxTotalJobs": 500}
Board URLs work in whatever form you copied them — job-boards.greenhouse.io/acme, boards.greenhouse.io/embed/job_board?for=acme, jobs.lever.co/acme, acme.recruitee.com, acme.jobs.personio.de, a Workday URL with or without the site ID. You can also write greenhouse:acme if you already know the slug.
Output example
{"title": "Senior / Staff Fullstack Engineer","company": "Linear","atsPlatform": "ashby","department": "Product","team": "Engineering","employmentType": "FullTime","location": "Europe","isRemote": true,"compensation": null,"descriptionText": "At Linear, we're building the product development system for teams…","applyUrl": "https://jobs.ashbyhq.com/linear/d3bc1ced-…/application","postedAt": "2026-04-27T20:13:45.158Z","scrapedAt": "2026-08-25T19:14:15.176Z"}
Which platforms are supported
| Platform | Board looks like | Notes |
|---|---|---|
| Greenhouse | job-boards.greenhouse.io/acme | full description included |
| Lever | jobs.lever.co/acme | structured salary when published |
| Ashby | jobs.ashbyhq.com/acme | structured compensation tiers |
| Workday | acme.wd5.myworkdayjobs.com/SiteName | site ID optional — it is probed for you |
| SmartRecruiters | careers.smartrecruiters.com/Acme | company ID is case-sensitive |
| Workable | apply.workable.com/acme | |
| Recruitee | acme.recruitee.com | |
| Personio | acme.jobs.personio.de | .de and .com both handled |
| Teamtailor | acme.teamtailor.com | RSS feed, capped at 100 by the platform |
| BambooHR | acme.bamboohr.com/careers | |
| Rippling | ats.rippling.com/acme/jobs |
A valid board with no open roles returns zero rows rather than an error — that is the platform's answer, not a failure.
How much does it cost to scrape ATS job boards?
You are charged per job actually saved to your dataset, so filtered-out postings cost nothing. A run that scans 5,000 listings and matches 40 charges for 40.
Two ways to keep a first run cheap: set Max jobs in total, and turn Include full job descriptions off — descriptions are the slow part on Workday, which needs one extra request per posting.
Why not just use the official APIs yourself?
You can — they are public, and that is exactly what this actor calls. What you would be rebuilding is the boring part: eleven different response shapes, three different pagination schemes, Workday reporting a total of 0 on every page after the first, Personio nesting a <name> tag inside another <name> tag, retries, rate limits, and one platform whose RSS feed was retired but still answers 200 with an HTML error page.
That last one is why JazzHR is not in the supported list. Its feed endpoint returns a success status with a "page not found" body, which a naive scraper happily parses into rows of nothing. It was tested across 180 tenants and removed rather than shipped as a silent data leak.
Is it legal to scrape ATS job boards?
This actor only calls endpoints the ATS platforms publish for public consumption — the same JSON your browser fetches when you open a company's careers page, and in several cases documented integration APIs. It collects job postings, which are company information, not personal data: no candidate records, no recruiter contact details, no email harvesting.
You are still responsible for how you use the output, including under GDPR and each platform's terms. If you plan to redistribute the data commercially, read those terms first.
Frequently asked questions
Can I scrape a company if I do not know its ATS? Yes — put the plain website in Company websites. If detection fails the run tells you which inputs it could not resolve instead of quietly skipping them.
Why did a board return zero jobs? Almost always because the company genuinely has no openings. Every supported platform answers 200 with an empty list for a valid-but-dormant board.
Does it work with Workday if I only have the company name? Yes. Workday site IDs like NVIDIAExternalCareerSite are probed from a list of naming patterns, so nvidia.wd5.myworkdayjobs.com alone is enough.
How fresh is the data? As fresh as the company's own careers page — you are reading the same source it renders from.
Can I run this on a schedule? Yes, use Apify Schedules. Deduplication is on by default, so a daily run over the same boards gives you a clean current snapshot.
What happens when a filter matches nothing? The log reports scanned N → matched 0 for that board, so you can tell the difference between "no matches" and "something broke".
Other job scrapers
- Workday Jobs Scraper — the same Workday support, but deeper: search terms passed to Workday's own engine, site-ID discovery from a plain company website.
- Remote Jobs Aggregator — 7 remote-only job boards merged into one deduplicated feed.
Feedback
Issues and feature requests go in the Issues tab. Bug reports that include the input JSON get fixed fastest.