Greenhouse, Lever, Ashby & Workday Jobs Scraper (6 ATS) avatar

Greenhouse, Lever, Ashby & Workday Jobs Scraper (6 ATS)

Pricing

Pay per event

Go to Apify Store
Greenhouse, Lever, Ashby & Workday Jobs Scraper (6 ATS)

Greenhouse, Lever, Ashby & Workday Jobs Scraper (6 ATS)

Company career-site jobs from 6 ATS (Workday, Greenhouse, Lever, Ashby, SmartRecruiters, Workable) in one normalized dataset: title, location, remote, department, normalized salary, dates, apply URL, description. Official public APIs only.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Orvix

Orvix

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

ATS Jobs Scraper: Workday, Greenhouse, Lever, Ashby, SmartRecruiters & Workable

Pull job listings from six applicant-tracking systems (Greenhouse, Lever, Ashby, Workday, SmartRecruiters and Workable) into one clean, normalized dataset. Give it a list of company boards (for example stripe, spotify, ramp, a Workday careers URL, Ubisoft2, huggingface) and get every open job with title, locations, remote flag, department, employment type, posting date, apply link, full description and parsed salary range where the company publishes one.

It uses only the official public job-board APIs these ATS platforms provide for career pages, and for Workday the same public JSON the company's own careers page loads (fetched at low concurrency). No login, no browser, no proxies, so runs are fast and cheap.

What you can use it for

  • Job board backfill and job aggregation (ATS jobs feed)
  • Hiring signals and sales intelligence: which companies are hiring, for which teams, where
  • Salary benchmarking from published pay ranges (pay transparency data)
  • Remote job lists, startup jobs, tech jobs monitoring
  • Recruiting research and talent market maps

Input

FieldWhat it is
greenhouseBoardsGreenhouse board tokens: the part after boards.greenhouse.io/ or job-boards.greenhouse.io/ (e.g. stripe, airbnb, gitlab)
leverCompaniesLever slugs: the part after jobs.lever.co/ (e.g. spotify, palantir)
ashbyBoardsAshby board names: the part after jobs.ashbyhq.com/ (e.g. ramp, notion, linear)
workdaySitesFull Workday careers URLs, e.g. https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite (a /en-US/ part is fine)
smartRecruitersCompaniesSmartRecruiters company IDs from jobs.smartrecruiters.com/<id> (case-sensitive, e.g. Ubisoft2, BoschGroup)
workableAccountsWorkable accounts from apply.workable.com/<account>/ (e.g. huggingface)
keywordsOptional. Keep jobs whose title, department or team contains any keyword
locationsOptional. Keep jobs whose location contains any of these strings
remoteOnlyOptional. Only remote jobs
includeDescriptionDefault true. Set false for smaller output
maxItemsOptional cap on total jobs (0 = no limit)

You can paste full board URLs too; the Actor extracts the slug.

{
"greenhouseBoards": ["stripe", "airbnb"],
"leverCompanies": ["spotify"],
"ashbyBoards": ["ramp", "notion"],
"workdaySites": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
"smartRecruitersCompanies": ["Ubisoft2"],
"workableAccounts": ["huggingface"],
"keywords": ["engineer", "data"],
"remoteOnly": false,
"maxItems": 500
}

Output (one normalized schema for all six ATS)

{
"source": "ashby",
"company": "ramp",
"companyBoard": "ramp",
"jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"title": "Security Engineer, Cloud",
"locations": ["New York, NY (HQ)", "Remote (US)"],
"remote": true,
"department": "Engineering",
"team": "Backend",
"employmentType": "FullTime",
"postedAt": "2026-04-07T17:12:35.753Z",
"updatedAt": null,
"applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-.../application",
"jobUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-...",
"salaryMin": 211400,
"salaryMax": 290600,
"salaryCurrency": "USD",
"salaryPeriod": "YEAR",
"salaryText": "$211.4K – $290.6K • Offers Equity",
"descriptionText": "...",
"descriptionHtml": "..."
}

source is one of greenhouse, lever, ashby, workday, smartrecruiters, workable. Salary comes from the ATS's structured fields (Lever salaryRange, Ashby compensation) or is parsed from the published pay range in the description (Greenhouse, Workday, SmartRecruiters, Workable), including formats like $120K–$150K, €71.000 – €85.000 and 120,000 USD - 189,750 USD. Fields a company doesn't publish are null.

A run summary per board (found / kept / errors) is saved to the key-value store as SUMMARY.

FAQ

Is this legal / allowed? It reads the official public job-board endpoints that Greenhouse, Lever and Ashby offer so companies can show jobs on their career pages: Greenhouse's Job Board API (public GET, no auth), Lever's Postings API, Ashby's public Job Posting API, SmartRecruiters' public Posting API and Workable's public job-board widget API. For Workday it reads only the public, unauthenticated job JSON that the company's careers page itself calls, two requests at a time with pauses. No login or proxies. It collects only published job postings, no candidate or personal data. You are responsible for how you use the data.

How do I find a company's board name? Open the company's careers page and look for links to boards.greenhouse.io/<name>, jobs.lever.co/<name>, jobs.ashbyhq.com/<name>, <company>.wdN.myworkdayjobs.com/<site>, jobs.smartrecruiters.com/<id> or apply.workable.com/<account>. Paste the URL; the Actor extracts what it needs.

Big Workday sites? Workday returns at most 2,000 jobs per search, so for larger sites the Actor automatically splits the search by a filter such as job category and merges the results without duplicates.

Speed? Workday and SmartRecruiters need one extra request per job for the description. Turn off includeDescription for a fast list-only run.

What if a board name is wrong? That company is logged as failed in SUMMARY (with a warning in the log) and the run continues with the others. If every board fails, or no board is given, the run fails with a clear message instead of silently returning nothing.

Duplicates? Jobs are deduplicated by source + board + job ID and by apply URL within a run.

Rate limits? The Actor requests one board at a time with a short pause and retries politely on errors.

Cost? Pay per result: $0.0015 per job saved ($1.50 per 1,000) plus $0.005 per run start at the default 1 GB memory. If you set a maximum cost for a run, the Actor fetches only as many jobs as that budget covers. Run with empty input and it does a 30-job demo.

Ghost-job signals (listing age and reposts)

Every row has listingAgeDays (days since the job's own posted date). Turn on Track listing history to also get isRepost, repostOfJobIds, timesPosted, roleAgeDays (how long the role has really been open, across reposts) and isNewSinceLastRun. History lives in a named key-value store in your Apify account (historyStoreName). The first run builds it, and signals appear from the second run on, so schedule it daily or weekly. A repost means the same title and first location reappeared under a new job ID after an earlier ID of that role was taken down. Two openings listed at the same time are not counted as reposts. With history on, each board is listed in full (needed for correct detection), and you are still charged only for the rows saved. No extra charge. Note: SmartRecruiters refreshes its posted date often, so use roleAgeDays there rather than listingAgeDays.