Greenhouse, Lever & Workday Jobs Scraper: 11 ATS Platforms avatar

Greenhouse, Lever & Workday Jobs Scraper: 11 ATS Platforms

Pricing

Pay per event

Go to Apify Store
Greenhouse, Lever & Workday Jobs Scraper: 11 ATS Platforms

Greenhouse, Lever & Workday Jobs Scraper: 11 ATS Platforms

Get open jobs from company career pages on Greenhouse, Lever, Ashby, Workday and 7 more ATS platforms in one schema: title, department, location, remote, posting date, salary where published. Paste a careers URL or a company website; $1.50 per 1,000 jobs.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Changefeeds Tools

Changefeeds Tools

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

Share

  • What you get: the open jobs on a company's public job board (up to Max jobs per company, default 1,000), in one schema: title, department, team, locations, remote flag, employment type, posting date, apply URL, structured salary where the platform publishes it, and optionally the full description.
  • Works on 11 ATS platforms: Greenhouse, Lever, Ashby, Workday, Workable, SmartRecruiters, Recruitee, BambooHR, Personio, Teamtailor and Breezy HR. Paste a careers-page URL, or just a company website and the actor finds the board.
  • Price: $1.50 per 1,000 jobs, plus $0.001 per company checked. Boards that are not found or fail are free.

Sample output

The prefilled input (GitLab on Greenhouse and Spotify on Lever, 10 jobs each), run on 2026-10-23, returned 20 job rows. Six of them:

platform / board_tokentitledepartmentlocationremoteemployment_typeposted_at
greenhouse / gitlabAccount Executive - FranceEMEA - CommercialRemote, Francetruenull2026-10-02
greenhouse / gitlabAssociate Renewals Manager, IndiaRenewalsRemote, Indiatruenull2026-09-30
greenhouse / gitlabBackend Engineer, Create: Source Code Experience (Ruby)DevOps EngineeringRemote, Canadatruenull2026-08-13
lever / spotifyAgency Development Lead - FranceAdvertisingParisfalsePermanent2026-10-16
lever / spotifyAV Engineer - PlatformEngineeringStockholmfalsePermanent2026-10-09
lever / spotifyBackend Engineer - Data PlatformEngineeringStockholmfalsePermanent2026-10-01

One row in full:

{
"type": "job",
"company": "lever:spotify",
"platform": "lever",
"board_token": "spotify",
"job_id": "785989a6-b219-43b1-92d9-750a67054f24",
"title": "AV Engineer - Platform",
"department": "Engineering",
"team": "IT and Network Engineering",
"location": "Stockholm",
"locations": ["Stockholm"],
"remote": false,
"employment_type": "Permanent",
"salary_min": null,
"salary_max": null,
"salary_currency": null,
"salary_period": null,
"posted_at": "2026-10-09T09:18:28.142Z",
"updated_at": null,
"url": "https://jobs.lever.co/spotify/785989a6-b219-43b1-92d9-750a67054f24",
"scraped_at": "2026-10-23T03:56:54.990Z"
}

Where the platform publishes structured pay, the salary fields are filled. A row from Ramp's Ashby board (live run, 2026-09-30):

{
"type": "job",
"company": "ashby:ramp",
"platform": "ashby",
"board_token": "ramp",
"job_id": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"title": "Security Engineer, Cloud",
"department": "Engineering",
"team": "Backend",
"location": "New York, NY (HQ)",
"locations": ["New York, NY (HQ)", "Remote (Canada)", "Remote (US)", "Miami, FL"],
"remote": true,
"employment_type": "FullTime",
"salary_min": 211400,
"salary_max": 290600,
"salary_currency": "USD",
"salary_period": "year",
"posted_at": "2026-04-07T17:12:35.753Z",
"updated_at": null,
"url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"scraped_at": "2026-09-30T03:53:18.482Z"
}

How to run in 30 seconds

  1. Click Try for free. The input already holds https://boards.greenhouse.io/gitlab and lever:spotify, 10 jobs each.
  2. Click Start. Our test run of that input took 17 seconds and cost $0.032 (2 companies, 20 jobs).
  3. Open the Output tab, or export the dataset as CSV, JSON or Excel.

For your own list, replace the companies with careers-page URLs (any job URL on the board works too), platform:token references, or company websites such as ramp.com. Raise Max jobs per company (default 1,000) for whole boards, and use Title keywords, Locations, Remote jobs only or Posted within (days) to filter before you pay.

