All-in-One ATS Jobs Scraper — Greenhouse, Lever, Ashby & 8 more avatar

All-in-One ATS Jobs Scraper — Greenhouse, Lever, Ashby & 8 more

Pricing

from $1.50 / 1,000 results

Go to Apify Store
All-in-One ATS Jobs Scraper — Greenhouse, Lever, Ashby & 8 more

All-in-One ATS Jobs Scraper — Greenhouse, Lever, Ashby & 8 more

Open jobs from 11 ATS in one schema: Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, BambooHR, Personio, Teamtailor, Breezy HR, JazzHR. Paste company names or websites - the ATS is auto-detected. Salary ranges, filters, dedupe and new/updated/removed job alerts. No login.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

Erwinbooze Ricardo

Erwinbooze Ricardo

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Security

Limited permissions

Share

All-in-One ATS Jobs Scraper — Greenhouse, Lever, Ashby, Workable & more

All-in-One ATS Jobs Scraper is a multi-ATS jobs scraper and job board API for 11 applicant tracking systems: Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, BambooHR, Personio, Teamtailor, Breezy HR and JazzHR. Paste company names, websites or careers URLs - the ATS is detected automatically - and get every open job in one unified schema: title, location, remote / workplace type, department, employment type, salary ranges, dates, apply link and description. It reads each ATS's public job-board endpoints: no login, no proxy, no browser. Add change detection (new / updated / removed jobs) and schedule it for hiring alerts.

What can you use it for?

  • Job boards and aggregators: one feed and one schema across 11 ATS platforms.
  • Lead generation and sales intelligence: find out which companies are hiring, for which teams and where - just from a list of company websites.
  • Salary benchmarking: published pay ranges, normalized to min / max / currency / period.
  • Hiring alerts: daily new, updated and removed jobs, pushed to Slack, email or any webhook.
  • AI agents (MCP): one tool that answers "what is

Supported ATS

ATSInput examplesDescriptionSalaryPublish date
Greenhousegreenhouse:airbnb, boards.greenhouse.io/..., job-boards.greenhouse.io/...✅structured pay transparency + text✅
Leverlever:spotify, jobs.lever.co/..., jobs.eu.lever.co/...✅structured range + text✅
Ashbyashby:openai, jobs.ashbyhq.com/...✅structured compensation + text✅
Workableworkable:huggingface, apply.workable.com/...✅text✅
SmartRecruiterssmartrecruiters:ServiceNow, jobs.smartrecruiters.com/...✅ (one request per job)text✅
Recruiteerecruitee:bunq, <company>.recruitee.com✅structured (when published) + text✅
BambooHRbamboohr:<company>, <company>.bamboohr.com/careers✅ (one request per job)compensation field + text✅
Personiopersonio:<company>, <company>.jobs.personio.de✅text✅
Teamtailorteamtailor:<company>, <company>.teamtailor.com✅text✅
Breezy HRbreezy:<company>, <company>.breezy.hr❌ (not in the public feed)salary field (when set)✅
JazzHRjazzhr:<company>, <company>.applytojob.com✅text❌ (not published)

Workday is not included in this Actor.

Features

  • Auto-detect the ATS from a company name (Hugging Face) or website (stripe.com): the Actor first looks for ATS links on the company's own website (home, /careers, /jobs), then tries name guesses on every supported ATS and picks the board with the most jobs. RUN_SUMMARY records how each company was matched (detectedVia) and other boards it found (alsoFoundOn). Use ats:token (e.g. greenhouse:airbnb) for exact control.
  • Built-in company lists (companyLists): about 110 curated companies across AI, fintech, developer tools, consumer tech, B2B SaaS, robotics/defense, European tech and large employers - each verified to have open jobs on 2026-10-30.
  • Cross-company deduplication: the same board entered twice is scraped once, duplicate job IDs are dropped, and dedupeSimilar (on by default) drops identical reposts across boards.
  • Unified filters: keywords (title or description), locations, departments, remote only, posted within N days, atsFilter to limit platforms.
  • Change detection: changeType new / updated / removed with changedFields and firstSeenAt, stored between runs in a named key-value store.
  • Robust: a wrong or missing company does not fail the run; each company's status is in RUN_SUMMARY. Respects your maximum cost per run.

