Greenhouse, Lever, Ashby & Workday Job Board Scraper
Pricing
from $0.96 / 1,000 job records
Greenhouse, Lever, Ashby & Workday Job Board Scraper
Scrape every open position from company career sites on Greenhouse, Lever, Ashby, Workday or SmartRecruiters via their public job-board APIs: title, location, department, salary, posted date, description snippet, apply link. Keyword + location filters, incremental mode, first record in ~1 s.
Pricing
from $0.96 / 1,000 job records
Rating
0.0
(0)
Developer
Matthew Curtis
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Share
Also SmartRecruiters — five ATS platforms, one Actor.
Scrape every open position from any company career site hosted on Greenhouse, Lever, Ashby, Workday or SmartRecruiters — five applicant-tracking systems behind tens of thousands of career pages — through their public job-board APIs. No browser, no login, no HTML parsing: a whole Greenhouse, Lever or Ashby board arrives in one request, so the first job record lands in about a second and a 1,000-job board costs a few seconds of compute.
Paste career-site URLs (or a single job URL for an instant lookup), optionally filter by keywords and location, and get one clean record per job: title, company, location(s), country, remote / hybrid / onsite, department, team, employment type, salary range when the company publishes one, requisition id, posted and updated dates, a description snippet and the apply link. Ids are stable across runs, so scheduled runs with knownIds only pay for new postings.
What it does
| ATS | Career-site URL shape | Transport | Jobs per request |
|---|---|---|---|
| Greenhouse | boards.greenhouse.io/<company>, job-boards.greenhouse.io/<company>, …/embed/job_board?for=<company> | Job Board API (boards-api.greenhouse.io) | whole board (content + pay ranges) |
| Lever | jobs.lever.co/<company>, jobs.eu.lever.co/<company> | Postings API (api.lever.co) | whole board |
| Ashby | jobs.ashbyhq.com/<company> | Posting API (api.ashbyhq.com) with compensation | whole board |
| Workday | <tenant>.wd<n>.myworkdayjobs.com/[<locale>/]<site> | the career site's own JSON (/wday/cxs/…/jobs) | 20 per page (+1 per job with details) |
| SmartRecruiters | jobs.smartrecruiters.com/<Company>, careers.smartrecruiters.com/<Company> | Posting API (api.smartrecruiters.com) | 100 per page (+1 per job with details) |
A single job URL on any of the five (…/airbnb/jobs/8306554, jobs.lever.co/palantir/<uuid>, jobs.ashbyhq.com/openai/<uuid>, a Workday /job/<location>/<title>_<REQ> link, jobs.smartrecruiters.com/<Company>/<id>-…) returns that one job. The short forms greenhouse:airbnb, lever:palantir, ashby:openai, smartrecruiters:BoschGroup work too.
Custom-domain career pages (careers.example.com) are out of scope unless they are one of the hosted URLs above — the Actor cannot know which ATS sits behind an arbitrary domain. Open the company's "View all jobs" link and paste the hosted URL instead.
Input
| Field | Type | Default | Description |
|---|---|---|---|
boards | string[] | ["https://boards.greenhouse.io/airbnb"] | Career-site URLs, single job URLs or ats:company short forms. Several boards share maxItems. |
query | string | — | Keywords: every word must appear in the title, department, team, location or employment type (case-insensitive). Workday and SmartRecruiters are also searched server-side first, so large boards stay cheap. |
location | string | — | Keep only jobs whose location text, country code or workplace type contains this (London, US, remote). |
maxItems | integer | 500 | Total records to return across all boards (1–10,000). |
fetchDetails | boolean | false | Workday and SmartRecruiters list rows carry no description; turn this on to open each of their jobs (one extra request per job) for the description snippet, employment type and country. Greenhouse, Lever and Ashby lists already contain everything, so no extra requests are made for them. |
knownIds | string[] | [] | id values you already have: skipped without a request, and a page made only of known ids stops pagination. |
proxyConfiguration | object | Apify Proxy | Datacenter proxies work; the APIs are public. |
Output
One record per job. Field names follow the convention shared by all mdcurt Actors (id, url, title, location, postedAt, description ≤ 300 chars, kind, source, scrapedAt).
{"kind": "listing","id": "ashby:openai:240d459b-696d-43eb-8497-fab3e56ecd9b","ats": "ashby","board": "openai","company": null,"url": "https://jobs.ashbyhq.com/openai/240d459b-696d-43eb-8497-fab3e56ecd9b","applyUrl": "https://jobs.ashbyhq.com/openai/240d459b-696d-43eb-8497-fab3e56ecd9b/application","title": "Research Engineer","location": "San Francisco","locations": ["San Francisco"],"country": "United States","remote": null,"workplaceType": null,"department": "Research","team": "Research","employmentType": "FullTime","salary": "$250K – $445K • Offers Equity","salaryMin": 250000,"salaryMax": 445000,"currency": "USD","requisitionId": null,"postedAt": "2025-04-05T00:03:20.653Z","updatedAt": null,"description": "By applying to this role, you will be considered for Research Engineer roles across all teams at OpenAI…","source": { "ats": "ashby", "board": "openai" },"scrapedAt": "2026-11-02T00:24:49.000Z"}
idis<ats>:<board>:<native id>(Greenhouse job id, Lever/Ashby UUID, Workday requisition id such asJR2028280, SmartRecruiters posting id) — stable across runs and safe to feed back asknownIds.salary/salaryMin/salaryMax/currencyare filled only when the company publishes a range (Ashby compensation, Greenhouse pay-transparency ranges, Lever salary ranges). Workday and SmartRecruiters do not expose structured pay.postedAtis the board's publish date; Workday only says "Posted N Days Ago", which is converted to a date at day precision (nullfor "30+ Days Ago").workplaceTypeisremote/hybrid/onsitewhen the board states it (or the title/location says so), otherwisenull.kindislistingfor list-call records anddetailfor Workday/SmartRecruiters jobs opened withfetchDetails.
The key-value store holds a SUMMARY record: boards by ATS, jobs seen and filtered out, pages stopped by known ids, duplicates, failed requests, p95 latency, time to first record and compute seconds.
Pricing
Pay per event: $0.005 per run start + $0.0012 per job record (tier discounts for paid plans). A one-job lookup costs $0.0062; a full 800-job Ashby board costs under $1. That is 40 % under the $0.002 median of Greenhouse/Lever/Ashby/Workday scrapers on the Store because a whole board is one request — there is no browser and no per-job fetch to pay for.
Monitoring new postings cheaply (incremental mode)
Schedule the Actor and pass the id values of your last dataset as knownIds: known jobs are skipped without a request, and on Workday / SmartRecruiters pagination stops at the first page made only of known ids, so a daily run pays for new postings only. Pair it with mdcurt/dataset-diff-monitor to get an alert when a company opens, changes or closes a role.
Speed (live tests, datacenter egress)
- One-job lookup: first record in 0.9 s, run done in ~4 s.
- Lever board, 301 jobs, keyword filter: 60 records in 8.5 s (the Lever API returns full descriptions, ~6 MB for a 300-job board).
- Ashby + Greenhouse, 949 jobs, location filter: 150 records, first in 1.2 s, run done in 5 s (~5,000 records/minute).
- Workday + SmartRecruiters with details: 80 detail records in 27 s (~180 records/minute, 85 requests).
- Seven boards, 3,000 records with details: see
tests.md.
Limitations
- Only the five hosted ATS URL shapes above; custom-domain career pages, Workable (rate-limited from datacenter IPs), Taleo, iCIMS, SuccessFactors and BambooHR are not supported in this version.
- Description is a ≤ 300-character plain-text snippet, never the full posting (link to
urlfor the rest). E-mail addresses and phone numbers that appear in posting text are redacted. - Workday tenants that require a locale or a non-standard site path work when you paste the exact career-site URL; the Actor keeps the locale you give it.
- Keyword matching is per word against title/department/team/location/employment type; it is not a full-text search of descriptions (Workday and SmartRecruiters are narrowed server-side with the same words first).
- Ashby has no single-job endpoint: a single Ashby job URL fetches the board once and returns that job.
Changelog
- 1.0.0 — first release: Greenhouse, Lever, Ashby, Workday, SmartRecruiters; keyword + location filters; details for Workday/SmartRecruiters; incremental
knownIds; salary fields.