Multi-ATS Jobs Scraper: Greenhouse, Lever, Ashby & more
Pricing
$1.00 / 1,000 job saveds
Multi-ATS Jobs Scraper: Greenhouse, Lever, Ashby & more
Get every open job from company career pages on Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee and Personio in one normalized schema: salaries, remote flag, filters and new-job monitoring. $1 per 1,000 jobs.
Pricing
$1.00 / 1,000 job saveds
Rating
0.0
(0)
Developer
Jakob Jerič
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 hours ago
Last modified
Categories
Share
Multi-ATS Jobs Scraper: Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee & Personio
Get every open job from company career pages in one clean, normalized dataset. Give it a list of companies (names or job board URLs) and it pulls all their current openings straight from the official public job board APIs of Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee and Personio: titles, departments, locations, remote/hybrid flag, employment type, salary ranges, publish dates, apply links and full descriptions.
- 7 applicant tracking systems, one output schema. Same 29 fields for every job, whatever ATS the company uses.
- Just type a company name.
notion,vercel,bunq... the Actor finds which ATS the company uses. Or paste the job board URL. - Salaries included. Structured pay ranges from Ashby, Lever and Recruitee, plus pay-transparency ranges parsed from descriptions (e.g. "$156,800 – $235,200").
- Monitoring mode. Schedule it daily and get only newly posted jobs, so you pay only for new ones.
- Filters before you pay: title keywords, excluded words, location, department, remote only, employment type, posted in the last N days.
- Live data, no login, no proxies. Uses only official public job board endpoints, the same ones that power the companies' own career pages.
- Cheap: $1.00 per 1,000 jobs. No start fee. Companies that aren't found cost nothing.
What can I use it for?
- Job boards and aggregators: keep a niche job board (remote, climate, AI, crypto, a city) filled with fresh roles directly from employers.
- Recruiting and sales intelligence: see which companies are hiring, for which teams and where. Hiring for a role often signals a need for your product.
- Market and salary research: compare pay ranges by role, location and company.
- Job seekers and career coaches: watch a list of dream companies and get alerted to new openings.
- Investors and analysts: track headcount growth plans across a portfolio or a competitor set.
- AI agents and LLM pipelines: clean, consistent JSON with plain-text descriptions, ready for RAG or matching.
How to use it
- Add companies to Companies or job board URLs, one per line. Any of these forms works:
- Job board URL:
https://boards.greenhouse.io/stripe,https://jobs.lever.co/spotify,https://jobs.ashbyhq.com/openai,https://careers.smartrecruiters.com/BoschGroup,https://apply.workable.com/huggingface,https://bunq.recruitee.com,https://ottonova.jobs.personio.de - Explicit
ats:slug:greenhouse:figma,lever:spotify,ashby:linear,smartrecruiters:BoschGroup,workable:huggingface,recruitee:bunq,personio:ottonova - Plain company name:
notion. The Actor checks all 7 ATSs and picks the board with the most open jobs.
- Job board URL:
- Optionally set filters (title keywords, location, remote only, ...).
- Click Start. Download results as JSON, CSV, Excel or via the API.
Example input
{"companies": ["https://boards.greenhouse.io/stripe", "https://jobs.lever.co/spotify", "ashby:linear", "notion"],"titleKeywords": ["engineer", "developer"],"excludeTitleKeywords": ["intern"],"locationKeywords": ["remote", "London", "Berlin"],"postedWithinDays": 30,"descriptionFormat": "text","onlyNewJobs": false}
Example output (one job)
{"ats": "ashby","companySlug": "notion","companyName": "Notion","jobId": "06e1d3a8-2706-4ed9-9fe6-8b69607de18e","title": "Security Engineer, Detection and Response","department": "Security","team": "Security","location": "San Francisco, California","locations": ["San Francisco, California", "New York, New York"],"country": "United States","workplaceType": "HYBRID","isRemote": false,"employmentType": "FULL_TIME","employmentTypeRaw": "FullTime","experienceLevel": null,"salaryMin": 185000,"salaryMax": 280000,"salaryCurrency": "USD","salaryPeriod": "YEAR","salaryText": "$185,000 - $280,000","publishedAt": "2026-09-28T16:20:26.330Z","updatedAt": null,"jobUrl": "https://jobs.ashbyhq.com/notion/06e1d3a8-2706-4ed9-9fe6-8b69607de18e","applyUrl": "https://jobs.ashbyhq.com/notion/06e1d3a8-2706-4ed9-9fe6-8b69607de18e/application","descriptionText": "WHO WE ARE\n\nNotion is the collaborative AI workspace where t ...","descriptionHtml": null,"isNew": null,"input": "notion","scrapedAt": "2026-10-31T23:36:36.827Z"}
Real item from a run (description shortened here). Every job has all fields; unknown values are null (and locations is []), so CSV columns stay stable across runs and ATSs.
Output fields
| Field | Description |
|---|---|
ats | greenhouse, lever, ashby, smartrecruiters, workable, recruitee or personio |
companySlug, companyName | Board identifier on the ATS and the company name (falls back to the capitalized slug when the ATS doesn't publish a name) |
jobId | Job ID on the ATS. ats + companySlug + jobId is unique |
title, department, team, experienceLevel | As published by the company |
location, locations, country | Primary location, all locations, country (code or name as given) |
workplaceType, isRemote | REMOTE / HYBRID / ONSITE / null; isRemote is true only for fully remote jobs |
employmentType, employmentTypeRaw | Normalized FULL_TIME, PART_TIME, CONTRACT, TEMPORARY, INTERNSHIP, OTHER, plus the original value |
salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryText | Pay range (HOUR/DAY/WEEK/MONTH/YEAR) when the company publishes one |
publishedAt, updatedAt | ISO 8601 timestamps |
jobUrl, applyUrl | Posting and application links |
descriptionText, descriptionHtml | Full description, depending on the Job description setting |
isNew | In monitoring mode true; otherwise null |
input, scrapedAt | Which input line produced the job, and when |
A per-company report (ATS found, jobs on board, jobs matched, jobs saved, errors) is saved as the OUTPUT record in the run's key-value store.
Monitoring new jobs
Turn on Only new jobs (monitoring mode) and run the Actor on a schedule (e.g. daily). The first run saves all matching jobs; each later run saves only jobs that weren't on the board in earlier runs with the same Monitoring key. Use a different key for each separate watch list. Connect the run to email, Slack, Google Sheets or a webhook through Apify integrations to get alerts.
Pricing
$1.00 per 1,000 jobs saved (pay-per-event, job event = $0.001). You pay only for jobs that end up in your dataset, after filters and monitoring. No start fee, nothing for companies that aren't found, and Apify platform usage is included.
Examples: all 745 open jobs at Stripe ≈ $0.75. A daily monitor of 50 companies that finds 30 new jobs a day ≈ $0.90 a month.
Set Maximum cost per run in the run options to cap spending; the Actor stops cleanly when it is reached.
FAQ
Which companies are supported? Any company whose careers page runs on one of the 7 supported ATSs, which is tens of thousands of companies, from startups to enterprises (Stripe, Figma, Notion, OpenAI, Spotify, Bosch, ...). Workday, iCIMS, Taleo, Teamtailor, BambooHR and LinkedIn are not supported.
How do I find a company's board? Open the company's careers page and click a job. If the URL contains greenhouse.io, lever.co, ashbyhq.com, smartrecruiters.com, workable.com, recruitee.com or personio.de/.com, paste that URL. Some companies host their job pages on their own domain (e.g. stripe.com/jobs) but still use one of these ATSs; then just try the company name.
The company name wasn't found. Why? The board slug can differ from the brand name (e.g. BoschGroup). Paste the job board URL, or use ats:slug. The OUTPUT record lists the slugs that were tried.
Is the data live? Yes. Every run reads the company boards directly at that moment; there is no cached database.
Does it include personal data? No. Only job posting data is returned. Recruiter and hiring-manager names, emails and phone numbers that some ATSs expose are not included.
How are salaries found? From structured ATS fields where available (Ashby, Lever, Recruitee), otherwise parsed from clear pay-range sentences in the description (common in US pay-transparency text). Ambiguous numbers are skipped, so null means no clear range was published. For SmartRecruiters, salary parsing needs descriptions to be enabled.
How fast is it? Most boards take under a second. Large SmartRecruiters boards (thousands of jobs) need one request per 100 jobs, and with descriptions on, one request per job.
Limits
- Up to 500 companies per run; up to 10,000 postings per SmartRecruiters board.
- Lever and Ashby don't publish a company name, so
companyNameis the capitalized board slug there. - Data quality depends on what each company publishes: department, salary or employment type can be missing.
- Only public job boards are read. If an ATS rate-limits or refuses a request, the company is reported as
BLOCKEDin the OUTPUT record; the Actor never tries to get around blocks.
Support
Found a board that doesn't work, or need another ATS? Open an issue on the Actor's Issues tab with the company or URL and it will be looked at.