Quick start

{
"companies": [
"stripe.com",
"Hugging Face",
"https://jobs.lever.co/palantir",
"ashby:openai"
],
"keywords": [
"engineer"
],
"maxJobsPerCompany": 20
}

A curated list, limited to remote roles:

{
"companyLists": [
"ai-companies"
],
"remoteOnly": true,
"maxJobs": 200
}

Daily hiring monitor (outputs only changes after the first run):

{
"companies": [
"notion.so",
"workable:huggingface",
"recruitee:bunq"
],
"changeDetection": true,
"skipFirstRunOutput": true,
"changeStoreName": "my-hiring-monitor"
}

Input

FieldDescription
companiesCompany names, websites, careers/job URLs on any supported ATS, or ats:token. Optional if companyLists is set.
companyListsBuilt-in curated company lists.
atsFilterOnly use these ATS platforms (empty = all 11).
autoDetectDetect the ATS for names/websites (default on).
keywords / searchInDescriptionKeep jobs whose title (or description) contains any keyword.
locations / departmentsKeep jobs whose location / department contains any of these strings.
remoteOnly / postedWithinDaysRemote only; published in the last N days (JazzHR jobs have no date and are kept).
includeDescription / includeDescriptionHtml / includeSalaryWhat to include.
changeDetection, changeStoreName, includeUnchanged, includeRemoved, skipFirstRunOutputNew / updated / removed tracking.
onlyNewJobs / monitoringStoreNameSimple mode: only job IDs not seen before.
dedupeSimilarDrop identical reposts (default on).
maxJobsPerCompany / maxJobsResult limits (0 = no limit).

Output

Every job has the same fields, whatever the ATS (fields an ATS does not publish are null):

{
"ats": "greenhouse",
"jobId": "8306554",
"title": "AirCover Specialist, Claims Experience",
"companyName": "Airbnb",
"companyToken": "airbnb",
"url": "https://careers.airbnb.com/positions/8306554?gh_jid=8306554",
"applyUrl": "https://careers.airbnb.com/positions/8306554?gh_jid=8306554",
"location": "Canada",
"allLocations": [
"Canada"
],
"city": null,
"region": null,
"country": null,
"isRemote": true,
"workplaceType": "Remote",
"department": "Community Support",
"team": null,
"employmentType": null,
"experienceLevel": null,
"publishedAt": "2026-10-28T14:52:05.000Z",
"updatedAt": "2026-10-28T14:52:05.000Z",
"salaryMin": 58000,
"salaryMax": 68000,
"salaryCurrency": "CAD",
"salaryPeriod": "YEAR",
"salarySource": "pay_transparency",
"salaryText": null,
"salaryRanges": [
{
"min": 58000,
"max": 68000,
"currency": "CAD",
"title": "Canada Annual Pay Range"
}
],
"descriptionText": "Airbnb was born in 2007 when two hosts welcomed three guests to their San Francisco home...",
"scrapedAt": "2026-10-30T10:49:05.109Z"
}

