ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workday & 8 More avatar

ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workday & 8 More

Pricing

from $1.50 / 1,000 jobs

Go to Apify Store
ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workday & 8 More

ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workday & 8 More

Every open job from any company on Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee, Personio, Teamtailor, BambooHR, Jobvite or Oracle in one schema. Presets, company hiring summaries, salary, seniority, new & closed job monitoring.

Pricing

from $1.50 / 1,000 jobs

Rating

0.0

(0)

Developer

Izzy Sobrizzy

Izzy Sobrizzy

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Get every open job from any company that hires through Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee, Personio, Teamtailor, BambooHR, Jobvite or Oracle Recruiting Cloud. All twelve come back in one clean format with title, department, location, remote/hybrid/on-site, employment type, seniority, salary ranges (also converted to yearly), post date, apply link and the full description.

You don't need to know which ATS a company uses. Paste a careers URL, a website (figma.com) or just a company name (Stripe), and the Actor finds the board for you. Or skip the typing and pick a preset list: top tech, AI, fintech, remote-first, developer tools, European tech or large Workday enterprises.

Need the big picture rather than every posting? Switch Output to One row per company for a hiring-signal summary: open roles, jobs posted in the last 7 and 30 days, top departments and locations, remote share, seniority mix and median salary per company.

Run it once for a snapshot. Or schedule it with "Only new jobs" to get a feed of new openings, plus closed jobs if you want them, ready for Slack, email, Google Sheets, webhooks, Zapier or Make.

  • ✅ 12 ATSs, 1 schema. The same 42 fields with the same names and types for every job. Unknown values are null, never missing.
  • ✅ Presets. 7 ready-made lists of 140+ verified boards (top tech, AI, fintech, remote-first, devtools, Europe, Workday enterprises).
  • ✅ Hiring signals. One row per company with open roles, new this week, departments, locations and seniority mix, billed as one result per company.
  • ✅ Live data. Every run reads the company's own job board at that moment, not a stale database copy.
  • ✅ Public career-site feeds only. No browser, proxy, login or CAPTCHA, so it's fast, cheap and hard to break.
  • ✅ Finds the board for you. It accepts board URLs, ats:board, company domains, careers pages and company names.
  • ✅ Enriched. It adds normalised seniority (intern to executive), workplace type, employment type, ISO country codes and yearly salary.
  • ✅ Monitoring. It can return only new jobs since the last run, and optionally closed jobs too (closed-job rows are free).
  • ✅ Clear per-company report. A wrong name never kills the run. RUN_SUMMARY says exactly what happened to each company.
  • ✅ No personal data. Recruiter and hiring-manager names are never exported.

Who uses it

  • Job boards and aggregators: fill a niche board with fresh postings straight from the source, and drop closed ones automatically.
  • Sales and recruiting teams (hiring signals): see which accounts are hiring for which teams, where and how senior, and get alerts when a target company opens a role.
  • Job seekers: watch 50 dream companies and get only new roles that match your title, location, seniority and salary.
  • Analysts and investors: track hiring velocity, salary bands, remote policy and seniority mix across companies.
  • AI agents, RAG and LLM pipelines: clean plain-text descriptions and stable IDs. It works as an MCP tool through Apify's MCP server.

How to use it

  1. Add companies to Companies, one per line. Mix and match any of these:
You pasteWhat happens
https://boards.greenhouse.io/airbnbGreenhouse board (also job-boards.greenhouse.io, EU boards, embed URLs)
https://jobs.lever.co/spotifyLever board (also jobs.eu.lever.co)
https://jobs.ashbyhq.com/openaiAshby board
https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSiteWorkday careers site (also wdN.myworkdaysite.com/recruiting/...)
https://careers.smartrecruiters.com/ServiceNowSmartRecruiters company
https://apply.workable.com/bluegroundWorkable account (also blueground.workable.com)
https://bunq.recruitee.comRecruitee careers site
https://acme.jobs.personio.dePersonio careers page (.de or .com)
https://acme.teamtailor.comTeamtailor career site
https://alkira.bamboohr.com/careersBambooHR careers page
https://jobs.jobvite.com/egnyte/jobsJobvite career site
https://xxxx.fa.us2.oraclecloud.com/hcmUI/CandidateExperience/en/sites/CX_1/jobsOracle Recruiting Cloud careers site (paste any URL that contains /sites/<site>)
greenhouse:figma, ashby:notion, bamboohr:alkira, jobvite:nutanixATS + board name
figma.com or https://www.notion.com/careersCompany website: the Actor checks the page, the homepage, /careers, /jobs and careers.<domain> for an embedded board, then tries the domain name on each ATS
stripe or Monzo BankCompany or board name: the Actor checks the ten probe-able ATSs (Workday and Oracle need a URL)

