ATS Job Board Scraper: Greenhouse, Lever, Ashby & Workable
Pricing
$1.00 / 1,000 job scrapeds
ATS Job Board Scraper: Greenhouse, Lever, Ashby & Workable
Scrape open jobs from Greenhouse, Lever, Ashby, Workable, and SmartRecruiters in one normalized JSON/CSV schema. Filter by role, location, or only-new.
Pricing
$1.00 / 1,000 job scrapeds
Rating
0.0
(0)
Developer
Almandine Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Unified ATS Job Scraper: Greenhouse, Lever, Ashby, Workable & SmartRecruiters
Scrape open job postings from 5 major Applicant Tracking Systems (Greenhouse, Lever, Ashby, Workable, and SmartRecruiters) into one normalized JSON/CSV schema in a single run. Built for recruiting agencies, job boards, B2B sales signals, and AI agents — with no login, cookies, or browser overhead.
What it does
Pass company board URLs, ats:slug pairs (e.g. greenhouse:airbnb, lever:spotify, ashby:ramp), or bare company slugs (auto-detected across all 5 ATS platforms). Filter by title/department/location regex and enable onlyNew: true on a schedule so you only receive and pay for newly posted jobs.
Use cases
- Niche Job Boards & Aggregators: Ingest jobs from hundreds of companies across Greenhouse, Lever, Ashby, Workable, and SmartRecruiters without maintaining 5 separate scrapers or schemas.
- B2B Buying-Intent & Hiring Signals: Detect when target accounts open key roles (e.g.
Security Engineer,RevOps,Data Platform,VP Sales) to trigger timely outbound sequences. - Recruiting & Headhunting Automation: Run hourly or daily with
onlyNew: trueto spot newly opened requisitions before competing agencies. - Compensation & Remote Work Analytics: Analyze structured
compensationranges (Ashby/Lever) andworkplaceType(remote,hybrid,onsite) across tech companies.
Why use this scraper?
| Feature | This Actor | Single-ATS / HTML Job Scrapers |
|---|---|---|
| ATS coverage | 5 ATS platforms in 1 Actor (Greenhouse, Lever, Ashby, Workable, SmartRecruiters) | Requires 5 separate actors with incompatible schemas |
| Architecture | Official public JSON board APIs (curl_cffi, 200 jobs in ~3 seconds) | Fragile browser scraping that breaks on career page redesigns |
| Incremental state | Built-in onlyNew state store skips previously seen jobs at $0.00 | Re-bills the entire job board on every run |
| Pricing model | Pay-per-result ($1.50 / 1,000 jobs, $0.00 start fee) | $20–$49/month per ATS |
Input parameters
- Companies (
companies,array): Board URLs (https://boards.greenhouse.io/stripe),ats:slug(ashby:linear), or bare slugs (figma). - Title filter (regex) (
titleFilter,string): Case-insensitive regex matched against job title (e.g.(senior|staff).*engineer). - Location filter (regex) (
locationFilter,string): Case-insensitive regex matched against location or workplace type (e.g.remote|new york). - Department filter (regex) (
departmentFilter,string): Case-insensitive regex matched against department/team. - Posted within (days) (
postedWithinDays,integer): Keep only jobs published/updated within the last N days. - Include full job description (
includeDescription,boolean): AttachdescriptionHtmlanddescriptionText(defaulttrue). - Only new jobs (
onlyNew,boolean): Skip jobs already returned in earlier runs. - Max jobs (
maxItems,integer): Cap total emitted jobs across all companies (default5000).
Example input
{"companies": ["greenhouse:airbnb", "lever:spotify", "ashby:ramp"],"includeDescription": false,"onlyNew": false,"maxItems": 200}
Output & example output
One dataset row per job posting. Default table view columns: company, ats, title, department, location, workplaceType, employmentType, compensation, publishedAt, applyUrl.
Example output item
{"id": "78d8b7f3e688e1bd","ats": "greenhouse","company": "airbnb","jobId": "7789554","title": "Associate Legal Counsel, Japan","url": "https://careers.airbnb.com/positions/7789554?gh_jid=7789554","location": "Tokyo, Japan","department": null,"team": null,"employmentType": null,"isRemote": false,"postedAt": "2026-04-13T04:49:05-04:00","updatedAt": "2026-09-29T20:00:54-04:00","descriptionText": null}
Pricing (Pay-Per-Result)
This Actor uses transparent Pay-Per-Event pricing with a $0.00 actor-start fee:
| Event | What is charged | Price |
|---|---|---|
job-result | One normalized job posting emitted | $0.0015 / job ($1.50 / 1,000 results) |
apify-actor-start | Actor start fee | $0.00 |
Concrete pricing math
job-result:1,000 results = $1.50(50 results = $0.075,200 results = $0.30,10,000 results = $15.00). Apify's $5.00/month Free Tier covers up to 3,333 jobs/month at $0.00.- Empty runs (
0results), filtered-out jobs, & already-seen jobs (onlyNew: true): $0.00.
Data and compliance
Queries only official public job-board JSON endpoints exposed by Greenhouse, Lever, Ashby, Workable, and SmartRecruiters for candidate applications. No candidate PII or private recruiter data is accessed. Per-company errors are recorded in the run's ERRORS key-value record and are never charged.
FAQ
What if I don't know which ATS a company uses?
Pass the bare company slug (e.g. "airbnb" or "ramp"), and the Actor automatically probes Greenhouse, Ashby, Lever, Workable, and SmartRecruiters in parallel.
What happens if I run the Actor with empty {} input via API or CLI?
Default companies (["greenhouse:airbnb", "lever:spotify", "ashby:ramp"]) are built into .actor/input_schema.json and the runner, so an empty {} run immediately returns 200+ live jobs.