ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workday and more avatar

ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workday and more

Pricing

$2.00 / 1,000 jobs

Go to Apify Store
ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workday and more

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

Scott Williams

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 hours ago

Last modified

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 stripe or https://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). salarySource tells you which.
  • Remote and workplace type: isRemote and workplaceType (remote, hybrid, onsite) where the ATS exposes it.
  • Filters: title keywords, excluded keywords, locations, departments, remote only, posted within N days.
  • Monitoring mode: onlyNewJobs returns 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-delay is 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

FieldTypeDescription
companiesarray (required)Board URLs, ats:slug, bare slugs, or careers page URLs. Up to 2000 per run.
keywordsarrayKeep titles containing any of these words.
excludeKeywordsarrayDrop titles containing any of these words.
searchInDescriptionbooleanMatch keywords in the description too.
locationsarrayKeep jobs whose location contains any of these strings.
remoteOnlybooleanOnly remote jobs.
departmentsarrayKeep jobs whose department or team contains any of these strings.
postedWithinDaysintegerOnly jobs first published in the last N days.
includeUndatedJobsbooleanKeep jobs without a date when postedWithinDays is set (default true).
onlyNewJobsbooleanMonitoring mode, see above.
stateStoreNamestringNamed key-value store for monitoring state. Use one name per monitor.
includeDescriptionbooleanInclude the full description (default true).
descriptionFormattext, html, bothDescription format (default text).
maxJobsPerCompanyintegerCap per company, 0 for no cap.
maxTotalJobsintegerCap per run, 0 for no cap.
maxConcurrencyintegerCompanies scraped in parallel (1 to 20, default 5).

Accepted company formats

https://boards.greenhouse.io/airbnb Greenhouse
https://job-boards.greenhouse.io/stripe Greenhouse
greenhouse:airbnb Greenhouse, explicit
https://jobs.lever.co/leverdemo Lever (US)
https://jobs.eu.lever.co/<company> Lever (EU)
https://jobs.ashbyhq.com/ramp Ashby
https://apply.workable.com/huggingface Workable
https://bunq.recruitee.com Recruitee
https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite Workday (site name required)
stripe bare slug, auto-detected
https://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 includeDescription for quick counts, or use keywords so only matching jobs are fetched in detail.
  • Workday's public listing endpoint returns at most about 2,000 jobs per site. Use keywords to split very large employers.
  • For monitoring, schedule the Actor (for example daily) with onlyNewJobs: true and 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.

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.