ATS Jobs Scraper
Pricing
Pay per usage
ATS Jobs Scraper
Unified job board scraper for 6 major ATS platforms: Greenhouse, Lever, Ashby, Workable, SmartRecruiters, and Recruitee. Extract open roles, structured salary ranges, remote status, locations, and hiring signals in a single unified schema without API keys.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
BigiByte
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee
Paste a careers URL, an ats:slug pair, or a bare company domain. This actor collects every open job from Greenhouse, Lever, Ashby, Workable, SmartRecruiters, and Recruitee, and saves them in one schema: title, location, remote, department, salary, posted date, and description.
Salary shows up when the company actually publishes it.
What it does
One career page scraper for six ATS platforms. You can mix boards in a single run. A Lever link, a Greenhouse slug, an Ashby org, a Workable account, a Recruitee subdomain, and a SmartRecruiters company id all land in the same dataset.
Failed boards do not stop the run. A missing or wrong slug becomes an error row (NOT_FOUND, or NO_JOBS_OR_WRONG_ID when SmartRecruiters returns zero jobs). Each company is also written to a COMPANIES summary as {ats, slug, jobCount, status}, which is the hiring-signal rollup.
Use cases
- Job boards and aggregators that need public postings from several ATS platforms in one place.
- Recruiter sourcing: filter by title, location, department, and a posted-after date, then export the shortlist.
- B2B sales teams working from hiring signals. See which companies are opening roles, and in which teams, before you reach out.
- Salary and market research, for the roles where a company lists pay.
- Job alerts: schedule the actor and send new rows to Sheets, Slack, or a webhook.
Input
| Parameter | Type | Default | Description |
|---|---|---|---|
startUrls | array | Ashby Ramp and Lever Spotify | Careers URLs, ats:slug pairs, or company domains. Required. |
atsHint | string | auto | Force one ATS, or leave auto-detect on. |
keywords | array | empty | Case-insensitive match on the job title. Any keyword qualifies. |
locations | array | empty | Case-insensitive match against location text. |
remoteOnly | boolean | false | Keep only jobs the ATS marks remote. |
departments | array | empty | Case-insensitive match against the department. |
postedAfter | string | empty | Keep jobs posted on or after this date. |
includeDescription | boolean | true | Include the full job description in each row. |
descriptionFormat | string | text | text, markdown, or html. |
maxItems | integer | 500 | Total jobs saved this run. Hard cap 5,000. |
maxJobsPerCompany | integer | 1000 | Cap per company. |
maxConcurrency | integer | 5 | Companies processed at once. Hard cap 5. |
timeoutSecs | integer | 300 | Run time limit. Jobs already saved are kept. |
requestTimeoutSecs | integer | 30 | Time limit for each board. Raise it for very large boards. |
proxyConfiguration | object | No proxy | Optional proxy settings. Off by default. |
Example input
{"startUrls": ["https://jobs.ashbyhq.com/ramp","https://jobs.lever.co/spotify","greenhouse:airbnb","https://apply.workable.com/huggingface/","https://bunq.recruitee.com","https://careers.smartrecruiters.com/BoschGroup","stripe.com"],"keywords": ["engineer"],"remoteOnly": false,"includeDescription": true,"descriptionFormat": "text","maxItems": 500,"maxJobsPerCompany": 1000,"maxConcurrency": 5,"proxyConfiguration": { "useApifyProxy": false }}
stripe.com is best effort. A direct greenhouse:stripe form is the most reliable when you already know the slug.
Output
Each job is one dataset row. The title is stored twice: title for the brief's field name, and itemTitle for the dataset view (Apify reserves the name title in the schema). Both values match.
{"ats": "ashby","atsSlug": "ramp","jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245","title": "Security Engineer, Cloud","itemTitle": "Security Engineer, Cloud","company": "ramp","location": "New York, NY (HQ)","locations": ["New York, NY (HQ)", "Remote (Canada)", "Remote (US)", "Miami, FL"],"country": "USA","remote": true,"workplaceType": "Hybrid","department": "Engineering","team": "Backend","employmentType": "FullTime","salaryMin": 211400,"salaryMax": 290600,"salaryCurrency": "USD","salaryInterval": "1 YEAR","salaryText": "$211.4K - $290.6K","salarySource": "structured","postedAt": "2026-04-07T17:12:35.753+00:00","url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245","applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application"}
A bad input looks like this and does not fail the run:
{"sourceInput": "https://jobs.lever.co/plaid", "ats": "lever", "error": "NOT_FOUND"}
Views: jobs (company, title, location, remote, department, salary, posted date, URL), salaries, and errors.
Dataset exports and Apify integrations cover Google Sheets, Airtable, Make, n8n, and webhooks. Point a webhook at the default dataset when a scheduled run should feed a job alert.
The COMPANIES summary holds one record per board: ats, slug, jobCount, and status (OK, EMPTY, FILTERED, NOT_FOUND, or NO_JOBS_OR_WRONG_ID).
Supported ATS
| ATS | What to paste | Slug |
|---|---|---|
| Greenhouse | https://job-boards.greenhouse.io/airbnb or https://boards.greenhouse.io/airbnb | airbnb |
| Lever | https://jobs.lever.co/spotify | spotify |
| Ashby | https://jobs.ashbyhq.com/ramp | ramp |
| Workable | https://apply.workable.com/huggingface/ | huggingface |
| SmartRecruiters | https://careers.smartrecruiters.com/BoschGroup | BoschGroup (case-sensitive) |
| Recruitee | https://bunq.recruitee.com | bunq |
If you are looking for a greenhouse jobs scraper, a lever jobs scraper, an ashby jobs scraper, a workable jobs scraper, a smartrecruiters scraper, or a recruitee scraper, the slug is the first path segment or the subdomain on the careers host.
SmartRecruiters company ids are case-sensitive. A wrong id returns zero jobs and is recorded as NO_JOBS_OR_WRONG_ID. For SmartRecruiters, descriptions are optional and controlled by includeDescription.
Limits
Public postings only. No candidate data, and nothing private.
The free cap is 5,000 jobs per run (maxItems). maxJobsPerCompany defaults to 1,000, which matters on very large boards like Bosch Group on SmartRecruiters (thousands of postings).
Salary data is only as good as what the company published. Many boards leave it empty.
Concurrency stays at or below 5.
FAQ
How do I find a company's slug?
Open the careers page and read the host. jobs.lever.co/spotify means Lever and spotify. jobs.ashbyhq.com/ramp means Ashby and ramp. If the company hides the ATS on its own domain, paste the domain anyway.
Why is salary empty? The company did not publish salary for that role. That is common.
How many jobs can one run save?
5,000 total, and by default 1,000 per company. Raise requestTimeoutSecs if a very large board is slow. timeoutSecs stops the run and keeps rows already saved.
Why is SmartRecruiters slower when descriptions are on?
Including descriptions makes a SmartRecruiters run slower. Turn includeDescription off if you only need title, location, and date.
What happens if the slug is wrong?
You get an error row, not a failed run. Empty boards (a Lever company that moved, a Workable account with zero jobs) are stored as EMPTY on the company summary and do not look like a crash.
Related tools
If you plan to act on these rows, enriching the companies with contact and email data or a quick CSV cleanup are the usual next steps. BigiByte also builds scrapers for other job boards and company data when you need them as a separate job.
Need another data source, a scheduled job monitor, or a custom pipeline? BigiByte builds custom scrapers and APIs: https://bigibyte.com
Trademark Notice
Greenhouse, Lever, Ashby, Workable, SmartRecruiters, and Recruitee and related names, logos, and trademarks belong to their respective owners. Their use in this documentation is solely to identify the source of the data and does not imply affiliation, sponsorship, endorsement, or partnership.
Disclaimer
This Actor is an independent tool and is not affiliated with, endorsed by, sponsored by, or otherwise officially associated with Greenhouse, Lever, Ashby, Workable, SmartRecruiters, and Recruitee.
Is web scraping legal?
Collecting information that is already public is generally legal. Scraping is not the same thing as hacking, and there is no single law that bans it. The limits are the usual ones: do not break into accounts, do not take private or confidential data, and be careful with personal data and copyrighted works. A site's terms can also restrict how you access it. Facts such as a public name, price, or rating are not the same thing as republishing someone's article or photo.
This actor collects information that is already publicly available. It does not access private or protected data.
This is not legal advice. For the longer explanation, see Apify's article Is web scraping legal?.