Or pick one or more Preset company lists (they're merged with your own entries, duplicates removed).

  1. (Optional) Add filters: keywords, excluded words, locations, remote/hybrid, departments, seniority, minimum yearly salary, posted within N days.
  2. (Optional) Set Output to One row per company for hiring summaries instead of individual jobs.
  3. Click Start. Results appear in the Output tab. Export them as JSON, CSV, Excel or HTML, or fetch them through the API.

Tip: to find a company's board yourself, open any job on its careers page. The link usually contains greenhouse.io/<name>, lever.co/<name>, ashbyhq.com/<name>, myworkdayjobs.com/<Site> and so on.

Presets

PresetCompaniesExamples
top-tech30Airbnb, Stripe, Figma, Discord, Reddit, Cloudflare, Datadog, Spotify, Palantir, Notion
ai26Anthropic, OpenAI, Cohere, Scale AI, Hugging Face, Perplexity, Databricks, ElevenLabs, Harvey
fintech16Stripe, Brex, Chime, Affirm, Monzo, Mercury, Ramp, Plaid, Nubank, Adyen
remote-first20Zapier, PostHog, 1Password, GitLab, Supabase, Grafana Labs, Vercel, Toptal
devtools21Sentry, Snowflake, Temporal, ClickHouse, Vercel, Netlify, Cockroach Labs, Linear
europe16Monzo, GoCardless, Adyen, N26, SumUp, Synthesia, Miro, bunq, Blueground
enterprise-workday12NVIDIA, Salesforce, Adobe, Intel, Cisco, Mastercard, PayPal, Capital One, 3M, HP

Every preset board was checked against the live ATS in October 2026. Companies sometimes move to a new ATS; if one does, RUN_SUMMARY flags it and the rest of the run carries on.

Company hiring summary (one row per company)

With Output = One row per company ("outputMode": "companies"), the Actor still reads every job, applies your filters, and then saves one row per company instead of one per job. A real row (engineering roles at Alkira, lists shortened):

{
"recordType": "company",
"companyName": "Alkira",
"ats": "bamboohr",
"openJobs": 14,
"jobsPostedLast7Days": 1,
"jobsPostedLast30Days": 3,
"newSinceLastRun": 0,
"hiringActivity": "low",
"remoteShare": 0.71,
"topDepartments": [{ "name": "Engineering - R&D", "count": 12 }, { "name": "Sales Engineering", "count": 2 }],
"topLocations": [{ "name": "Remote (United States)", "count": 5 }, { "name": "San Jose, California, United States", "count": 4 }],
"topCountries": [{ "name": "US", "count": 10 }, { "name": "IN", "count": 4 }],
"seniorityMix": { "ENTRY": 6, "SENIOR": 5, "MID": 1, "LEAD": 2 },
"workplaceMix": { "REMOTE": 10, "HYBRID": 4 },
"jobsWithSalary": 4,
"newestPostedAt": "2026-10-15T00:00:00.000Z",
"newestTitles": ["Sr. Solutions Engineer, Pre-Sales (East Coast)", "Principal Software Engineer, Forwarding Plane"],
"boardUrl": "https://alkira.bamboohr.com/careers"
}
  • Filters decide what is counted. For example, keywords: ["engineer"] gives open engineering roles per company.
  • With onlyNewJobs, newSinceLastRun counts jobs not seen before (and closedSinceLastRun with reportClosedJobs). Every company still gets a row.
  • hiringActivity is a rough label from jobs posted in the last 30 days (or open roles when most jobs have no date): 0 = none, 1–4 low, 5–19 moderate, 20–49 high, 50+ very high.
  • Each company row is billed as one result ($0.0015). Summarising 100 companies costs about $0.16 including the run fee.
  • In normal Jobs mode you get the same summaries for free as the COMPANY_SUMMARY record in the run's key-value store.

Input example

{
"companies": ["https://boards.greenhouse.io/airbnb", "lever:spotify", "figma.com", "Monzo Bank",
"https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite", "bamboohr:alkira"],
"presets": ["ai"],
"outputMode": "jobs",
"keywords": ["engineer", "data scientist"],
"excludeKeywords": ["intern"],
"locations": ["United States", "Remote"],
"seniority": ["SENIOR", "LEAD"],
"minYearlySalary": 150000,
"postedWithinDays": 14,
"onlyNewJobs": true,
"reportClosedJobs": true,
"descriptionFormat": "text"
}
FieldDefaultWhat it does
companiesnoneUp to 1,000 per run, in any format above. Duplicates are removed. Required unless you pick a preset.
presetsnoneAny of top-tech, ai, fintech, remote-first, devtools, europe, enterprise-workday. Merged with companies.
outputModejobsjobs (one row per posting) or companies (one hiring-summary row per company).
keywordsnoneKeep jobs whose title contains any of these. Matching is whole-word (AI matches "AI Engineer", not "Maintenance") and works with C++ and .NET.
excludeKeywordsnoneDrop jobs whose title contains any of these.
keywordsInDescriptionfalseAlso match keywords in the description, e.g. every job mentioning "Kubernetes".
locationsnoneKeep jobs whose location, other locations, city, region, country or country code contains any of these.
workplaceanyremote, hybrid, onsite or remoteOrHybrid.
departmentsnoneKeep jobs whose department or team contains any of these.
postedWithinDays0 (off)Only jobs published in the last N days.
onlyWithSalaryfalseOnly jobs with a structured salary range.
minYearlySalary0 (off)Only jobs whose pay reaches this yearly amount, in the job's own currency (hourly and monthly pay are converted).
seniorityallAny of INTERN, ENTRY, MID, SENIOR, LEAD, MANAGER, DIRECTOR, EXECUTIVE.
includeUnknownSenioritytrueKeep titles with no clear level (e.g. "Software Engineer") when filtering by seniority.
onlyNewJobsfalseMonitoring: return only jobs not returned by earlier runs with the same monitorKey.
monitorKeydefaultA separate memory for each watch list.
reportClosedJobsfalseWith monitoring on, also output remembered jobs that disappeared from their board (isClosed: true). Free.
descriptionFormattexttext, html, both or none. none gives the smallest output and is much faster for SmartRecruiters, Workday, BambooHR, Jobvite and Oracle.
maxJobsPerCompany / maxJobs0 (no limit)Caps per company and per run. In companies mode, maxJobs caps the number of company rows and maxJobsPerCompany is ignored.
maxConcurrency5Companies processed in parallel. Requests to each ATS stay rate-limited regardless.

Output example

Every job record has exactly the same fields. This is a real record (description shortened):

{
"id": "ashby:openai:c414f15f-60c4-40b5-a896-d2ad6c7f4415",
"recordType": "job",
"ats": "ashby",
"companySlug": "openai",
"companyName": "OpenAI",
"jobId": "c414f15f-60c4-40b5-a896-d2ad6c7f4415",
"requisitionId": null,
"title": "Senior Technical Program Manager - Security",
"department": "Security",
"team": "Security",
"location": "US - Remote",
"allLocations": ["US - Remote", "New York City", "Seattle", "Washington, DC", "San Francisco"],
"city": null,
"region": null,
"country": "United States",
"countryCode": "US",
"workplaceType": "REMOTE",
"isRemote": true,
"employmentType": "FULL_TIME",
"employmentTypeRaw": "FullTime",
"experienceLevel": null,
"seniority": "SENIOR",
"salaryMin": 165400,
"salaryMax": 285000,
"salaryCurrency": "USD",
"salaryInterval": "YEAR",
"salaryMinYearly": 165400,
"salaryMaxYearly": 285000,
"salaryRanges": [{ "min": 165400, "max": 285000, "currency": "USD", "interval": "YEAR", "label": null }],
"salarySummary": "$165.4K – $285K • Offers Equity • Multiple Ranges",
"postedAt": "2026-06-25T17:30:54.205Z",
"updatedAt": null,
"jobUrl": "https://jobs.ashbyhq.com/openai/c414f15f-60c4-40b5-a896-d2ad6c7f4415",
"applyUrl": "https://jobs.ashbyhq.com/openai/c414f15f-60c4-40b5-a896-d2ad6c7f4415/application",
"descriptionText": "About the Team\n\nOpenAI builds powerful AI systems like ChatGPT…",
"descriptionHtml": null,
"language": null,
"isNew": null,
"firstSeenAt": null,
"isClosed": null,
"closedAt": null,
"scrapedAt": "2026-10-21T03:44:01.582Z"
}

Normalised values:

  • workplaceType: REMOTE, HYBRID, ONSITE or null
  • employmentType: FULL_TIME, PART_TIME, CONTRACT, TEMPORARY, INTERN, OTHER or null. The original value is kept in employmentTypeRaw.
  • seniority: INTERN, ENTRY, MID, SENIOR, LEAD, MANAGER, DIRECTOR, EXECUTIVE or null. It's inferred from the title and the ATS's experience field. "Product Manager"-style individual-contributor titles are not counted as people managers.
  • salaryInterval: HOUR, DAY, WEEK, MONTH, YEAR or null. salaryMinYearly and salaryMaxYearly convert the range to a year (2,080 hours, 260 days, 52 weeks or 12 months).
  • id = ats:board:jobId. It's stable across runs, so you can use it to deduplicate and join.

The Overview, Jobs with salary, New & closed jobs and Company hiring summary views in the Output tab show the most useful columns. Every row has recordType: job or company. Each run also saves RUN_SUMMARY in its key-value store. Per company, it lists the ATS and board that were used, jobs found, matched, new, closed and saved, duplicates skipped, and any error or warning in plain English.

What each ATS provides

Field coverage on real boards (Oct 2026: about 11,000 jobs from 54 boards for the first four ATSs, 485 jobs from 17 boards for the next five, and 180 jobs from 7 boards for BambooHR, Jobvite and Oracle). What you get depends on what each company publishes.

FieldGreenhouseLeverAshbySmartRecruitersWorkdayWorkableRecruiteePersonioTeamtailorBambooHRJobviteOracle
Title, location, URL✅✅✅✅✅✅✅✅✅✅✅✅
Post date✅✅✅✅✅✅✅✅✅✅~40%¹✅
Full description✅✅✅✅✅✅✅✅✅✅✅✅
Company name✅✅✅✅✅✅✅✅✅✅✅✅
Department✅~50–77%✅~65–95%–~90%~90%✅✅✅✅✅
Remote / hybrid / on-site~30–40%✅~70–80%✅from location✅✅from office✅✅from locationwhen set
Employment type~25%✅✅✅✅✅✅✅–✅~40%¹✅
Seniority (normalised)~60%~25%~30%~90%~90%✅✅✅~30%✅~45%~85%
Structured salary~55%~30%~35–64%–––~30%––text, ~15%when published–
Country code–✅✅✅✅✅✅–✅✅~40%¹✅

¹ Jobvite sites that publish structured job data (schema.org) give date, type, country and salary. Sites that don't still give title, department, location and description.

Pricing

Pay per result: $1.50 per 1,000 jobs ($0.0015 per job saved), plus $0.005 per run. There's no monthly fee, and you don't pay for compute.

  • Filters run before you're charged. You only pay for jobs that match.
  • In monitoring mode you only pay for new jobs. Closed-job rows are free.
  • A company that returns nothing costs nothing.
ScenarioJobs savedCost
One-off: every job at 20 companies~3,000≈ $4.51
One-off: senior remote engineering roles at 100 companies~400≈ $0.61
Daily monitor of 50 companies, ~40 new jobs/day~1,200 / month≈ $1.95 / month (incl. 30 run fees)
Daily monitor of 10 dream companies, ~3 new matching jobs/day~90 / month≈ $0.29 / month

Company summaries (outputMode: companies) are billed as one result per company: a weekly summary of 100 companies costs about $0.16.

Set Maximum cost per run in the run options to cap spending. The Actor stops cleanly at the limit and records why in RUN_SUMMARY.

How it compares

This ActorTypical single-ATS scraperTypical job-database API
ATSs in one run12, same schema1many
Ready-made company lists✅ 7 presets––
One-row-per-company hiring summary✅–sometimes
Data freshnessLive from the company's board at run timelivedepends on the crawl schedule
InputURL, ats:board, domain, company nameboard slugsearch filters
New-job monitoring✅ built inrarelysometimes
Closed-job detection✅ freerarelysometimes
Seniority + yearly salary✅rarelyoften (AI-derived)
Price$1.50 / 1,000 jobsvariesvaries

Use cases and recipes

  • New-jobs alert for target accounts: add your accounts, turn on onlyNewJobs and schedule daily. Then add a Slack or email integration on "Run succeeded", or a webhook that reads the dataset.
  • Niche job board: schedule onlyNewJobs + reportClosedJobs hourly or daily. Upsert by id, and unpublish rows where isClosed is true.
  • Salary benchmarking: filter with onlyWithSalary, then compare salaryMinYearly and salaryMaxYearly by seniority, countryCode and department.
  • Hiring-velocity tracking: schedule outputMode: companies weekly (for example with the ai or fintech preset) and chart openJobs and jobsPostedLast7Days per company over time.
  • Sales prospecting: run your account list in companies mode with keywords for the roles you sell to (e.g. "data engineer") and sort by jobsPostedLast30Days.

FAQ

Is this legal? The Actor reads only public job-posting feeds that companies publish so candidates can see their jobs:

  • documented public APIs from Greenhouse (Job Board API), Lever (Postings API), Ashby (Job Postings API) and SmartRecruiters (Posting API)
  • Personio's XML job feed
  • Recruitee's careers-site API, Workable's job widget feed and Teamtailor's RSS feed
  • for Workday, BambooHR and Oracle Recruiting Cloud, the same JSON endpoints their public careers sites use
  • for Jobvite, the public career-site pages (including the schema.org job data they publish for search engines)

It collects job postings only, not personal data, and rate-limits itself. You're responsible for how you use the data (for example, follow each company's terms if you republish descriptions).

