ATS Jobs Scraper & Monitor: Company Career Sites
Pricing
from $0.80 / 1,000 jobs
ATS Jobs Scraper & Monitor: Company Career Sites
Open jobs straight from company career sites on Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee, Personio, Teamtailor, Rippling, BambooHR and Breezy: one schema with salary, remote type and full description. Monitor for new and closed jobs.
Pricing
from $0.80 / 1,000 jobs
Rating
0.0
(0)
Developer
Koivu Data
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
a month ago
Last modified
Categories
Security
Limited permissionsShare

ATS Jobs Scraper & Monitor collects the open jobs of the companies you choose, straight from their career sites. It reads the public job board of the company's applicant tracking system (ATS), such as Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee, Personio, Teamtailor, Rippling, BambooHR or Breezy HR, and returns every job in one normalized schema: title, company, locations, remote or hybrid, department, employment type, salary when the employer publishes it, posting date, apply link and the full description as HTML, clean text and Markdown.
Built for monitoring: turn on Only new jobs, put the Actor on a schedule, and every run returns only the jobs that appeared since the previous run, plus, if you want, the jobs that were removed (closed). A run that finds nothing new costs only the $0.0005 start fee plus $0.0005 per company checked.
Try it now: the prefilled input reads 20 jobs each from Airbnb (Greenhouse), Palantir (Lever) and Ramp (Ashby) in a few seconds, for about $0.06.
- Paste a job board URL, an identifier such as
greenhouse:airbnb, a career page or domain, or a company name. The ATS is detected automatically - 12 ATSs, one output format. No login, no API keys, no browser and no proxies
- Only new jobs and removed jobs per company for scheduled monitoring. The memory is kept per saved task
- Filters: title keywords, exclude words, location or country, remote / hybrid / on-site, department and posted since
- Salary as numbers (min, max, currency, period) where the ATS publishes it, including Greenhouse pay ranges
- Clear errors for unknown boards, unsupported ATSs and invalid input. Companies that fail cost nothing
What data can you get from company career sites?