Pricing

  • $0.0015 per job returned ($1.50 per 1,000 jobs).
  • $0.001 per company checked: a board read successfully, including boards with no matching jobs.
  • Free: status rows for boards that are not found, websites without a detectable ATS, errors, invalid entries and companies skipped by your budget.
  • Filters are applied before rows are written, so filtering in the actor is cheaper than filtering afterwards.

Examples:

  • 20 companies, 50 jobs each: 20 × $0.001 + 1,000 × $0.0015 = $1.52.
  • 200 companies with a keyword filter leaving about 10 jobs each: 200 × $0.001 + 2,000 × $0.0015 = $3.20.
  • 100 companies where nothing matches: 100 × $0.001 = $0.10.

Maximum total charge. If you set one, the actor returns only as many rows as fit, then stops cleanly: remaining companies get a free skipped_budget row, OUTPUT.stopped_reason is max_total_charge_reached and OUTPUT.incomplete is true. A company's job rows are delivered before its company-checked charge, so you are never charged for a board that delivered nothing.

FAQ

How do I find a company's board token? Open the company's careers page and click a job: the URL usually shows the platform and token (jobs.lever.co/<token>/…, boards.greenhouse.io/<token>/jobs/…). Paste that URL as is, or just give the company's website.

Can I scrape a Workday careers site? Yes. Paste the careers-site URL, e.g. https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite. The wdN number and the site id come from that URL.

Why did a company return fewer jobs than its careers page shows? Check your filters and Max jobs per company, then OUTPUT.companies[]: jobs_found is the board's own count and jobs_matched the count after filters. A careers page can also combine several boards; each board is a separate entry.

Does it return salary? Only when the ATS publishes structured pay data (numbers, currency and period): Ashby, Lever salaryRange, Recruitee salary. Pay mentioned only in the description text is returned as-is with descriptions on, not parsed into the salary fields.

Can it tell me which jobs are new since last week? Not this actor; every run returns the current board. Our companion Job Postings Monitor reports only added, removed and changed roles between runs.

Is this allowed? The actor reads public job-board endpoints that companies publish so their jobs can be found, at a polite rate. You are responsible for how you use the data.

