Greenhouse, Lever, Ashby, Workable & Personio Jobs Scraper avatar

Greenhouse, Lever, Ashby, Workable & Personio Jobs Scraper

Pricing

from $1.50 / 1,000 jobs

Go to Apify Store
Greenhouse, Lever, Ashby, Workable & Personio Jobs Scraper

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

Carina Hatton

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

17 hours ago

Last modified

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:

PlatformEndpointNotes
GreenhouseJob Board API, boards-api.greenhouse.io/v1/boards/{board}/jobsDocumented public API. Salary comes from pay transparency ranges when the company publishes them.
LeverPostings 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.
AshbyPublic 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.
WorkablePublic 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.
PersonioXML job feed, {company}.jobs.personio.de/xmlThe 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.

FieldWhat it does
companiesCareers page URLs or platform:slug entries. Anything that isn't one of the five platforms is skipped with a warning.
keywordsKeep jobs whose title, department or team contains any of these words.
locationsKeep jobs whose location text contains any of these (e.g. Berlin, United States).
departmentsKeep jobs whose department or team contains any of these.
remoteOnlyKeep only remote jobs.
postedSinceA date (2026-10-01) or a period (7 days, 2 weeks, 1 month).
maxItemsTotal cap on saved jobs. 0 means no limit.
maxItemsPerCompanyCap per board, newest first.
includeDescriptionAdds the description as HTML and plain text. On by default; turn it off for smaller output.
fetchCompanyNamesLook up display names for Lever, Ashby and Personio boards (one small extra request per board). On by default.
personioLanguageLanguage 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 Technologies instead of palantir). If that page can't be read, or fetchCompanyNames is off, you get the slug. The slug is always in companySlug.
  • 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, TEMPORARY or OTHER. The original value is in employmentTypeRaw. 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.