Greenhouse, Lever, Ashby, Workable & Personio Jobs Scraper
Pricing
from $1.50 / 1,000 jobs
Greenhouse, Lever, Ashby, Workable & Personio Jobs Scraper
Job postings from Greenhouse, Lever, Ashby, Workable and Personio boards in one clean format: title, department, locations, remote, employment type, salary when public, dates, apply link and description. Uses each platform's public job-board API or feed. No browser, no login.
Pricing
from $1.50 / 1,000 jobs
Rating
0.0
(0)
Developer
Carina Hatton
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 hours ago
Last modified
Categories
Share
A lot of companies host their careers page on one of five applicant tracking systems: Greenhouse, Lever, Ashby, Workable or Personio. Each one publishes open roles in its own format. This Actor reads them all and gives you one tidy list of jobs, with the same fields no matter where a job came from.
Give it some careers page URLs, like https://jobs.lever.co/spotify or https://job-boards.greenhouse.io/figma. It works out the platform from the URL, pulls the open positions, applies your filters and saves one row per job. Every row links back to the original posting, so you (or your users) always apply on the company's own page.
Where the data comes from
This Actor doesn't scrape HTML and doesn't use a browser. For each platform it uses the public endpoint the vendor built for showing jobs on careers sites:
| Platform | Endpoint | Notes |
|---|---|---|
| Greenhouse | Job Board API, boards-api.greenhouse.io/v1/boards/{board}/jobs | Documented public API. Salary comes from pay transparency ranges when the company publishes them. |
| Lever | Postings API, api.lever.co/v0/postings/{company} (and the EU host api.eu.lever.co) | Documented public API. Requests are spaced at least 1 second apart to match Lever's robots.txt Crawl-delay: 1. |
| Ashby | Public job posting API, api.ashbyhq.com/posting-api/job-board/{board} | Documented public API. Includes compensation when the company shows it. Unlisted postings are skipped. |
| Workable | Public job widget endpoint, apply.workable.com/api/v1/widget/accounts/{account} | This is the endpoint behind Workable's embeddable jobs widget. It isn't formally documented and it's rate limited, so the Actor sends at most one request every 2 seconds and backs off when it gets a 429. |
| Personio | XML job feed, {company}.jobs.personio.de/xml | The feed Personio provides for job portals and careers sites. |
A few things to know:
- It only reads what's already public. No login, no API keys, no private data. If a company takes a posting down, it disappears on your next run.
- It doesn't discover companies for you. You bring the list of companies (URLs or slugs). The Actor won't crawl the platforms' own websites looking for boards.
- It's polite. Every host gets a minimum gap between requests, at most 4 boards are read at once, and 429 or 5xx responses are retried with backoff (honouring
Retry-After). - The content belongs to the employers. Job descriptions are the companies' own text. Link back to the posting (
jobUrl/applyUrl) when you show them, and check that your use fits your local laws and the platforms' terms.
Input
The simplest input is a list of careers page URLs:
{"companies": ["https://job-boards.greenhouse.io/figma","https://jobs.lever.co/spotify","https://jobs.ashbyhq.com/notion","https://apply.workable.com/huggingface/","https://vivid.jobs.personio.de"],"keywords": ["engineer"],"postedSince": "30 days","maxItems": 200}
URLs that point at a single job (for example jobs.lever.co/spotify/<id>) work too; the Actor reads the whole board. You can also write platform:slug, like lever:spotify or personio:vivid.
If you'd rather keep lists per platform, use the optional fields greenhouseBoards, leverCompanies, ashbyBoards, workableAccounts and personioCompanies with plain slugs.
| Field | What it does |
|---|---|
companies | Careers page URLs or platform:slug entries. Anything that isn't one of the five platforms is skipped with a warning. |
keywords | Keep jobs whose title, department or team contains any of these words. |
locations | Keep jobs whose location text contains any of these (e.g. Berlin, United States). |
departments | Keep jobs whose department or team contains any of these. |
remoteOnly | Keep only remote jobs. |
postedSince | A date (2026-10-01) or a period (7 days, 2 weeks, 1 month). |
maxItems | Total cap on saved jobs. 0 means no limit. |
maxItemsPerCompany | Cap per board, newest first. |
includeDescription | Adds the description as HTML and plain text. On by default; turn it off for smaller output. |
fetchCompanyNames | Look up display names for Lever, Ashby and Personio boards (one small extra request per board). On by default. |
personioLanguage | Language of Personio feeds, en by default. |
Output
One item per job. Here's a real one (description shortened):
{"platform": "lever","company": "Palantir Technologies","companySlug": "palantir","jobId": "491a0133-b580-45c3-9fd4-2314faf82fb9","title": "Forward Deployed Software Engineer - Germany Forward Deployed","department": null,"team": "Delta","location": "Washington, D.C.","locations": ["Washington, D.C."],"remote": false,"workplaceType": "hybrid","employmentType": "FULL_TIME","employmentTypeRaw": "Full-time","salary": null,"postedAt": "2026-10-28T13:56:03+00:00","updatedAt": null,"jobUrl": "https://jobs.lever.co/palantir/491a0133-b580-45c3-9fd4-2314faf82fb9","applyUrl": "https://jobs.lever.co/palantir/491a0133-b580-45c3-9fd4-2314faf82fb9/apply","descriptionHtml": "<div><strong>NOTE: Although this position ...","descriptionText": "NOTE: Although this position ...","sourceUrl": "https://api.lever.co/v0/postings/palantir","scrapedAt": "2026-10-30T13:46:17+00:00"}
When a company publishes pay, salary looks like {"min": 198000, "max": 288000, "currency": "USD", "interval": "YEAR", "text": "$198K - $288K"}.
The run also saves a RUN_SUMMARY record in the key-value store. It lists every board with its status, how many jobs were on it, how many matched and how many were saved, plus any error (for example "board not found").
Where fields differ by platform
The platforms don't all share the same data, so some fields are best effort:
- company: Greenhouse and Workable give the company's display name. Lever, Ashby and Personio don't, so the Actor reads the title of the board's public careers page once per company (e.g.
Palantir Technologiesinstead ofpalantir). If that page can't be read, orfetchCompanyNamesis off, you get the slug. The slug is always incompanySlug. - remote: Lever, Ashby and Workable mark remote jobs themselves. Greenhouse and Personio don't have a remote field, so the Actor looks for words like "remote" or "anywhere" in the location and title. That's a guess and it can be wrong.
- employmentType is normalized to
FULL_TIME,PART_TIME,CONTRACT,INTERN,TEMPORARYorOTHER. The original value is inemploymentTypeRaw. Greenhouse doesn't publish employment type, so it's usually empty there. - salary only appears when the company chose to show it. Personio's feed and Workable's widget don't include pay.
- updatedAt is only available from Greenhouse.
- applyUrl: on Greenhouse it's the same as the job page (the form is on that page). On Personio it points at the job page's application section.
Pricing
You pay per job saved, plus Apify's small charge for starting a run. Filters run before anything is saved, so jobs you filter out don't cost anything. If you set a spending limit on a run, the Actor stops cleanly when it's reached.
Tips
- Large boards are big. OpenAI's Ashby board is around 14 MB with descriptions, Stripe's Greenhouse board around 6 MB. 512 MB of memory is plenty.
- Each board is a single request (Lever pages at 100 jobs per request), plus one small request for the company name on Lever, Ashby and Personio. Filters don't make runs faster, only smaller.
- If a URL isn't recognised, check the log. The Actor tells you which entries it skipped and why.