Limits

  • Public job boards only. It does not scrape LinkedIn, Indeed, Glassdoor or other job sites, never logs in, and cannot see internal or unlisted postings (Ashby postings marked unlisted are skipped).
  • Only the 11 platforms below. iCIMS, Taleo, SuccessFactors, Jobvite, Eightfold and custom career sites are not supported. Greenhouse's EU-hosted boards (job-boards.eu.greenhouse.io) are not supported yet.
  • Auto-detection can miss. It looks at 4 pages at most and finds boards that are linked, embedded or redirected to. Custom career sites that load jobs from their own backend (GitLab's is one), or sit behind bot protection, come back ats_not_found; pass the board URL directly.
  • Workday and SmartRecruiters are paginated. Big boards take many requests; paging stops once Max jobs per company matching jobs are found.
  • Some filters need the job page. Workday multi-location jobs ("5 Locations"), Workday jobs without a remote type or older than "30+ days", and BambooHR jobs (no country or date in the list) are checked against their job page before being dropped: one extra request per job, at most 500 per company. Jobs left unchecked are counted in OUTPUT.companies[].jobs_unresolved.
  • Descriptions cost requests on some platforms. Workday, SmartRecruiters and BambooHR need one request per job for the description. Breezy's public feed has no description (null).
  • Field coverage differs by platform. Greenhouse has no remote flag (it is read from the location text) or employment type, Workday has no department, Personio and Teamtailor have no salary. Missing fields are null, never guessed.
  • Polite by design: at most 2 requests at a time per host, a short gap between requests, HTTP 429 and 5xx retried with backoff (Retry-After honoured up to 60 s), 20 s timeouts, and a User-Agent that identifies the actor.

Supported platforms

PlatformCareers-page URL shapes you can pasteShorthandPublic endpoint used
Greenhousehttps://boards.greenhouse.io/<token>, https://job-boards.greenhouse.io/<token>, …/embed/job_board?for=<token>greenhouse:<token>boards-api.greenhouse.io/v1/boards/<token>/jobs
Leverhttps://jobs.lever.co/<site>lever:<site>api.lever.co/v0/postings/<site>
Ashbyhttps://jobs.ashbyhq.com/<org>ashby:<org>api.ashbyhq.com/posting-api/job-board/<org>
Workdayhttps://<tenant>.wd5.myworkdayjobs.com/<site> (any wdN, optional /en-US/ locale), https://wdN.myworkdaysite.com/recruiting/<tenant>/<site>workday:<tenant>.wd5/<site>…/wday/cxs/<tenant>/<site>/jobs (paginated)
Workablehttps://apply.workable.com/<account>workable:<account>apply.workable.com/api/v1/widget/accounts/<account>
SmartRecruitershttps://careers.smartrecruiters.com/<company>, https://jobs.smartrecruiters.com/<company>smartrecruiters:<company>api.smartrecruiters.com/v1/companies/<company>/postings (paginated)
Recruiteehttps://<company>.recruitee.comrecruitee:<company><company>.recruitee.com/api/offers/
BambooHRhttps://<company>.bamboohr.com/careersbamboohr:<company><company>.bamboohr.com/careers/list
Personiohttps://<company>.jobs.personio.de (or .com)personio:<company><company>.jobs.personio.de/xml
Teamtailorhttps://<company>.teamtailor.comteamtailor:<company><company>.teamtailor.com/jobs.rss
Breezy HRhttps://<company>.breezy.hrbreezy:<company><company>.breezy.hr/json

Tested live on 2026-09-30 (job counts are what each board listed that day): GitLab on Greenhouse (201), Spotify on Lever (79), Ramp on Ashby (155), NVIDIA on Workday (2,000, Workday's reported total), Skroutz on Workable (11), Bosch on SmartRecruiters (4,825), bunq on Recruitee (16), Gusto on BambooHR (5), Pulse Group on Personio (14), Polestar on Teamtailor (30), Euler on Breezy HR (19). Auto-detection found figma.com → Greenhouse, notion.so → Ashby, ramp.com → Ashby and polestar.com → Teamtailor.

Auto-detection from a company website

For an entry like ramp.com or https://www.figma.com, the actor loads at most 4 pages, without retries: the exact page you gave (when the URL has a path), the homepage, the first careers link on it (same domain or a subdomain), /careers and /jobs. It stops at the first page that links to, embeds or redirects to a supported job board; if several boards are referenced, the most-referenced one wins. The page it was found on is reported in OUTPUT.companies[].detected_on. If nothing is found, the company gets a free ats_not_found row.

Input reference

FieldDefaultNotes
companiesrequiredCareers-page URLs, platform:token references or company websites, up to 1,000 per run. Duplicates are skipped.
keywordsnoneKeep jobs whose title contains any of these (case-insensitive).
locationsnoneKeep jobs with a location containing any of these (case-insensitive substring), e.g. Berlin, United Kingdom, Remote.
remoteOnlyfalseKeep only remote jobs (see remote below).
postedWithinDaysnoneKeep only jobs posted in the last N days. Jobs without a posting date are left out when this is set.
includeDescriptionfalseAdd description: plain text, HTML stripped, capped at 20,000 characters.
maxJobsPerCompany1000At most this many jobs (after filters) per company.
{
"companies": [
"figma.com",
"https://jobs.ashbyhq.com/ramp",
"https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
"smartrecruiters:BoschGroup"
],
"keywords": ["engineer", "data scientist"],
"remoteOnly": true,
"postedWithinDays": 30,
"maxJobsPerCompany": 200
}

Output reference

  • company is your input entry, exactly as you typed it.
  • description is present only when includeDescription is on.
  • salary_* are filled only when the platform publishes structured compensation. Free-text salary strings are never parsed.
  • remote is the platform's own flag where it has one (Lever, Ashby, Workable, SmartRecruiters, Recruitee, Teamtailor, Breezy, BambooHR, Workday when listed). Otherwise it is true when a location or the title says "Remote", and null (unknown) when nothing says either way.
  • posted_at / updated_at are ISO 8601 (UTC) or null. BambooHR's list has no dates; the job page does, and it is fetched when you ask for descriptions or set postedWithinDays. Workday lists only "Posted N days ago": the actor turns that into a date (accurate to about a day) and leaves "30+ days ago" as null; with descriptions on, the exact start date from the job page is used.
  • locations lists every location the platform gives. Workday lists multi-location jobs as "5 Locations"; locations is then empty unless descriptions are requested.

Companies that yield no job rows get one free status row each (type: "company"):

statusMeaningCharged
ok_no_jobsBoard read; it has no open jobs, or none matched your filters (jobs_found says how many it has)company-checked only
not_foundNo such board on that platformno
ats_not_foundWebsite checked, no supported job board foundno
errorThe board or website failed to load (message in error)no
invalidNot a recognizable entry, or a website whose detected board is already in the runno
skipped_budgetYour maximum total charge was reached before this companyno

Every run leaves at least one row. The key-value store record OUTPUT holds the run summary: per-company platform, board_token, status, jobs_found, jobs_matched, jobs_returned, error, detected_on; totals; charged_events; stopped_reason (completed, max_total_charge_reached or emit_failure) and incomplete.