ATS Job Scraper | Greenhouse, Lever, Ashby & 3 More
Pricing
from $0.75 / 1,000 job scrapeds
ATS Job Scraper | Greenhouse, Lever, Ashby & 3 More
Collect jobs from 6 ATS — Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters and Personio — in one dataset. Seniority, published salary, filters, and new and closed jobs flagged between runs for hiring alerts and company watchlists.
Pricing
from $0.75 / 1,000 job scrapeds
Rating
0.0
(0)
Developer
Scopras Data Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Extract current job openings directly from the public APIs behind Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters and Personio career pages. The Actor detects the ATS from each careers URL, normalizes all six vendors into one dataset, flags new and closed jobs between runs, applies filters before billing, and reports unread boards separately instead of silently treating them as companies with no jobs.
Use it for job boards, recruiting research, talent-market analysis, lead generation, hiring-signal monitoring, and scheduled company watchlists. No browser rendering, proxy rotation, or job-board scraping is required.
What it does
- Reads multiple Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters and Personio boards in one run.
- Normalizes company, role, location, remote status, department, employment type, date, description excerpt, and application URL.
- Adds seniority (intern … executive, from the title or the ATS's own level) and salary where the ATS publishes it (Lever, Ashby, Recruitee). Pay is never estimated.
- Change tracking: every job carries
isNewagainst your previous run of that board, and postings that disappeared come back as freeclosedrows. Turn on Only new jobs for a cheap daily hiring alert. - Filters by posting age, title keywords, remote status, and a per-company cap.
- Charges only for job rows that survive your filters.
- Writes a free problem row when a board URL is invalid, unavailable, or returns an unexpected format.
- Stops cleanly when the run reaches the user's maximum charge.
Quick start
Paste one or more public careers-page URLs. The Actor identifies the vendor and company slug automatically.
{"companies": ["https://job-boards.greenhouse.io/automatticcareers","https://jobs.lever.co/example","https://jobs.ashbyhq.com/example","https://bunq.recruitee.com","https://jobs.smartrecruiters.com/Ubisoft2","https://personio.jobs.personio.de"],"maxJobsPerCompany": 100,"postedWithinDays": 30,"titleContains": ["engineer", "developer"],"remoteOnly": true}
You can also provide an explicit vendor and slug, such as lever:company-slug, when you do not have the full URL.
Input
| Field | Description |
|---|---|
| companies | Required list of careers URLs from Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters or Personio (or vendor:slug). |
| maxJobsPerCompany | Maximum matching jobs saved for each company. Default: 100. |
| postedWithinDays | Keep jobs from the last N days. Use 0 to keep all dated jobs. |
| titleContains | Keep titles containing at least one supplied term, case-insensitive. |
| remoteOnly | Keep only jobs the ATS explicitly identifies as remote. |
| trackChanges | Remember each board between runs: isNew on jobs, free closed rows for removed postings. Default: on. |
| onlyNewJobs | Push only jobs that are new since the last run (the first run for a board returns everything). |
A job with no vendor-published date is kept by the recency filter because an unknown date is not evidence that the posting is old. Likewise, missing remote information is not converted to false; remoteOnly keeps only roles the source positively identifies as remote.
Output
The default dataset contains two row types:
- job — one normalized public job posting. This is the only billable row type.
- problem — a free diagnostic row containing the company, ATS, attempted endpoint, and reason the board could not be read.
- closed — a free row for a posting that was on the board last run and is gone now.
Each job can include board, company, id, title, location, remote, department, team, employmentType, postedAt, url, a plain-text description excerpt, seniority, isNew, and salaryMin / salaryMax / salaryCurrency / salaryPeriod / salaryText where published. Fields remain absent when the ATS does not publish them; the Actor does not invent or infer missing facts.
Use the dataset view selector to switch between Jobs and Companies not read, then export JSON, CSV, Excel, XML, or HTML.
Pricing
This Actor uses pay-per-event pricing with platform usage included:
- $0.01 per run start at the default 512 MB memory.
- $0.00075 per saved job — $0.75 per 1,000 matching jobs.
- Problem rows and filtered-out jobs are free.
Example totals at the default memory: 100 jobs cost about $0.085, 1,000 jobs cost $0.76, and 10,000 jobs cost $7.51. Users can set a maximum charge per run; the Actor honors that limit and stops early when necessary.
Reliability and limits
The Actor reads documented public ATS endpoints rather than scraping a third-party job board. This makes runs fast and avoids selector and anti-bot failures. A wrong slug, temporary outage, or unexpected response is returned as a problem row, so an unread board is never misrepresented as zero openings.
Only public, listed jobs are returned. Ashby postings marked as unlisted are skipped. Salary is included only if the selected vendor exposes it through the normalized fields; no compensation data is inferred. Descriptions are HTML-stripped excerpts limited to 600 characters.
Use the data responsibly and comply with applicable laws, source terms, and privacy requirements. Do not use the Actor to collect private or access-controlled listings.
Automation
Schedule recurring runs in Apify Console, trigger the Actor through the API, or connect it to webhooks, Make, Zapier, Google Sheets, Slack, or your own recruiting pipeline. The structured schema works well for incremental hiring monitors and AI agents.
FAQ
Why is a company in Companies not read?
The careers URL may use an unsupported ATS, the slug may be wrong, the public endpoint may be unavailable, or the vendor may have changed its response shape. Check the free problem row for the attempted endpoint and exact reason.
Are filtered jobs charged?
No. A job is charged only after it passes all selected filters and is written to the dataset.
Where can I get help?
Open the Actor's Issues tab with the careers URL, run ID, and expected behavior. Include no secrets or private data.