ATS Jobs Scraper: Greenhouse, Lever, Ashby & more
Pricing
Pay per usage
ATS Jobs Scraper: Greenhouse, Lever, Ashby & more
Scrape public jobs from Greenhouse, Lever, Ashby, Workable, Personio, Recruitee & Teamtailor in one schema. Auto-detects the ATS. Only-new-jobs mode.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Tom Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 hours ago
Last modified
Categories
Share
ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workable, Personio, Recruitee & Teamtailor jobs API
Get every open job posting straight from company career pages - in one clean, unified format - from the 7 applicant tracking systems (ATS) most used by tech companies, startups and European scale-ups: Greenhouse, Lever, Ashby, Workable, Personio, Recruitee and Teamtailor.
Paste a careers page URL (e.g. https://www.notion.com/careers) and the Actor auto-detects the ATS behind it. Filter by keyword, location, department, remote and posting date, and on scheduled runs get only the jobs that are new since the last run - so you pay only for fresh data.
What can this ATS jobs scraper do?
- 🧭 Auto-detect the ATS from any company careers page, or use board URLs /
ats:slugshorthands - 🧩 One schema for 7 ATS - title, department, team, location(s), country, remote/hybrid/onsite, employment type, posting date, apply URL, salary range (when published), description as text and/or HTML
- 🇪🇺 European ATS included - Personio, Recruitee, Teamtailor and Workable, plus EU-hosted Greenhouse and Lever boards
- 🔎 Filters before you pay - keywords (title or description), excluded words, locations, departments, remote only, posted within N days. Filtered-out jobs are never stored
- 🔔 "Only new jobs" monitoring - remembers job IDs between runs; perfect for daily schedules, Slack/email alerts, n8n / Make / Zapier flows
- 🛡️ Polite and reliable - uses each ATS's public job-board feed (the same data the company publishes for candidates), checks robots.txt, one request at a time per host, retries with backoff, one failing company never breaks the run
- 🤖 AI-agent ready - flat JSON, stable
jobIdandcontentHashfields for de-duplication and change detection
Who is it for?
- Job boards & aggregators that need fresh postings from hundreds of company career sites
- Recruiters & talent-intelligence teams tracking who is hiring, for which roles and where
- Sales teams using hiring as a buying signal ("companies hiring data engineers in Germany")
- Investors & analysts monitoring headcount growth of portfolio or competitor companies
- Job seekers & communities building niche boards (remote, climate, AI, DACH...)
How to scrape jobs from Greenhouse, Lever, Ashby and more
- Click Try for free.
- In Company career pages or ATS boards, add one line per company, any of:
- a board URL:
https://boards.greenhouse.io/airbnb,https://jobs.lever.co/palantir,https://jobs.ashbyhq.com/openai,https://apply.workable.com/huggingface,https://bunq.recruitee.com,https://personio.jobs.personio.de,https://career.teamtailor.com - a shorthand:
greenhouse:airbnb,lever:palantir,ashby:openai,workable:huggingface,recruitee:bunq,personio:personio,teamtailor:career,greenhouse-eu:<slug>,lever-eu:<slug> - any careers page:
https://www.notion.com/careers,https://linear.app/careers
- a board URL:
- Optionally add filters (keywords, locations, remote only, posted within days).
- Click Start and download the results as JSON, CSV, Excel or via API.
Example input
{"companies": ["greenhouse:airbnb","https://jobs.lever.co/palantir","https://www.notion.com/careers","https://bunq.recruitee.com","https://personio.jobs.personio.de"],"keywords": ["engineer", "developer"],"locations": ["London", "Amsterdam", "Munich", "Remote"],"postedWithinDays": 30,"onlyNewJobs": true,"stateKey": "eu-engineering-monitor","descriptionFormat": "text"}
Example output
{"jobId": "ashby:linear:d3bc1ced-3ce4-4086-a050-555055dbb1ff","ats": "ashby","companySlug": "Linear","companyName": "Linear","title": "Senior / Staff Fullstack Engineer","department": "Product","team": "Engineering","location": "Europe","locations": ["Europe"],"country": "European Union","workplaceType": "remote","isRemote": true,"employmentType": "FullTime","postedAt": "2021-04-27T20:13:45.158000Z","url": "https://jobs.ashbyhq.com/Linear/d3bc1ced-3ce4-4086-a050-555055dbb1ff","applyUrl": "https://jobs.ashbyhq.com/Linear/d3bc1ced-3ce4-4086-a050-555055dbb1ff/application","salaryMin": null,"salaryMax": null,"salaryCurrency": null,"salaryText": null,"descriptionText": "At Linear, we're building the product development system for teams and agents...","contentHash": "75b14f030f31a8f0","scrapedAt": "2026-10-23T03:44:27Z"}
Ashby boards that publish compensation also fill salaryMin, salaryMax, salaryCurrency, salaryInterval and salaryText (e.g. "$250K - $445K"). Lever and Recruitee salary ranges are included when the company publishes them.
A run summary (jobs found / saved per company, errors, request count) is saved as OUTPUT in the run's key-value store.
Output fields
| Field | Description |
|---|---|
jobId | Stable unique ID ats:company:postingId - use it to de-duplicate |
ats, companySlug, companyName | Where the job comes from |
title, department, team, seniority | Role details (seniority from Personio) |
location, locations, country | Primary location, all locations, country (when provided) |
workplaceType, isRemote | remote / hybrid / onsite and a boolean remote flag |
employmentType | Full-time, part-time, contract... as given by the ATS |
postedAt, updatedAt | ISO-8601 UTC |
url, applyUrl | Public job page and application link |
salaryMin, salaryMax, salaryCurrency, salaryInterval, salaryText | Pay range when the company publishes it |
descriptionText, descriptionHtml | Full job description |
contentHash | Changes when title, location or description change |
How much does it cost to scrape ATS jobs?
During the launch period this Actor is free to use - you only pay standard Apify platform usage, which is tiny because it calls public JSON/XML feeds instead of rendering pages. In our test on the Apify platform, a run that saved 659 jobs from 5 companies cost about $0.004 in platform usage at 256 MB memory (roughly $0.006 per 1,000 jobs); a single small board costs well under $0.001. Your actual cost depends on your plan and inputs.
Jobs removed by your filters or already returned by a previous "only new jobs" run are never written to the dataset, so they cost nothing.
Tips
- JavaScript-only careers pages: if auto-detection fails, open the page, click any job and copy the board URL (e.g.
jobs.lever.co/...) into the input. - EU-hosted boards: use
greenhouse-eu:slug/lever-eu:slugor paste the.eu.board URL. - Personio language: set Personio feed language (e.g.
de) to get German descriptions. - Several monitors: give each schedule its own Monitoring state key.
Integrations and API
Run it from the Apify API, the Python/JS clients, or connect it to Make, Zapier, n8n, Google Sheets, Slack, Airbyte and webhooks. AI agents can call it through the Apify MCP server.
Is it legal to scrape job postings?
This Actor only reads public job postings that companies publish through their ATS's public job-board feeds for candidates and job aggregators. It does not log in, bypass paywalls or CAPTCHAs, and it does not collect candidate or employee data (recruiter contact fields such as reply-to mailboxes are dropped). It respects robots.txt and paces requests. You are responsible for how you use the data and for complying with each company's terms and with laws such as GDPR. When in doubt, consult a lawyer. Read more in Apify's blog post Is web scraping legal?
Not supported (yet)
Workday, SmartRecruiters, iCIMS, SuccessFactors, BambooHR and LinkedIn/Indeed are not supported in this version. Missing an ATS? Open an issue in the Issues tab - requests with the most votes get built first.
Support
Found a bug or a board that doesn't parse? Open an issue with the input you used - we aim to fix broken boards quickly.