Greenhouse, Lever & Workday Jobs Scraper: 11 ATS Platforms
Pricing
Pay per event
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
2 days ago
Last modified
Categories
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_token | title | department | location | remote | employment_type | posted_at |
|---|---|---|---|---|---|---|
| greenhouse / gitlab | Account Executive - France | EMEA - Commercial | Remote, France | true | null | 2026-10-02 |
| greenhouse / gitlab | Associate Renewals Manager, India | Renewals | Remote, India | true | null | 2026-09-30 |
| greenhouse / gitlab | Backend Engineer, Create: Source Code Experience (Ruby) | DevOps Engineering | Remote, Canada | true | null | 2026-08-13 |
| lever / spotify | Agency Development Lead - France | Advertising | Paris | false | Permanent | 2026-10-16 |
| lever / spotify | AV Engineer - Platform | Engineering | Stockholm | false | Permanent | 2026-10-09 |
| lever / spotify | Backend Engineer - Data Platform | Engineering | Stockholm | false | Permanent | 2026-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
- Click Try for free. The input already holds
https://boards.greenhouse.io/gitlabandlever:spotify, 10 jobs each. - Click Start. Our test run of that input took 17 seconds and cost $0.032 (2 companies, 20 jobs).
- 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
| Platform | Careers-page URL shapes you can paste | Shorthand | Public endpoint used |
|---|---|---|---|
| Greenhouse | https://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 |
| Lever | https://jobs.lever.co/<site> | lever:<site> | api.lever.co/v0/postings/<site> |
| Ashby | https://jobs.ashbyhq.com/<org> | ashby:<org> | api.ashbyhq.com/posting-api/job-board/<org> |
| Workday | https://<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) |
| Workable | https://apply.workable.com/<account> | workable:<account> | apply.workable.com/api/v1/widget/accounts/<account> |
| SmartRecruiters | https://careers.smartrecruiters.com/<company>, https://jobs.smartrecruiters.com/<company> | smartrecruiters:<company> | api.smartrecruiters.com/v1/companies/<company>/postings (paginated) |
| Recruitee | https://<company>.recruitee.com | recruitee:<company> | <company>.recruitee.com/api/offers/ |
| BambooHR | https://<company>.bamboohr.com/careers | bamboohr:<company> | <company>.bamboohr.com/careers/list |
| Personio | https://<company>.jobs.personio.de (or .com) | personio:<company> | <company>.jobs.personio.de/xml |
| Teamtailor | https://<company>.teamtailor.com | teamtailor:<company> | <company>.teamtailor.com/jobs.rss |
| Breezy HR | https://<company>.breezy.hr | breezy:<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
| Field | Default | Notes |
|---|---|---|
companies | required | Careers-page URLs, platform:token references or company websites, up to 1,000 per run. Duplicates are skipped. |
keywords | none | Keep jobs whose title contains any of these (case-insensitive). |
locations | none | Keep jobs with a location containing any of these (case-insensitive substring), e.g. Berlin, United Kingdom, Remote. |
remoteOnly | false | Keep only remote jobs (see remote below). |
postedWithinDays | none | Keep only jobs posted in the last N days. Jobs without a posting date are left out when this is set. |
includeDescription | false | Add description: plain text, HTML stripped, capped at 20,000 characters. |
maxJobsPerCompany | 1000 | At 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
companyis your input entry, exactly as you typed it.descriptionis present only whenincludeDescriptionis on.salary_*are filled only when the platform publishes structured compensation. Free-text salary strings are never parsed.remoteis the platform's own flag where it has one (Lever, Ashby, Workable, SmartRecruiters, Recruitee, Teamtailor, Breezy, BambooHR, Workday when listed). Otherwise it istruewhen a location or the title says "Remote", andnull(unknown) when nothing says either way.posted_at/updated_atare ISO 8601 (UTC) ornull. BambooHR's list has no dates; the job page does, and it is fetched when you ask for descriptions or setpostedWithinDays. Workday lists only "Posted N days ago": the actor turns that into a date (accurate to about a day) and leaves "30+ days ago" asnull; with descriptions on, the exact start date from the job page is used.locationslists every location the platform gives. Workday lists multi-location jobs as "5 Locations";locationsis then empty unless descriptions are requested.
Companies that yield no job rows get one free status row each
(type: "company"):
status | Meaning | Charged |
|---|---|---|
ok_no_jobs | Board read; it has no open jobs, or none matched your filters (jobs_found says how many it has) | company-checked only |
not_found | No such board on that platform | no |
ats_not_found | Website checked, no supported job board found | no |
error | The board or website failed to load (message in error) | no |
invalid | Not a recognizable entry, or a website whose detected board is already in the run | no |
skipped_budget | Your maximum total charge was reached before this company | no |
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.