salarySource tells you where the salary came from (the ATS's structured field, or description when parsed from text, with the snippet in salaryText). With change detection, items also get changeType, changedFields and firstSeenAt. Download as JSON, CSV, Excel, XML or HTML, or use the API.

RUN_SUMMARY (default key-value store) lists, per company: input, ats, token, status (ok / not_found / error), detectedVia, alsoFoundOn, jobsOnBoard, jobsMatched, jobsOutput, duplicatesSkipped and change counts.

Job alerts and change detection (new / updated / removed)

Turn on changeDetection and schedule the Actor (for example daily in Schedules in Apify Console). Every run is compared with the previous run that used the same companies and filters:

  • changeType: "new" - the job appeared since the last run.
  • changeType: "updated" - the title, location, department, employment type, salary or description changed; changedFields lists which.
  • changeType: "removed" - the job was open last time and is gone now (filled or closed). The item has jobId, title, url, location, firstSeenAt and removedAt.
  • Unchanged jobs are skipped unless you turn on includeUnchanged. Every output job also gets firstSeenAt.

The snapshot lives in a named key-value store (changeStoreName, default ats-jobs-changes), so it survives between runs. Use a different store name per monitor. Turn on skipFirstRunOutput to save the baseline silently on the first run. Change counts per company appear in RUN_SUMMARY. If a result limit (maxJobsPerCompany / maxJobs) cuts the output, the jobs that were not output stay pending and come out as new on the next run, so nothing is missed.

{ "companies": ["stripe.com"], "changeDetection": true, "skipFirstRunOutput": true, "changeStoreName": "my-hiring-monitor" }

Prefer something simpler? onlyNewJobs outputs only job IDs not seen before (no updated/removed tracking).

Send changes to Slack, email or a webhook

  • Slack / email: in the Actor's Integrations tab, add the Slack or email integration and trigger it on Run succeeded. Because change-detection runs output only changes, the message is your alert.
  • Webhook (your own endpoint, Zapier "Catch Hook", n8n "Webhook" node, Make "Custom webhook"): add an HTTP webhook for the event ACTOR.RUN.SUCCEEDED. The default payload contains resource.defaultDatasetId; fetch the changes from https://api.apify.com/v2/datasets/<defaultDatasetId>/items?clean=true (add &token=... or an Authorization: Bearer header) and filter by changeType.

Use with AI agents (MCP)

This Actor can be called by AI agents through the Apify MCP server. It runs with limited permissions and pay-per-event pricing, so agents only pay for the results they get. To give Claude, Cursor, VS Code or any MCP client a dedicated tool for it, add this server URL:

https://mcp.apify.com?tools=wowlab/all-in-one-ats-jobs-scraper

The agent can then call it with plain inputs such as {"companies": ["stripe.com"], "keywords": ["engineer"], "maxJobs": 20}. Every input field has a description written for agents, and results come back as clean JSON with plain-text descriptions, ready for RAG, classification or summaries. Set maxJobs (and a max total charge in the call options) to keep agent spend predictable.

Integrations: Make, n8n, Zapier, Google Sheets

  • Make: use the Apify app's Run an Actor module with wowlab/all-in-one-ats-jobs-scraper, then Get Dataset Items.
  • n8n: use the Apify node (Run Actor + Get dataset items), or an HTTP Request node calling POST https://api.apify.com/v2/acts/wowlab~all-in-one-ats-jobs-scraper/run-sync-get-dataset-items.
  • Zapier: use the Apify app (Run Actor action, or Finished Actor Run trigger + Fetch Dataset Items).
  • Google Sheets, Airtable, Slack, email: connect them in the Actor's Integrations tab, or export the dataset as CSV/Excel/JSON.
  • API: POST https://api.apify.com/v2/acts/wowlab~all-in-one-ats-jobs-scraper/run-sync-get-dataset-items with the input as JSON body returns the jobs directly.

Pricing

Pay per result (see the Pricing tab for the current price). No subscription, and with change detection only changed jobs (and removed-job records) are output and charged. Set maxJobs or a maximum cost per run to cap spend.

Tips

  • Auto-detection makes a few extra requests per name; for large recurring lists, copy the detected ats and token from RUN_SUMMARY and use ats:token entries.
  • Some companies run several boards (e.g. regional ones). alsoFoundOn lists the other boards with jobs; add them as ats:token entries if you want them too.
  • Name guesses can match a different company with the same name on a smaller ATS. Check companyName / companyToken, or use the company's website or careers URL instead.

This Actor reads only the public job postings that companies publish on purpose through each ATS's public job-board endpoints. It collects no personal data and needs no login. You are responsible for how you use the data, so check the terms of the sites you rely on.

FAQ

Why are some fields empty? Each ATS publishes different data. For example Breezy HR's public feed has no description and JazzHR's has no publish date; salary is only present when the company publishes it.

A company returns "not_found". It may use an ATS that is not supported (for example Workday or an in-house system), or a board name different from its brand. Pass its careers page URL.

Only need one ATS? See our Greenhouse Jobs Scraper, Lever Jobs Scraper and Ashby Jobs Scraper, with ATS-specific fields (e.g. Lever lists, Ashby equity flag).