ATS Jobs Scraper: All Company Job Boards
Pricing
from $1.50 / 1,000 job scrapeds
ATS Jobs Scraper: All Company Job Boards
Get live job openings from any company, whatever its ATS: Greenhouse, Ashby, Lever, Workday, SmartRecruiters, Workable, Personio, Rippling, Recruitee. One unified schema, cross-ATS dedup, new-jobs-only delta mode.
Pricing
from $1.50 / 1,000 job scrapeds
Rating
5.0
(1)
Developer
Alex Morain
Maintained by CommunityActor stats
1
Bookmarked
1
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
ATS Jobs Scraper. Any company, any ATS, one schema.
Companies publish their jobs through a handful of applicant tracking systems. This Actor reads all of them: Greenhouse, Ashby, Lever, Workday, SmartRecruiters, Workable, Personio, Rippling and Recruitee. You give it companies, it gives you their live job openings in one unified schema, whatever system each company happens to use.
Three things the single-ATS scrapers cannot do:
A built-in directory of 17,000+ job boards. You do not need to know which ATS a company
uses. Pass stripe.com and the embedded directory resolves it. Pass a board URL or an explicit
greenhouse:stripe pair when you want full control.
Cross-ATS deduplication, because migrations leave ghosts. When a company changes ATS, the old board often keeps serving every job. Real example measured in August 2026: one well-known database company served the exact same 94 openings on both its Greenhouse and its Ashby boards. A naive aggregator returns them twice and charges you twice. This Actor deduplicates by company, title and location before pushing, and a job you are not shown twice is a job you are not charged for twice.
A delta mode that turns scraping into monitoring. In new-only mode the Actor keeps a
persistent registry of everything it has already seen and only outputs jobs that are new since
the last run. Schedule it daily on your target list: a run that finds nothing costs one cent.
Add a webhookUrl and it pings your endpoint whenever new jobs appear.
How to scrape company job boards
- Open the Input tab. Three companies are already filled in, one per input form, so you can press Start right away and see what comes out.
- Replace them with your own list. A domain (
stripe.com) is the simplest form and works for most companies. If one fails to resolve, the log names it: open its careers page, copy the job board URL it redirects to, and paste that instead. - Optionally filter with title keywords, location keywords or remote only. Filtering happens before output, so a job you filter out is a job you do not pay for.
- Press Start, then download the dataset, or switch to
new-onlymode and schedule it for daily monitoring.
Which fields should I fill?
| If you want to... | Fill in | Leave alone |
|---|---|---|
| Export every opening of a company list | companies | everything else |
| Monitor new openings daily | companies, mode: new-only, a schedule | everything else |
| Get notified when a role opens | add webhookUrl to the above | everything else |
| Build a targeted list of roles | titleKeywords, locationKeywords | includeDescription |
| Classify jobs downstream with an LLM | includeDescription: true | filters |
companies is the only required field. Everything else is off by default.
What you get
One row per unique live job:
| Field | Notes |
|---|---|
title, company, location, apply_url | filled on 100% of jobs in our benchmark run |
remote | ATS flag when available, location text signal otherwise |
department, employment_type | when the ATS provides them |
posted_at | ISO 8601, only when the source serves a real date, never a guess |
salary_min, salary_max, salary_currency, salary_period | Ashby, Lever and Recruitee publish ranges |
description | full text, opt-in via includeDescription |
raw | the untouched original payload, for anything ATS-specific |
ats, board_slug, job_id | provenance, stable identifiers |
Input in ten seconds
{"companies": ["stripe.com", "https://jobs.lever.co/acme", "greenhouse:duolingo"],"mode": "new-only","titleKeywords": ["engineer", "developer"],"remoteOnly": true,"webhookUrl": "https://your-endpoint.example/new-jobs"}
Filters (titleKeywords, locationKeywords, remoteOnly) are applied before output: a
filtered-out job is never charged.
Honest limits, so you are not surprised
- Workday list mode has no reliable posting date. Workday serves relative labels like
"Posted 30+ Days Ago". We never convert those into fake timestamps:
posted_atstays null there. Usenew-onlymode for reliable first-seen dating. - Descriptions cost extra requests on SmartRecruiters and Workday (one per job), and
multiply the payload by 12 on Greenhouse. That is why
includeDescriptionis off by default. - Cross-ATS dedup is best-effort. Boards write locations differently ("Remote" vs "Remote, US"), so a small share of migration duplicates can survive. Measured on the worst real case we know: 98 of 174 duplicates caught by the exact key, the rest differ in location wording.
- The directory is a snapshot. It is rebuilt monthly from public web indexes. A company
missing from it still works: pass its board URL or
ats:slug, or the Actor probes the ATS APIs live from the domain. - A dead board is reported, not hidden. Unknown slugs and 404 boards are logged per company; the run only fails if every company fails.
Pricing logic
Pay per event: one start fee per run, one job event per unique job pushed. Duplicates,
filtered-out jobs and already-seen jobs in delta mode are never charged. Scheduled monitoring
of a company list costs one cent per quiet day.
For pipelines and agents
Output is a clean dataset, one JSON object per job, stable keys, ISO dates. Runs are idempotent per registry. The Actor exits FAILED when nothing could be scraped, so your automation can trust the run status. Typical run: 50 companies, 3,000 jobs, about two minutes.