Career Page Jobs Scraper for Workday, Greenhouse and Lever

CleanScrape · @cleanscrape

Open jobs from company career pages on Workday, Greenhouse, Lever and five more systems, with salaries and new or closed jobs.

About

Get every open job straight from companies' own career pages, as a clean table you can download as CSV, Excel or JSON. Paste careers links, company websites or company names. The Actor finds each company's job board on Workday, Greenhouse, Lever, Ashby, Workable, Recruitee, Personio or Teamtailor, reads it, and returns one row per job:

  • title, department and team;
  • locations with city, country and country code;
  • remote, hybrid or on-site;
  • salary range with currency and pay period, when the company publishes it;
  • employment type, posted date, job link and apply link;
  • the full description.

Run it on a schedule with a watch name and every job says whether it is new since the last run, while jobs that are no longer listed are reported separately.

Jobs come from the company's own job board, so there are no reposts, aggregator duplicates or expired listings. No account, cookies, proxy or API key is needed. This is an independent tool, maintained by CleanScrape.

Start with a small run

The form opens with three companies, given three different ways: a website (figma.com), a job board link (jobs.lever.co/spotify) and a company name (Ramp). It saves up to 50 jobs per company. Start it as it is, then paste your own companies.

  1. In Companies, add one company per line.
  2. Optional: narrow down with Job titles containing, Locations, Workplace or Posted within.
  3. Start the run and open its dataset for the jobs. The COMPANIES record in the run's key-value store shows how each line was matched.

What you can paste

You pasteWhat happens
A job board link: nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite, boards.greenhouse.io/figma, jobs.lever.co/spotify, jobs.ashbyhq.com/ramp, apply.workable.com/huggingface, bunq.recruitee.com, tado.jobs.personio.de, a Teamtailor career siteThat board is read directly. A link to a single job works too.
A company website: figma.com, www.podimo.comThe site's pages are checked for a link to its job board, as far as the site's robots.txt allows. If none is linked, the website's name is tried as below.
A company name: Ramp, Hugging FaceLikely board names are tried on every system except Workday, and a board is used only if its own company name matches what you typed. Workday career site addresses can't be guessed from a name: paste the link, or the company website if it links to its Workday site.