Why is a company "not found"? The board name is wrong, or the company uses an ATS this Actor doesn't cover (e.g. iCIMS, SAP SuccessFactors or Taleo, which don't offer a reliable public feed). Open any job on its careers page and paste that board URL. RUN_SUMMARY lists each company's status.

How reliable is finding a board from a domain or company name? For a domain, the Actor first looks for a board linked from the company's own pages, which is reliable when it finds one. Otherwise it tries the domain or company name as a board name on each ATS. A name match can occasionally pick a different company with the same name, so those rows get a warning in RUN_SUMMARY. Paste the board URL when you need certainty. Careers pages that load jobs only with JavaScript may not reveal their board.

Why did a SmartRecruiters company return 0 jobs? SmartRecruiters returns an empty list, not an error, for unknown company IDs, and the IDs are case-sensitive (BoschGroup, not bosch).

Why are SmartRecruiters, Workday, BambooHR, Jobvite and Oracle slower? They need one extra request per job for the description (BambooHR and Jobvite also for the post date). Filters are applied before those requests whenever possible. Choose descriptionFormat: none for the fastest runs. With title keywords, Workday boards are pre-searched on Workday's side.

How do "Only new jobs" and closed jobs work? The Actor remembers the jobs it returned in a named key-value store (ats-jobs-scraper-monitor, one record per monitorKey), for 180 days after each job was last seen. The first run returns everything that matches, and later runs return only new jobs. With reportClosedJobs, a remembered job that is no longer on its board is output once with isClosed: true and closedAt. If it comes back, it counts as open again.

Does it handle big companies? Yes. All pages are fetched in parallel where the ATS allows it. Boards with 2,000+ jobs (e.g. NVIDIA on Workday, ServiceNow on SmartRecruiters, OpenAI on Ashby) load in seconds to a minute.

Can I use it from the API, Zapier, Make, n8n or an AI agent? Yes. Start it through the Apify API or schedule it, and connect the dataset to Zapier, Make, n8n, Google Sheets, Slack or webhooks. AI agents can call it as a tool through the Apify MCP server.

Something broke. What now? Open an issue in the Issues tab and include the run link. Temporary errors (rate limits, 5xx, timeouts) are retried automatically with backoff, and one failing company never stops the others. Feature requests (another ATS, another field) are welcome too.