ATS Job Scraper — Greenhouse, Lever, Ashby, Workday
Pricing
from $0.00005 / actor start
ATS Job Scraper — Greenhouse, Lever, Ashby, Workday
Give it company domains. It finds their ATS automatically and returns every open job in one normalized schema, with parsed salary. No cookies, no proxies, no board tokens to hunt down.
Pricing
from $0.00005 / actor start
Rating
0.0
(0)
Developer
ATS Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 hours ago
Last modified
Categories
Share
ATS Job Scraper — Greenhouse, Lever, Ashby & Workday
Give it a company domain. Get back every open job, in one clean schema, with parsed salary.
No board tokens to hunt down. No cookies. No proxies. No login.
Input: ["stripe.com", "ramp.com", "palantir.com"]Output: 1,022 jobs — normalized, deduplicated, salary parsed
What you actually get
Real rows from a single run across four different ATS platforms — one schema, no per-platform handling on your side:
| Job title | Company | Location | Level | Salary | ATS |
|---|---|---|---|---|---|
| Security Engineer, Cloud | ramp | New York, NY (HQ) +3 | mid | $211,400–290,600/yr | ashby |
| Backend Software Engineer - Application Development | palantir | Palo Alto, CA | mid | $135,000–200,000/yr | lever |
| Account Executive, AI Startups (Hunter) | stripe | San Francisco +1 | mid | null | greenhouse |
| Software Engineer, Linux Graphics | nvidia | US, CA, Santa Clara | mid | null | workday |
Salary reads null when the company doesn't publish one — it is never guessed or filled in.
Straight to a spreadsheet
Export as CSV and nested fields flatten with / — no post-processing:
title,companySlug,department,locations/0,workplaceType,seniority,salary/min,salary/max,salary/currency,postedAt,source"Security Engineer, Cloud",ramp,Engineering,"New York, NY (HQ)",hybrid,mid,211400,290600,USD,2026-04-07,ashbyBackend Software Engineer - Application Development,palantir,Dev,"Palo Alto, CA",hybrid,mid,135000,200000,USD,2026-06-18,lever"Account Executive, AI Startups (Hunter)",stripe,Startups - Account Executives (NA),San Francisco,,mid,,,,2026-08-19,greenhouse"Software Engineer, Linux Graphics",nvidia,,"US, CA, Santa Clara",,mid,,,,2026-08-25,workday
Full records also carry jobId, employmentType, applyUrl, descriptionText, descriptionHtml,
contentHash and scrapedAt. Turn off includeDescription for a smaller, faster payload.
Why this one
Most ATS scrapers make you do the hard part: find the company's board slug, figure out which ATS they use, then run a different scraper for each one and reconcile four different output shapes.
This Actor does all of that for you.
| Typical ATS scraper | This Actor | |
|---|---|---|
| Input | Board slug you must find yourself | Company domain |
| ATS coverage | One per Actor | Greenhouse + Lever + Ashby + Workday |
| Output shape | Different per ATS | One schema for all |
| Salary | Raw text, if any | Parsed {min, max, currency, period} |
| Change tracking | — | Built in (new / updated / closed) |
| Proxies | Often required | None |
Change tracking — turn it into a hiring monitor
Set onlyNewJobs: true, schedule the Actor daily, and each run returns only what changed:
added— jobs posted since the last runupdated— title, salary, location or description changedremoved— job closed or pulled (a signal in itself)
The first run stores a baseline. Every run after that is a diff.
Use it for:
- Sales intelligence — a company opening 12 engineering roles is a buying signal
- Recruiting — know about a role the hour it goes live
- Market research — track hiring velocity and comp by company, team and level
- Job boards — keep a live index without re-ingesting everything
Input
| Field | Type | Default | Description |
|---|---|---|---|
companies | array | — | Domains (stripe.com) or board URLs (jobs.lever.co/palantir) |
onlyNewJobs | boolean | false | Return only added/changed jobs vs. the previous run |
trackingKey | string | default | Track multiple company lists independently |
includeRemovedJobs | boolean | false | Also emit jobs that disappeared |
includeDescription | boolean | true | Include full description text and HTML |
maxJobsPerCompany | integer | 0 | Cap per company (0 = no limit) |
workdayFetchDetails | boolean | true | Workday needs one extra request per job for descriptions |
Board URLs are accepted directly, so you can skip resolution when you already know the board:
{"companies": ["stripe.com","jobs.lever.co/palantir","https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"]}
Output
Every record has the same shape regardless of which ATS it came from:
{"jobId": "ashby:ramp:34413f8d-26bf-4bbc-8ade-eb309a0e2245","source": "ashby","companySlug": "ramp","companyDomain": "ramp.com","title": "Security Engineer, Cloud","department": "Engineering","team": "Backend","locations": ["New York, NY (HQ)", "Remote (Canada)", "Remote (US)", "Miami, FL"],"workplaceType": "hybrid","employmentType": "FullTime","seniority": "mid","salary": { "min": 211400, "max": 290600, "currency": "USD", "period": "year" },"descriptionText": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams…","descriptionHtml": "…","applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-…/application","postedAt": "2026-04-07T17:12:35.753Z","scrapedAt": "2026-08-24T18:03:28.104Z","contentHash": "593a0ec77ef05d3c","changeType": "added"}
contentHash changes only when the job's meaningful content changes — use it for your own diffing.
seniority is derived from the title: intern, junior, mid, senior, principal, manager, director, executive.
Salary parsing
Ashby exposes structured compensation, so those values are exact. For Greenhouse, Lever and Workday the range is parsed out of the posting text, handling the formats companies actually use:
$173,000.00 - $259,600.00/yr → 173000–259600 USD/year€55k–€70k per year → 55000–70000 EUR/yearUSD 90000 to 120000 annually → 90000–120000 USD/yearThe salary range is $10,000/month → 10000 USD/month
Version numbers, headcounts and date ranges are not mistaken for salary.
Coverage measured against live boards:
| Board | Jobs | Postings stating salary | Parsed |
|---|---|---|---|
| Ashby / ramp | 137 | 137 | 137 (100%) |
| Lever / palantir | 308 | 234 | 234 (100%) |
| Greenhouse / databricks | 824 | 450 | 444 (99%) |
Companies that don't publish salary return salary: null. Nothing is invented.
Speed
No browser, no proxies — just the public JSON endpoints each ATS already serves.
| Board | Jobs | Time |
|---|---|---|
| Greenhouse / databricks | 824 | 0.5 s |
| Greenhouse / stripe | 577 | 0.7 s |
| Lever / palantir | 308 | 1.4 s |
| Ashby / ramp | 137 | 0.3 s |
Workday is slower by design: its list endpoint returns no descriptions, so each job needs one extra request.
Set workdayFetchDetails: false to skip that — much faster and cheaper, but descriptions come back empty and jobs open in several offices read "2 Locations" instead of naming them. With the default (true) you get the full description and the real location.
Supported ATS
| ATS | Input accepted |
|---|---|
| Greenhouse | domain, boards.greenhouse.io/<slug>, job-boards.greenhouse.io/<slug> |
| Lever | domain, jobs.lever.co/<slug> |
| Ashby | domain, jobs.ashbyhq.com/<slug> |
| Workday | domain, <tenant>.wd*.myworkdayjobs.com/<site> |
More ATS platforms are being added. Need one in particular? Open an issue on the Actor and it gets prioritized.
Notes
- Only public job board data is collected — the same pages any visitor can open. No accounts, no logins, no personal candidate data.
- If a company's careers page can't be matched to a supported ATS, that company is skipped with a warning and the rest of the run continues.
- A company can have more than one board. The one with the most open jobs is used as primary; the others are still reported.