No guessing. If a board exists under that name but belongs to a different company name, it is not read: the COMPANIES record lists it as not confirmed, with its link, so you can paste it if it is the right one. If several boards carry the same name (for example a "RAMP" board with one job next to Ramp's real board with 171), the one with the most open jobs is used and the others are listed. A board with no open jobs is never used for a name, since empty accounts under famous names are common. On Workable, Recruitee, Personio and Teamtailor, where anyone can open a board under any name, a name match also needs at least 3 open jobs, or for a website, jobs that mention that website. Every company row says how its board was found: your link, a link on the company's page, or the board's name.

Inputs that can't be read are explained, not silently dropped: SmartRecruiters (its robots.txt asks crawlers not to use its job API), iCIMS, Taleo, LinkedIn and job boards like Indeed are not supported. A Workday site is read only where its robots.txt allows it.

Filters

All filters are optional.

  • Job titles containing: each line is a set of words that must all appear in the title, in any order. data engineer matches "Senior Engineer, Data Platform".
  • Leave out titles containing: for example intern, director.
  • Locations: cities, regions, countries or two-letter country codes (London, Germany, US, Remote). A country also matches jobs whose location shows it without naming it, such as a US state (Austin, TX) or Remote - US.
  • Workplace: remote, hybrid or on-site. Jobs whose board does not say are left out when this is set.
  • Departments or teams.
  • Posted within (days). Jobs without a posting date are kept.
  • Jobs per company: the newest first.

Monitor companies for new and closed jobs

Give the run a Watch name (for example engineering-jobs) and schedule it with the same list, daily or weekly.

  • The first run saves every job as the starting point (changeStatus: first-check).
  • Later runs mark each job new or seen. Turn on Only new jobs to save just the new ones.
  • Jobs that disappeared from a board go to the CLOSED_JOBS record in the run's key-value store, with when they were first and last seen.

A job is reported as no longer listed only after a complete read of its board. If a board could not be read in full, nothing is marked closed, and the COMPANIES record says so. A job that is no longer listed may have been filled, paused or moved; the board does not say which.

The watch is kept in your own Bytewells account (a named key-value store), and two runs of the same watch never overlap.

What each job contains

FieldMeaning
title, company, department, teamAs published on the job board. company is empty when the board shows no company name (some companies use Lever only behind their own careers page)
location, city, country, countryCode, locationsThe first location, and every location of the job
workplaceTyperemote, hybrid or onsite, from the board's own field. Empty when the board doesn't say. Greenhouse has no such field, so a Greenhouse job is remote only when its location says Remote
employmentType, employmentTypeTextfull-time, part-time, contract, temporary or internship, plus the board's own wording
salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryTextThe published pay range
salarySourcestructured (the board's pay field: Lever, Ashby, Recruitee, Greenhouse with the salary option) or description (a currency range written in the job text). Empty means no pay was published, never zero
postedAt, updatedAtDates from the board (UTC)
jobUrl, applyUrlThe job page and where to apply
descriptionText, descriptionHtmlFull text; the original HTML too if you ask for it
extraBoard-specific extras: Greenhouse offices and requisition ID, Workday requisition ID and hiring entity, Workable function and experience, Personio seniority and years of experience, Recruitee hours per week
system, board, boardUrlWhich job board the job came from
changeStatus, firstSeenAtWith a watch name: new, seen or first-check, and when the watch first saw the job

The COMPANIES record has one entry per line you entered: the board found and how, jobs on the board, jobs matching your filters, jobs saved, new and closed jobs, whether the board was read completely, and a note when something could not be read. SUMMARY gives the run's status and totals as JSON.

Coverage by system
SystemSalaryWorkplacePosted dateNotes
GreenhouseFrom the description; structured ranges with the salary optionFrom the location text onlyYesBoards hosted in the EU have no public API and are reported as unsupported
LeverStructured, when publishedYesYes
AshbyStructured, when publishedYesYes
WorkableFrom the descriptionYesYes
RecruiteeStructured, when publishedYesYes
PersonioFrom the description–YesSeniority, schedule and years of experience
TeamtailorFrom the descriptionYes (for the newest 100)YesThe job feed shows the newest 100 jobs; larger career sites are completed from their job list, one page per remaining job
WorkdayFrom the descriptionWhen the company fills it inYesNo department. Requisition ID and hiring entity in extra. Each job's details take one request, so 1,000 Workday jobs take about 5 minutes

Large Workday sites. Workday lists 20 jobs per request and at most 2,000 per search. Sites with more jobs are listed in parts (by job family or country) when you use a watch, or when Jobs per company is above 2,000; otherwise the newest 2,000 are enough to pick from. Workday only shows "Posted 30+ Days Ago" for older jobs, so among those the order is not exact. A run that reaches its time limit saves the jobs read so far and says how many were left; give the run a longer timeout for very large sites (2,000 jobs take about 11 minutes). With a watch, a site of more than 500 jobs is listed in full once a week to find closed jobs, and every run in between checks it for new jobs only, which takes a few requests. Before a job is reported closed, the site is searched for its ID, so a job missed while the site was changing is not reported closed by mistake.

Examples

Engineering jobs at seven AI companies, with salaries where published:

{
  "companies": [
    "https://jobs.ashbyhq.com/openai",
    "https://job-boards.greenhouse.io/anthropic",
    "https://jobs.ashbyhq.com/perplexity",
    "https://jobs.ashbyhq.com/elevenlabs",
    "https://jobs.ashbyhq.com/cohere",
    "https://jobs.lever.co/mistral",
    "https://apply.workable.com/huggingface/"
  ],
  "titleKeywords": ["engineer"],
  "maxJobsPerCompany": 200
}

Only remote jobs from ten tech companies:

{
  "companies": [
    "gitlab.com",
    "supabase.com",
    "https://jobs.ashbyhq.com/posthog",
    "vercel.com",
    "https://jobs.ashbyhq.com/sentry",
    "https://jobs.ashbyhq.com/zapier",
    "https://apply.workable.com/doist/",
    "linear.app",
    "https://jobs.ashbyhq.com/mercury",
    "https://job-boards.greenhouse.io/remote"
  ],
  "workplaceTypes": ["remote"]
}

A daily watch of five fintech competitors: schedule it, and each run saves only new jobs and reports closed ones:

{
  "companies": [
    "stripe.com",
    "ramp.com",
    "https://job-boards.greenhouse.io/brex",
    "https://jobs.ashbyhq.com/mercury",
    "plaid.com"
  ],
  "watchName": "fintech-competitors",
  "onlyNewJobs": true,
  "includeDescription": false
}

US engineering salaries from five company boards:

{
  "companies": [
    "https://job-boards.greenhouse.io/stripe",
    "https://job-boards.greenhouse.io/coinbase",
    "https://job-boards.greenhouse.io/datadog",
    "https://job-boards.greenhouse.io/cloudflare",
    "https://job-boards.greenhouse.io/airbnb"
  ],
  "titleKeywords": ["engineer"],
  "locations": ["United States"],
  "includeDescription": false
}

Jobs at European startups on Personio, Recruitee, Teamtailor and Workable:

{
  "companies": [
    "https://1komma5grad.jobs.personio.de/",
    "https://ottonova.jobs.personio.de/",
    "https://bunq.recruitee.com/",
    "https://channable.recruitee.com/",
    "careers.podimo.com",
    "lightyear.com",
    "https://tado.jobs.personio.de/"
  ],
  "maxJobsPerCompany": 100
}

Pricing

$29 a month to rent it, after a 3-day free trial. Cancel at any time; access runs to the end of the month you paid for.

Runs use compute, paid from your Bytewells credit at Bytewells' rates, separately from the rental. No proxy is used. In tests on Bytewells, three companies (399 jobs) used $0.0005 of credit, seven AI companies (520 jobs) $0.0005, and 100 jobs from a large Workday site $0.0017 (Workday reads each job separately).

There is no charge per job or per company, so large lists and daily watches cost the same rental.

Use it from the API

The Actor runs through the Bytewells API, which works with Apify's API clients: point the client's base URL at Bytewells (see Bytewells docs) and call cleanscrape/career-site-jobs-scraper with an input from the examples above. The jobs are in the run's default dataset; COMPANIES and CLOSED_JOBS are JSON records in its key-value store.

Common questions

Where do the jobs come from?

From each company's own job board on Workday, Greenhouse, Lever, Ashby, Workable, Recruitee, Personio or Teamtailor. These systems publish companies' open jobs so they can be shown on careers pages; Lever's documentation notes that published postings may be read by third parties, and Greenhouse states that job board data is publicly available. No login, cookies or bot checks are involved.

Which companies are covered?

Any company whose careers page runs on one of the eight systems. There is no fixed list: paste the companies you care about. The COMPANIES record tells you when a company uses a system that isn't supported.

How fresh are the jobs?

They are read live from the job board when the run starts, not from an index updated once a day.

Can I find a company's job board without knowing its system?

Yes. Paste the website or the company name; the COMPANIES record shows which board was found and how.

Can I export to Excel or Google Sheets?

Yes. Download the run's dataset as Excel, CSV or JSON, or read it from the API into a sheet. Schedule the run with a watch name to keep a list of new jobs.

What does a run cost on top of the rental?

Only the compute it uses, from your Bytewells credit. Test runs used $0.0005 to $0.0017 each.

Is it legal?

The Actor reads job postings that companies publish publicly on their job boards, at a gentle pace, and it follows each company website's robots.txt. Check the rules that apply to how you store and use the data. This is not legal advice.

Good to know

  • Times are UTC.
  • A company can show the same job in several locations; that is one row with several locations, also when the job board lists it once per location.
  • If a job board changes its format, the run says which board could not be read instead of saving wrong rows.

Support

CleanScrape maintains this Actor and fixes it when a job board changes. If something looks wrong, email [email protected] with the run ID and the company or job board affected. Never include API tokens or private data.

Disclaimer

This Actor is an independent tool developed by CleanScrape. It is not affiliated with, endorsed by, or sponsored by Workday, Greenhouse, Lever, Ashby, Workable, Recruitee, Personio, Teamtailor or the companies whose jobs it reads. Trademarks belong to their owners and are used only to identify supported sources.

More tools from CleanScrape

FAQ

Which job boards are supported?
Workday, Greenhouse, Lever, Ashby, Workable, Recruitee, Personio and Teamtailor. Paste a careers link, a company website or a company name; the COMPANIES record shows which board was found and how.
How do I track new and closed jobs?
Give the run a watch name and schedule it with the same list. Each job says whether it is new since the last run, and jobs no longer listed go to the CLOSED_JOBS record, only after a complete read of the board.
Does it include salaries?
When the company publishes them: from the board's pay field (Lever, Ashby, Recruitee, Greenhouse with the salary option) or from a currency range in the job text. An empty salary means none was published, never zero.
What does a run cost on top of the rental?
Only the compute it uses, from your Bytewells credit. No proxy is used. Test runs used $0.0005 to $0.0017 each.
Why are LinkedIn or Indeed not supported?
This Actor reads companies' own job boards, so there are no reposts or expired listings. Job sites like LinkedIn and Indeed, and boards whose robots.txt asks crawlers to stay away, are not read.

More Actors from the same publisher.

View all from @cleanscrape