ATS Jobs Scraper: Greenhouse, Lever, Ashby & more
Pricing
from $2.50 / 1,000 job saveds
ATS Jobs Scraper: Greenhouse, Lever, Ashby & more
Scrape and monitor jobs straight from employers' Greenhouse, Lever, Ashby, SmartRecruiters and Workable boards via their public APIs. Auto-detects the ATS. Filters, salary, normalised output, new-jobs-only mode. No LinkedIn.
Pricing
from $2.50 / 1,000 job saveds
Rating
0.0
(0)
Developer
Phuc Tiet
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 days ago
Last modified
Categories
Share
ATS Jobs Scraper: Greenhouse, Lever, Ashby, SmartRecruiters & Workable jobs API
Scrape and monitor job postings directly from employers' own applicant tracking systems (ATS). Give it company names, careers page URLs or job-board links. It auto-detects whether each company uses Greenhouse, Lever, Ashby, SmartRecruiters or Workable, pulls every open job from the platform's official public job-board API, and returns one clean, normalised dataset: title, company, location, remote/hybrid, department, employment type, salary, dates, apply URL, and the full description as text and HTML.
Run it on a schedule with "New jobs only" monitoring and you get only the jobs that appeared (or changed, or closed) since the last run. That's ideal for job alerts, hiring-signal sales tools, recruiting pipelines, job boards and labour-market research.
No LinkedIn, no Indeed, no logins, no proxies. Data comes straight from the employer's job board, through endpoints the ATS vendors publish for exactly this purpose.
Why use this job scraper?
- ✅ 5 ATS platforms in one Actor. Greenhouse jobs, Lever jobs, Ashby jobs, SmartRecruiters jobs and Workable jobs, in one schema.
- 🔎 Automatic ATS detection. Type
Stripe, pastehttps://www.notion.so/careersorstripe.com, and the Actor finds the right board (careers pages are scanned for embedded Greenhouse/Lever/Ashby/SmartRecruiters/Workable widgets). No need to know board tokens. - 🧹 Normalised output. The same fields for every platform:
employmentTypemapped tofull-time / part-time / contract / internship / temporary,workplaceTypetoremote / hybrid / onsite, ISO dates, country names and codes, and structured salary (salaryMin,salaryMax,salaryCurrency,salaryInterval). - 💰 Salary when published. Ashby compensation, Lever salary ranges and Greenhouse pay-transparency ranges, plus a careful fallback that reads pay ranges from the description (marked
salarySource: "description"). - 🔔 Job monitoring. "New only" or "new + changed" mode, with optional "removed" rows for closed jobs. State lives in a named key-value store in your account, so schedules just work.
- 🎯 Filters: keywords (title or description, regex supported), excluded words, locations, remote/hybrid/on-site, departments, employment types, posted within N days, max jobs per company.
- 🛡️ Robust: retries with backoff,
Retry-Aftersupport, per-platform rate limits, dedupe across inputs, and a per-input run summary that says exactly what was found and what wasn't. - 💸 Cheap and predictable: $2.50 per 1,000 jobs. In monitoring mode you only pay for new or changed jobs.
What can I use it for?
| Use case | How |
|---|---|
| Job alerts / job monitoring | Schedule daily or hourly with monitorMode: "new", then send new rows to Slack, email or a webhook via Apify integrations |
| Hiring signals for B2B sales | Watch target accounts for roles like "data engineer" or "RevOps"; a new role means a buying signal |
| Niche job boards & aggregators | Pull jobs from hundreds of companies' ATS boards into your site, with apply URLs pointing back to the employer |
| Recruiting & sourcing | Track competitors' open roles, teams and locations |
| Labour-market & salary research | Structured salary ranges, departments and locations across companies |
| AI agents / RAG | Clean text descriptions ready for LLMs, embeddings and matching |
How to use it
- Click Try for free.
- In Companies, careers pages or job boards, add one entry per line:
- an ATS board URL:
https://job-boards.greenhouse.io/airbnb,https://jobs.lever.co/palantir,https://jobs.ashbyhq.com/ramp,https://jobs.smartrecruiters.com/BoschGroup,https://apply.workable.com/huggingface - or
platform:token:greenhouse:airbnb,lever:palantir,ashby:ramp,smartrecruiters:BoschGroup,workable:huggingface(lever-eu:for Lever's EU region) - or a careers page / website:
https://www.notion.so/careers,stripe.com - or just a company name:
Figma,Spotify,Bosch Group
- an ATS board URL:
- Optionally set filters (keywords, locations, remote, departments, employment types, posted within days).
- Click Start. Download the jobs as JSON, CSV, Excel or XML, or read them via the API.
- For monitoring: set Monitoring mode to New jobs only and add a Schedule (e.g. daily at 08:00).
Input example
{"companies": ["https://jobs.ashbyhq.com/ramp","greenhouse:airbnb","https://www.notion.so/careers","Palantir","Bosch Group"],"keywords": ["engineer", "/data (scientist|analyst)/"],"excludeKeywords": ["intern"],"locations": ["London", "Remote", "AU"],"remote": "any","postedWithinDays": 30,"monitorMode": "new","monitorId": "my-daily-alert","descriptionFormat": "text"}
Output example
One row per job (description shortened):
{"id": "ashby:ramp:465799ed-c58b-4c6a-a290-2e95b52ef0bb","platform": "ashby","boardToken": "ramp","jobId": "465799ed-c58b-4c6a-a290-2e95b52ef0bb","title": "Tech Lead and Manager (TLM), Production Engineering","company": "Ramp","location": "New York, NY (HQ)","locations": ["New York, NY (HQ)", "San Francisco, CA", "Remote (US)"],"city": "New York City","region": "NY","country": "United States","countryCode": "US","isRemote": false,"workplaceType": "hybrid","department": "Engineering","team": "Engineering","employmentType": "full-time","employmentTypeRaw": "FullTime","salaryMin": 240000,"salaryMax": 330000,"salaryCurrency": "USD","salaryInterval": "year","salaryText": "$240K - $330K","salarySource": "ats","postedAt": "2026-09-28T23:10:15.801Z","updatedAt": null,"jobUrl": "https://jobs.ashbyhq.com/ramp/465799ed-c58b-4c6a-a290-2e95b52ef0bb","applyUrl": "https://jobs.ashbyhq.com/ramp/465799ed-c58b-4c6a-a290-2e95b52ef0bb/application","requisitionId": null,"descriptionText": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams…","descriptionHtml": "<h1><strong>About Ramp</strong></h1><p>Ramp is building…","changeType": "new","firstSeenAt": "2026-10-07T00:00:12.000Z","input": "https://jobs.ashbyhq.com/ramp","scrapedAt": "2026-10-07T00:00:12.000Z"}
The dataset has ready-made views: Jobs (overview table), Jobs with salary, Changes (monitoring) and All fields.
Run summary (key-value store → OUTPUT)
For every input you get the detected platform and board, how it was detected (input, website, name-search, domain-name-guess), a confidence, the number of jobs on the board / matching your filters / saved, new / changed / removed counts, other candidate boards, and a clear error for anything not found (e.g. "No Greenhouse/Lever/Ashby/SmartRecruiters/Workable board found… The company may use another ATS (e.g. Workday)").
Output fields
| Field | Description |
|---|---|
id | Stable unique ID platform:board:jobId (use it to dedupe across runs) |
platform, boardToken, jobId | Source ATS, board slug and the platform's job ID |
title, company | Job title and company name |
location, locations | Primary location and all listed locations |
city, region, country, countryCode | Structured location where the ATS provides it (country also inferred from location text) |
isRemote, workplaceType | true/false/null and remote / hybrid / onsite / null |
department, team | Department and team / function |
employmentType, employmentTypeRaw | Normalised type and the original value |
salaryMin, salaryMax, salaryCurrency, salaryInterval, salaryText, salarySource | Pay range when published (ats) or found in the description (description) |
postedAt, updatedAt | First published / last updated (ISO 8601) |
jobUrl, applyUrl | Job page and application URL on the employer's board |
requisitionId | Internal requisition / reference number when public |
descriptionText, descriptionHtml | Full description as clean text and original HTML |
changeType, firstSeenAt | Monitoring only: new, changed or removed, and when this job was first seen |
input, scrapedAt | Which input produced the row, and when |
How much does it cost?
Pay per event: $2.50 per 1,000 jobs saved ($0.0025 per job), plus Apify's tiny per-run start fee.
- 100 jobs ≈ $0.25; 10,000 jobs ≈ $25.
- Monitoring mode: you only pay for jobs returned (new or changed). Unchanged jobs are free, and so are "removed" rows.
- Boards that fail, inputs that aren't found, and jobs excluded by your filters are not charged.
- Set Max jobs in total or the run's maximum cost to cap spending. The Actor stops cleanly at the limit and remembers unsaved new jobs for the next monitored run.
Platforms and data sources
| Platform | Public endpoint used | Notes |
|---|---|---|
| Greenhouse | Job Board API boards-api.greenhouse.io/v1/boards/{token}/jobs | Docs: "Job Board data is publicly available, so authentication is not required for any GET endpoints." Pay ranges from the per-job pay-transparency field |
| Lever | Postings API api.lever.co/v0/postings/{site} (and api.eu.lever.co) | Public postings API documented by Lever on GitHub |
| Ashby | Public Job Posting API api.ashbyhq.com/posting-api/job-board/{name} | Includes compensation when the company publishes it |
| SmartRecruiters | Posting API api.smartrecruiters.com/v1/companies/{id}/postings | Public, no authentication. Description via the posting-details endpoint |
| Workable | Public published-jobs endpoint www.workable.com/api/accounts/{subdomain} | Documented in Workable Help; fetched gently (one request at a time) |
Not supported on purpose: Workday and other ATSs without a documented public jobs API, and LinkedIn/Indeed/Glassdoor.
FAQ
Is it legal to scrape these job boards?
This Actor only calls the job-board endpoints that Greenhouse, Lever, Ashby, SmartRecruiters and Workable publish so that employers' jobs can be shown on careers sites and job boards. It doesn't log in, bypass anything, or collect personal data about candidates. When it scans a company website to detect the ATS, it respects robots.txt. Job descriptions remain the employer's content; if you republish them, link back via jobUrl/applyUrl and follow the laws that apply to you.
How does company-name detection work?
It turns the name into likely board slugs (e.g. Hugging Face → huggingface, hugging-face) and asks each platform's public API whether that board exists. When the platform reports a company name (Greenhouse, SmartRecruiters, Workable), it's compared with yours (confidence: high). Lever and Ashby don't publish names (confidence: medium). For 100% accuracy, use the careers page URL or the board URL.
A company isn't found. Why? It probably uses another ATS (e.g. Workday, iCIMS, Taleo, SuccessFactors) or a custom careers site. The run summary lists what was checked. If you know the board URL, paste it directly.
How does monitoring work with filters? State is tracked per board (every open job, regardless of filters), so a job counts as "new" when it first appears on the board. If you later widen your filters, older jobs aren't re-sent; use a new Monitor ID to start fresh.
Can I monitor hundreds of companies?
Yes. Add them all (up to 2,000 inputs per run) and schedule the run; boards are fetched in parallel within each platform's rate limits. For very large lists, use board URLs or platform:token inputs to skip detection.
Can I use it from my code, Make, Zapier, n8n or an AI agent? Yes. Use the Apify API/SDKs, the official integrations, or the Apify MCP server. Each run returns a dataset you can fetch as JSON/CSV.
Other tools from the same developer
Found a bug or need another ATS? Open an issue on the Actor's Issues tab.