ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workday & 8 More
Pricing
from $1.50 / 1,000 jobs
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
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_SUMMARYsays 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
- Add companies to Companies, one per line. Mix and match any of these:
| You paste | What happens |
|---|---|
https://boards.greenhouse.io/airbnb | Greenhouse board (also job-boards.greenhouse.io, EU boards, embed URLs) |
https://jobs.lever.co/spotify | Lever board (also jobs.eu.lever.co) |
https://jobs.ashbyhq.com/openai | Ashby board |
https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite | Workday careers site (also wdN.myworkdaysite.com/recruiting/...) |
https://careers.smartrecruiters.com/ServiceNow | SmartRecruiters company |
https://apply.workable.com/blueground | Workable account (also blueground.workable.com) |
https://bunq.recruitee.com | Recruitee careers site |
https://acme.jobs.personio.de | Personio careers page (.de or .com) |
https://acme.teamtailor.com | Teamtailor career site |
https://alkira.bamboohr.com/careers | BambooHR careers page |
https://jobs.jobvite.com/egnyte/jobs | Jobvite career site |
https://xxxx.fa.us2.oraclecloud.com/hcmUI/CandidateExperience/en/sites/CX_1/jobs | Oracle Recruiting Cloud careers site (paste any URL that contains /sites/<site>) |
greenhouse:figma, ashby:notion, bamboohr:alkira, jobvite:nutanix | ATS + board name |
figma.com or https://www.notion.com/careers | Company 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 Bank | Company 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).
- (Optional) Add filters: keywords, excluded words, locations, remote/hybrid, departments, seniority, minimum yearly salary, posted within N days.
- (Optional) Set Output to One row per company for hiring summaries instead of individual jobs.
- 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
| Preset | Companies | Examples |
|---|---|---|
top-tech | 30 | Airbnb, Stripe, Figma, Discord, Reddit, Cloudflare, Datadog, Spotify, Palantir, Notion |
ai | 26 | Anthropic, OpenAI, Cohere, Scale AI, Hugging Face, Perplexity, Databricks, ElevenLabs, Harvey |
fintech | 16 | Stripe, Brex, Chime, Affirm, Monzo, Mercury, Ramp, Plaid, Nubank, Adyen |
remote-first | 20 | Zapier, PostHog, 1Password, GitLab, Supabase, Grafana Labs, Vercel, Toptal |
devtools | 21 | Sentry, Snowflake, Temporal, ClickHouse, Vercel, Netlify, Cockroach Labs, Linear |
europe | 16 | Monzo, GoCardless, Adyen, N26, SumUp, Synthesia, Miro, bunq, Blueground |
enterprise-workday | 12 | NVIDIA, 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,newSinceLastRuncounts jobs not seen before (andclosedSinceLastRunwithreportClosedJobs). Every company still gets a row. hiringActivityis 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_SUMMARYrecord 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"}
| Field | Default | What it does |
|---|---|---|
companies | none | Up to 1,000 per run, in any format above. Duplicates are removed. Required unless you pick a preset. |
presets | none | Any of top-tech, ai, fintech, remote-first, devtools, europe, enterprise-workday. Merged with companies. |
outputMode | jobs | jobs (one row per posting) or companies (one hiring-summary row per company). |
keywords | none | Keep jobs whose title contains any of these. Matching is whole-word (AI matches "AI Engineer", not "Maintenance") and works with C++ and .NET. |
excludeKeywords | none | Drop jobs whose title contains any of these. |
keywordsInDescription | false | Also match keywords in the description, e.g. every job mentioning "Kubernetes". |
locations | none | Keep jobs whose location, other locations, city, region, country or country code contains any of these. |
workplace | any | remote, hybrid, onsite or remoteOrHybrid. |
departments | none | Keep jobs whose department or team contains any of these. |
postedWithinDays | 0 (off) | Only jobs published in the last N days. |
onlyWithSalary | false | Only jobs with a structured salary range. |
minYearlySalary | 0 (off) | Only jobs whose pay reaches this yearly amount, in the job's own currency (hourly and monthly pay are converted). |
seniority | all | Any of INTERN, ENTRY, MID, SENIOR, LEAD, MANAGER, DIRECTOR, EXECUTIVE. |
includeUnknownSeniority | true | Keep titles with no clear level (e.g. "Software Engineer") when filtering by seniority. |
onlyNewJobs | false | Monitoring: return only jobs not returned by earlier runs with the same monitorKey. |
monitorKey | default | A separate memory for each watch list. |
reportClosedJobs | false | With monitoring on, also output remembered jobs that disappeared from their board (isClosed: true). Free. |
descriptionFormat | text | text, html, both or none. none gives the smallest output and is much faster for SmartRecruiters, Workday, BambooHR, Jobvite and Oracle. |
maxJobsPerCompany / maxJobs | 0 (no limit) | Caps per company and per run. In companies mode, maxJobs caps the number of company rows and maxJobsPerCompany is ignored. |
maxConcurrency | 5 | Companies 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,ONSITEornullemploymentType:FULL_TIME,PART_TIME,CONTRACT,TEMPORARY,INTERN,OTHERornull. The original value is kept inemploymentTypeRaw.seniority:INTERN,ENTRY,MID,SENIOR,LEAD,MANAGER,DIRECTOR,EXECUTIVEornull. 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,YEARornull.salaryMinYearlyandsalaryMaxYearlyconvert 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.
| Field | Greenhouse | Lever | Ashby | SmartRecruiters | Workday | Workable | Recruitee | Personio | Teamtailor | BambooHR | Jobvite | Oracle |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 location | when 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.
| Scenario | Jobs saved | Cost |
|---|---|---|
| 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 Actor | Typical single-ATS scraper | Typical job-database API | |
|---|---|---|---|
| ATSs in one run | 12, same schema | 1 | many |
| Ready-made company lists | ✅ 7 presets | – | – |
| One-row-per-company hiring summary | ✅ | – | sometimes |
| Data freshness | Live from the company's board at run time | live | depends on the crawl schedule |
| Input | URL, ats:board, domain, company name | board slug | search filters |
| New-job monitoring | ✅ built in | rarely | sometimes |
| Closed-job detection | ✅ free | rarely | sometimes |
| Seniority + yearly salary | ✅ | rarely | often (AI-derived) |
| Price | $1.50 / 1,000 jobs | varies | varies |
Use cases and recipes
- New-jobs alert for target accounts: add your accounts, turn on
onlyNewJobsand schedule daily. Then add a Slack or email integration on "Run succeeded", or a webhook that reads the dataset. - Niche job board: schedule
onlyNewJobs+reportClosedJobshourly or daily. Upsert byid, and unpublish rows whereisClosedistrue. - Salary benchmarking: filter with
onlyWithSalary, then comparesalaryMinYearlyandsalaryMaxYearlybyseniority,countryCodeanddepartment. - Hiring-velocity tracking: schedule
outputMode: companiesweekly (for example with theaiorfintechpreset) and chartopenJobsandjobsPostedLast7Daysper company over time. - Sales prospecting: run your account list in
companiesmode withkeywordsfor the roles you sell to (e.g. "data engineer") and sort byjobsPostedLast30Days.
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.