| Field | Example | Notes |
|---|---|---|
jobId | ashby:ramp:3f4509ad-... | Stable ID: ATS, board and the ATS's own job ID |
title, company | Product Manager | Procurement, Ramp | Company name as the ATS publishes it (see Limitations) |
url, applyUrl | https://jobs.ashbyhq.com/ramp/... | Job page and application link |
location, locations | New York, NY (HQ), ["New York, NY (HQ)", "San Francisco, CA"] | All locations of the job |
countryCode | US | ISO code from the ATS, or from the location text when the ATS gives none |
workplaceType, isRemote | hybrid, true | remote, hybrid, onsite or null when the employer does not say |
department, team | Product, Product Management | |
employmentType, employmentTypeText | FULL_TIME, FullTime | Normalized (FULL_TIME, PART_TIME, CONTRACT, TEMPORARY, INTERNSHIP, OTHER) and the ATS's own wording |
experienceLevel | Mid-Senior level | When the ATS has it |
salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryText | 230000, 325000, USD, YEAR, $230K - $325K | Only when the employer publishes a salary in the ATS |
postedAt, updatedAt | 2026-10-05T16:09:02Z | UTC. Some ATSs publish only a date (2026-07-30) |
requisitionId | JR2009401 | Employer's own requisition number, when public |
descriptionHtml, descriptionText, descriptionMarkdown | The full job description in three formats | |
changeType, firstSeenAt, lastSeenAt | NEW | Monitoring only: INITIAL, NEW or REMOVED |
ats, board, boardUrl, input, scrapedAt | ashby, ramp | Where the row came from |
The dataset has four ready-made views: Jobs, Salaries and locations, Monitoring: new and removed jobs and Descriptions (Markdown).
Supported applicant tracking systems
| ATS | Example input | Source | Notes |
|---|---|---|---|
| Greenhouse | https://job-boards.greenhouse.io/airbnb | Job Board API (documented) | Pay ranges when the employer publishes them |
| Lever | https://jobs.lever.co/palantir | Postings API (documented) | EU-hosted boards (jobs.eu.lever.co) too |
| Ashby | https://jobs.ashbyhq.com/ramp | Job Postings API (documented) | Compensation when published |
| SmartRecruiters | https://careers.smartrecruiters.com/BoschGroup | Posting API (documented) | One extra request per job for the description |
| Recruitee | https://bunq.recruitee.com | Careers Site API (documented) | Salary when published |
| Personio | https://ottonova.jobs.personio.de | XML job feed (documented) | Description in the company's default language, English or German as fallback |
| Workable | https://apply.workable.com/huggingface/ | Endpoint of Workable's official jobs widget | |
| Teamtailor | https://antonsport.teamtailor.com or a custom career site domain | The career site's RSS and JSON job feeds | Salary when published |
| Breezy HR | https://company.breezy.hr | The career portal's JSON feed | Tested only on Breezy's own demo portal (see Limitations) |
| Workday | https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite | Public JSON that the Workday career site itself loads | Undocumented; one extra request per job for the description |
| Rippling | https://ats.rippling.com/rippling/jobs | Public JSON of the Rippling job board | Undocumented; one extra request per job |
| BambooHR | https://company.bamboohr.com/careers | Public JSON of the BambooHR career site | Undocumented; one extra request per job |
Not supported yet: iCIMS, Oracle Taleo and Recruiting Cloud, SAP SuccessFactors, Jobvite, JazzHR, Pinpoint, JOIN, Comeet, Dayforce, UKG, Paylocity, Paycom, ADP, Avature, Phenom, Eightfold, HiBob, Factorial, Gem, Dover, Homerun, Zoho Recruit and Freshteam. Job sites such as LinkedIn, Indeed or Glassdoor are not ATSs and are not supported. Such inputs get a clear error message and cost nothing.
How to scrape jobs from company career sites
- Add one or more companies to Companies, one per line. The most reliable input is the job board URL (open the company's careers page, click one job and copy the address if it is on one of the hosts above).
- Set Max jobs per company. The most recently posted jobs come first.
- Optional: add filters (keywords, locations, remote / hybrid / on-site, departments, posted since).
- Click Start.
- Download the results as JSON, CSV, Excel or HTML from the run's Output or Storage tab, or read them through the API.
Which input should I use?
- Job board URL (
https://jobs.lever.co/palantir): exact, no guessing. For Workday use the URL of the job list, which includes the career site name. - Identifier (
greenhouse:airbnb,lever:palantir,smartrecruiters:BoschGroup): the same thing, shorter. - Career page or domain (
https://stripe.com/jobs,stripe.com): the Actor reads the page and follows a link or embed of a supported job board. Many career pages load their job list with JavaScript, so when no link is found the Actor looks the company name up instead (next point) and says so in the run summary. - Company name (
Hugging Face): looked up on Greenhouse, Lever, Ashby, Workable, Recruitee, Teamtailor and Breezy HR. The board with the most jobs wins, and the run summary lists other boards with the same name. Check that it is the right company. Workday, SmartRecruiters, Personio, Rippling and BambooHR boards need the URL.
How to monitor companies for new and removed jobs
- Save your input as a task and enable Only new jobs since the last run. Enable Also report removed (closed) jobs if you want those too.
- Create a schedule for the task, for example daily.
- Connect an integration (Slack, Google Sheets, Zapier, Make, n8n or a webhook) to receive each run's changes.

The first run returns the current jobs that match your filters (marked INITIAL) and remembers every job on each board. Turn off Return current jobs on the first monitoring run to start silently. Later runs return only jobs that appeared since the previous run (NEW) and, if enabled, one row per job that is gone (REMOVED, with lastSeenAt). If more new jobs exist than Max jobs per company or your cost limit allows, the rest come in the next run.
Before a job is reported as removed, the Actor checks the job's own page in the ATS where one exists (Greenhouse, Lever, SmartRecruiters, Workday, Workable, Rippling, BambooHR). Paginated APIs and caches sometimes drop a job for a moment or serve two versions of a re-published job; those are not reported. A board that suddenly lists 0 jobs is checked again in the next run before its jobs are reported as removed.
Hiring signals for sales and competitive intelligence
A company that opens five data engineering roles in a month is buying data tools; a company that closes all sales roles is probably freezing headcount. Monitor a list of target accounts or competitors with keyword filters (engineer, data, security) and send the NEW and REMOVED rows to your CRM or a spreadsheet.
How much does it cost to scrape job postings?
This Actor uses pay per event pricing. Apify platform usage is included in these prices.
| Event | Free and Bronze tiers | Silver tier | Gold tier and higher |
|---|---|---|---|
| Actor start | $0.0005 per run | $0.0005 | $0.0005 |
| Company checked (a job board read successfully) | $0.0005 per company ($0.50 per 1,000) | $0.00045 | $0.0004 |
Job saved (one dataset row, including REMOVED rows) | $0.001 per job ($1.00 per 1,000) | $0.0009 | $0.0008 |
Your discount tier comes from your Apify subscription plan. Examples at the Free and Bronze tier prices:
- The prefilled run (3 companies × 20 jobs): 60 jobs + 3 companies + start = about $0.06.
- All open jobs of 100 companies with about 80 jobs each: 8,000 jobs + 100 companies + start = about $8.05.
- Monitoring 50 companies daily with about 15 new or removed jobs a day in total: 30 runs × (50 × $0.0005 + $0.0005) = $0.77, plus 450 rows × $0.001 = $0.45, so about $1.22 per month.
Never charged: companies that fail (unknown board, unsupported ATS, invalid input) and jobs removed by your filters. You can cap any run with Maximum cost per run in the run options; the Actor stops cleanly at the cap.
Is there a free ATS job scraper?
Most ATS job board APIs are free to call, and you can write your own script for one ATS. This Actor is not free, but it saves you writing and maintaining twelve integrations, the normalization and the monitoring memory. Apify's Free plan includes $5 of usage credit every month, which covers about 4,800 jobs with this Actor.
Limitations
We prefer to tell you up front:
- Only companies that use a supported ATS. Custom-built career sites (Google, Amazon, Apple and many large employers) are not supported.
- This is not a search across all companies. You choose the companies. The Actor does not search every job board for a keyword.
- Finding the board from a career page works only when the page links to or embeds a supported board in its HTML. Many pages load jobs with JavaScript; then the Actor falls back to a name lookup, which can match a different company with the same name. The run summary says how each board was found.
- Company names: Lever, Ashby and BambooHR do not publish a company name in their API, so the Actor reads it from the board's page title. Workday publishes none at all:
companyis the Workday tenant ID, for examplenvidia. - Salary is returned only when the employer publishes it as a structured field in the ATS (common on Greenhouse, Ashby, Lever and Recruitee in pay-transparency regions). Salaries written only inside the description text are not parsed. For Greenhouse pay ranges the period is known only when the range title says it (for example "Annual").
- Workday, Rippling and BambooHR use undocumented endpoints of their career sites, which can change without notice. They also need one request per job for the description, so they are slower: in our test Workday returned about 4–5 jobs per second with descriptions. Turn off Include full job description for fast listings.
- Workday boards with more than 2,000 jobs: Workday's search returns at most 2,000 results. The Actor splits the search by a filter category (for example job family) to read the rest. In our test it read 2,690 of the 2,692 jobs NVIDIA reported; jobs opening or closing during the run explain small gaps, and the summary says when a board was not read completely.
- Workday without descriptions gives approximate posting dates ("Posted 5 Days Ago") and no country code. Department is not available from Workday.
- Country code comes from the ATS when it has one; otherwise it is inferred from the location text ("Austin, TX" is US). It can be
null. - Workplace type is returned only when the employer states it or the location says "Remote".
- Personio shows a bot check page instead of an error for unknown company names. The Actor reports this as "not found".
- Breezy HR could be tested only on Breezy's own demo portal, because we did not find a public customer portal at the time of testing. If your Breezy portal does not work, please open an issue.
- Monitoring memory is kept per saved task, per company and per filter set. Changing the filters starts a new memory. Removed jobs are reported for jobs that matched your filters.
Input
{"companies": ["https://job-boards.greenhouse.io/airbnb","lever:palantir","https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],"maxJobsPerCompany": 200,"keywords": ["engineer", "data"],"locations": ["US", "Remote"],"workplace": "any","postedSince": "30 days","includeDescription": true,"onlyNewJobs": false}
| Input | Description |
|---|---|
companies | Job board URLs, ats:board identifiers, career page URLs, domains or company names. Required. |
maxJobsPerCompany | Maximum jobs saved per company, most recently posted first (default 200). |
includeDescription | Description as HTML, text and Markdown (default on). Off makes Workday and SmartRecruiters much faster. |
onlyNewJobs | Monitoring: return only jobs that are new since the previous run of the same task. |
includeRemovedJobs | Monitoring: also return jobs that were removed (closed). |
returnExistingJobsOnFirstRun | Monitoring: whether the first run returns the current jobs (default on). |
keywords, excludeKeywords | Words or phrases in the job title (whole words, case-insensitive). |
searchInDescription | Match keywords in the description too. |
locations | Words in the location: city, region, country name or two-letter code, or Remote. |
workplace | any, remote (fully remote only), hybrid, remoteOrHybrid or onsite. |
departments | Words in the department or team. |
postedSince | Absolute (2026-09-01) or relative (7 days, 24 hours). Jobs without a published date are dropped. |
stateKey | Advanced: name of the monitoring memory slot (defaults to the task ID). |
Output
One job (description shortened):
{"jobId": "ashby:ramp:3f4509ad-1858-478b-a7fb-bcd792d9575a","ats": "ashby","board": "ramp","company": "Ramp","title": "Product Manager | Procurement","url": "https://jobs.ashbyhq.com/ramp/3f4509ad-1858-478b-a7fb-bcd792d9575a","applyUrl": "https://jobs.ashbyhq.com/ramp/3f4509ad-1858-478b-a7fb-bcd792d9575a/application","location": "New York, NY (HQ)","locations": ["New York, NY (HQ)", "San Francisco, CA"],"countryCode": "US","isRemote": true,"workplaceType": "hybrid","department": "Product","team": "Product Management","employmentType": "FULL_TIME","employmentTypeText": "FullTime","experienceLevel": null,"salaryMin": 230000,"salaryMax": 325000,"salaryCurrency": "USD","salaryPeriod": "YEAR","salaryText": "$230K - $325K","postedAt": "2026-10-05T16:09:02Z","updatedAt": null,"requisitionId": null,"descriptionHtml": "<h1><strong>About Ramp</strong></h1><p>Ramp is building the smart infrastructure for finance teams ...","descriptionText": "About Ramp\n\nRamp is building the smart infrastructure for finance teams ...","descriptionMarkdown": "# About Ramp\n\nRamp is building the smart infrastructure for finance teams ...","changeType": null,"firstSeenAt": null,"lastSeenAt": null,"input": "https://jobs.ashbyhq.com/ramp","boardUrl": "https://jobs.ashbyhq.com/ramp","scrapedAt": "2026-10-05T17:23:19Z"}
Every run also saves a summary to the key-value store record OUTPUT: for each company the detected ATS and board, how it was found, open jobs on the board, jobs matching your filters, jobs saved, new and removed counts, notes, and a clear reason for every company that failed.
Use cases
- Job aggregators and niche job boards: pull complete, structured postings straight from the source, with descriptions ready for your pages.
- Sales prospecting: hiring is a buying signal. Watch target accounts for new roles in the team you sell to.
- Competitive intelligence: see which teams competitors are growing or shrinking, and in which countries.
- Recruiting and labor-market research: salary ranges, remote share, seniority and locations across a set of employers.
- AI agents and LLM pipelines: clean Markdown descriptions and a stable schema for question answering, matching or summaries.
Use it from Python, JavaScript, n8n or AI agents
Job postings API in Python
Run the Actor through the Apify API and get the jobs back as JSON.
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("koivu-data/company-jobs-ats-scraper").call(run_input={"companies": ["greenhouse:airbnb", "lever:palantir"], "maxJobsPerCompany": 50, "keywords": ["engineer"]})for job in client.dataset(run["defaultDatasetId"]).iterate_items():print(job["company"], job["title"], job["location"], job["url"])
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('koivu-data/company-jobs-ats-scraper').call({companies: ['greenhouse:airbnb', 'lever:palantir'],maxJobsPerCompany: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
n8n, Make and Zapier
Use Apify's integration for n8n, Make or Zapier to start the Actor or a saved task and pass the jobs to the next step. For monitoring, schedule the task in Apify and let the integration react to each finished run.
AI agents (MCP)
AI agents connected to the Apify MCP server can find this Actor by searching for ATS jobs or Greenhouse jobs and call it as a tool to list or monitor a company's open roles.
FAQ
Is it legal to scrape company job postings?
The Actor reads job postings that companies publish for the public through their ATS's job board endpoints, without logging in or bypassing any access control, and at a moderate request rate. Job descriptions are written by employers and can include a contact name or email; make sure you have a legitimate purpose for storing them and follow applicable laws such as the GDPR. If you are unsure, consult a lawyer.
Does it collect recruiter or applicant data?
No. The Actor does not output recruiter or hiring-manager names, even where an ATS publishes them, and it never touches applicant data. The only personal data that can appear is what the employer wrote into the job description itself.
How do I find a company's job board URL?
Open the company's careers page and click any job. If the address starts with job-boards.greenhouse.io, jobs.lever.co, jobs.ashbyhq.com, myworkdayjobs.com, smartrecruiters.com or another host in the table above, paste the part up to the company name. You can also paste the careers page or just the company name and let the Actor look it up.
Why does a company return 0 jobs?
Either the board really has no open jobs (the summary says "The board exists but has no open jobs right now"), your filters removed everything (compare jobsOnBoard and jobsMatchingFilters in the summary), or the input points to a different board than you expected. Companies sometimes move to another ATS and leave an empty board behind.
How fresh is the data?
Live. Every run reads the ATS at that moment; nothing comes from a stored database.
Can I get only jobs posted in the last 24 hours?
Yes: set Posted since to 24 hours. For ongoing tracking, monitoring with Only new jobs is more reliable, because some employers re-post old jobs with a new date.
Can I scrape LinkedIn, Indeed or Glassdoor jobs with this Actor?
No. Those are job sites, not ATSs. This Actor reads the employers' own job boards.
Support, maintenance and changelog
Built and maintained in Finland by Koivu Data, a small data tools studio in the EU.
- Found a bug, a missing ATS or a wrong field? Open an issue on the Issues tab with your run link, so the problem can be reproduced.
- Maintenance: every ATS parser is covered by unit tests on saved real responses, and Apify test-runs the Actor every day. If an ATS changes its endpoint, fixing the Actor comes before new features.
- Data and privacy: the Actor reads only public job boards and saves results only to your Apify account.
- Changelog (full history on the Changelog tab):
- 0.1 (2026-10-05): first version with 12 ATSs, monitoring of new and removed jobs, filters and three description formats.
An honest review on the Reviews tab helps other users decide and tells us what to improve.