Greenhouse & Lever Jobs Scraper: Ashby, Workable, Personio API
Pricing
from $2.00 / 1,000 jobs
Greenhouse & Lever Jobs Scraper: Ashby, Workable, Personio API
Scrape every open job from any company on Greenhouse, Lever, Ashby, Workable, Recruitee and Personio via their public job APIs. One clean schema with salary, remote type, location and apply URL. Auto-detects the ATS, filters by keyword and country, and alerts you to new jobs only. $2 per 1,000 jobs.
Pricing
from $2.00 / 1,000 jobs
Rating
0.0
(0)
Developer
Jordy
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
20 hours ago
Last modified
Categories
Share
Greenhouse & Lever Jobs Scraper: Ashby, Workable, Recruitee & Personio Jobs API
Get every open job from any list of companies on Greenhouse, Lever, Ashby, Workable, Recruitee and Personio, in one clean format, for $2 per 1,000 jobs.
Paste company names, board URLs or ats:slug codes and get all their open positions straight from the employers' own applicant-tracking systems (ATS), read through the public job-posting APIs those vendors provide for exactly this. No HTML scraping, no logins, no proxies. Filter on keywords, location, country, remote and posting date, and switch on new-jobs-only mode for a daily feed of just the jobs that appeared since the last run.
What can it do?
- ✅ 6 ATS platforms, one schema: Greenhouse, Lever (global and EU), Ashby, Workable, Recruitee and Personio return identical fields.
- ✅ Auto-detects the ATS from a company name or careers-page URL, so you don't need to know the slug.
- ✅ Salary when published: Greenhouse pay ranges, Ashby compensation, Lever salary range, Personio/Recruitee fields. Never guessed.
- ✅ Filters: keywords and excluded keywords (title or description), locations, countries (ISO codes or
REMOTE), remote/hybrid, posted within N days, employment type. - ✅ New-jobs-only mode: remembers which jobs you already had per feed name, so a scheduled run returns only new postings.
- ✅ Exports: JSON, CSV, Excel, HTML from the Output tab, plus
jobs.csvand aRUN_SUMMARYper run. Works with schedules, webhooks, Zapier, Make, Slack and Google Sheets. - ✅ Privacy built in: e-mail addresses and phone numbers in job descriptions are removed.
Use cases
- Recruiters and agencies: watch a shortlist of target companies and get new roles the morning they are posted.
- Job boards and newsletters: backfill listings for niche boards (remote, data, Europe, startups) with clean apply URLs.
- Sales and lead generation: use hiring as a buying signal; a company opening five data roles is likely buying data tools.
- Market and salary research: compare roles, locations and published pay ranges across competitors.
- Job seekers: one alert for every company you'd like to work for.
How to use it
- Click Try for free and paste your companies into Companies, one per line:
greenhouse:airbnb,https://jobs.lever.co/spotifyor justHugging Face. - Optional: add keywords, countries or remote filters, and switch on Only new jobs since last run with a feed name.
- Click Start. Jobs appear in the Output tab; download them or use
jobs.csvfrom the run's storage. - For a daily job alert, save the input as a task and add a schedule. Connect Slack, Google Sheets, Zapier, Make or a webhook under Integrations.
Example input
{"companies": ["greenhouse:airbnb", "lever:spotify", "https://jobs.ashbyhq.com/ramp", "personio:personio", "Hugging Face"],"keywords": ["engineer", "data"],"countries": ["NL", "DE", "REMOTE"],"postedWithinDays": 30,"maxJobsPerCompany": 50,"onlyNewJobs": true,"stateName": "eu-engineering"}
companies accepts four forms: ats:slug (fastest: greenhouse:airbnb, lever:spotify, ashby:ramp, workable:huggingface, recruitee:bunq, personio:personio), a job-board URL, a careers-page URL (scanned for an embedded board) or a plain company name.
Call it from the API
curl -X POST "https://api.apify.com/v2/acts/jordydev~ats-job-feed/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"companies":["greenhouse:airbnb","lever:spotify"],"keywords":["data"],"maxJobsPerCompany":20}'
Example output
Real rows from test runs on 27-28 Oct 2026:
| company | ats | title | location | countryCode | remoteType | salary | postedAt |
|---|---|---|---|---|---|---|---|
| Airbnb | greenhouse | Associate Principal, Procurement Innovation Supplier Programs | United States | US | remote | 102,000–120,000 USD | 2026-09-24 |
| Airbnb | greenhouse | Business Development Manager | Berlin, Germany | DE | hybrid | – | 2026-06-10 |
| Personio SE & Co. KG | personio | Staff Software Engineer, Data Platform | Munich; Berlin | DE | – | – | 2024-11-13 |
One row as JSON (description shortened):
{"jobId": "personio:personio:1834171","ats": "personio","company": "Personio SE & Co. KG","title": "Staff Software Engineer, Data Platform","department": "Product and Tech","team": "Engineering","location": "Munich; Berlin","city": "Munich","countryCode": "DE","isRemote": false,"employmentType": "full-time","seniority": "principal-staff","postedAt": "2024-11-13T14:10:41.000Z","jobUrl": "https://personio.jobs.personio.de/job/1834171","descriptionText": "The Role: …","isNew": true}
Every row has the same fields for every ATS: jobId (stable, ats:slug:id), ats, company, title, department, team, location, city, region, countryCode, isRemote, remoteType, employmentType, seniority, salaryMin/Max/Currency/Period/Text/Source, postedAt, updatedAt, applyUrl, jobUrl, descriptionText or descriptionHtml, isNew, firstSeenAt, detectedVia, plus a run envelope (tool, status, errorCode, checkedAt).
How much does it cost?
Pay per event: you only pay for results, not for Apify compute.
| Event | Price | When it's charged |
|---|---|---|
| Job | $0.002 ($2 per 1,000 jobs) | One job row in your dataset |
| Company checked (new-jobs mode) | $0.0005 | New-jobs-only mode only: one company board checked, also when it has no new jobs |
| Actor start | $0.00005 | Apify's standard fee per run start (per GB of memory) |
Free: companies whose board isn't found, unsupported sources and fetch errors.
Examples:
- 50 companies × ~40 jobs = 2,000 jobs ≈ $4.00 for the first full run.
- Daily alert over the same 50 companies with ~20 new jobs ≈ 50 × $0.0005 + 20 × $0.002 = $0.065 a day.
You can set a maximum cost per run; the Actor checks the budget before every row and stops cleanly at the cap. Apify's free plan includes monthly credit, so you can try it at no cost.
Supported sources
| ATS | Endpoint used | Basis for reuse |
|---|---|---|
| Greenhouse | boards-api.greenhouse.io/v1/boards/{slug}/jobs | Public Job Board API, documented, no auth (docs) |
| Lever | api.lever.co/v0/postings/{slug} (and EU host) | Postings API; published postings are public and may be used by third parties (docs) |
| Ashby | api.ashbyhq.com/posting-api/job-board/{slug} | Public Job Posting API (docs) |
| Workable | apply.workable.com/api/v1/widget/accounts/{slug} | Public endpoint behind Workable's own jobs widget (help) |
| Recruitee | {slug}.recruitee.com/api/offers/ | Careers Site API (docs). From 10 Feb 2027 Recruitee requires a per-company token (see FAQ) |
| Personio | {slug}.jobs.personio.de/xml | Public XML feed for careers-site integration (docs) |
| SmartRecruiters | – | Not supported: its API policy forbids large-scale extraction. Returns a free SOURCE_NOT_SUPPORTED row |
| LinkedIn, Indeed | – | Not supported: their terms forbid automated extraction |
Need Workday or Teamtailor employers, or no company list at all? Use EU Jobs Search.
FAQ
Is this scraping? Is it legal? No HTML is scraped. Every job comes from the public job-posting API or feed the ATS vendor provides for publishing vacancies to third-party sites. Employers publish these postings for wide distribution, but check the terms of each ATS and employer for your own use case. Terms were checked on 27 Oct 2026; this is a technical summary, not legal advice.
Is personal data collected?
No applicant data is ever read. Recruiter e-mail addresses and phone numbers inside descriptions are removed ([email removed], [phone removed]).
How do I find a company's ATS slug?
You don't have to: paste the careers-page URL or company name and leave Auto-detect ATS on. The slug is the last part of the board URL, e.g. jobs.lever.co/spotify.
Why does a company return BOARD_NOT_FOUND?
It probably uses an ATS that isn't supported (Workday, SmartRecruiters, iCIMS…) or a different slug. That row is free.
How does new-jobs-only mode work?
The Actor stores the job IDs it returned per stateName in a named key-value store in your account. The first run returns everything (baseline); later runs return only jobs not seen before. Use one stateName per feed.
Is it polite to the job boards?
Yes. Usually one request per board; requests to the same API host are spaced by requestDelayMs (default 500 ms) whatever the concurrency, with back-off on 429/5xx and Retry-After.
What changes for Recruitee in 2027?
From 10 Feb 2027 Recruitee requires an X-Careers-Sites-Token issued to each company. The recruiteeToken input covers a company reading its own board; other companies' Recruitee boards may then return a free error row.
Related Actors
More tools by the same developer, all pay-per-event with the same clean output style:
- EU Jobs Search (Workday, Greenhouse, Lever & Teamtailor): search live jobs from 6,500+ European employers' career sites by keyword and country, no company list needed.
- Bulk PageSpeed Insights & Core Web Vitals Checker: Lighthouse scores, LCP/CLS/INP and top fixes for hundreds of URLs, with CSV and PDF report.
- Website Screenshot & HTML to PDF: full-page PNG/JPEG screenshots and PDFs of any URL or raw HTML, cookie banners removed.
- Broken Link Checker & SEO Site Audit (Site QA Crawler): broken links, redirects, SEO basics, WCAG accessibility and SSL expiry in one crawl, with a fix list and PDF.
Related searches: Greenhouse jobs scraper, Greenhouse jobs API, Lever jobs scraper, Lever postings API, Ashby job board API, Workable jobs scraper, Recruitee jobs, Personio XML feed, ATS jobs API, career site jobs, company job monitor, new job alerts, hiring signals, job board backfill.