ATS Jobs Scraper: All Company Job Boards avatar

ATS Jobs Scraper: All Company Job Boards

Pricing

from $1.50 / 1,000 job scrapeds

Go to Apify Store
ATS Jobs Scraper: All Company Job Boards

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

Alex Morain

Maintained by Community

Actor stats

1

Bookmarked

1

Total users

1

Monthly active users

2 days ago

Last modified

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

  1. 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.
  2. 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.
  3. 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.
  4. Press Start, then download the dataset, or switch to new-only mode and schedule it for daily monitoring.

Which fields should I fill?

If you want to...Fill inLeave alone
Export every opening of a company listcompanieseverything else
Monitor new openings dailycompanies, mode: new-only, a scheduleeverything else
Get notified when a role opensadd webhookUrl to the aboveeverything else
Build a targeted list of rolestitleKeywords, locationKeywordsincludeDescription
Classify jobs downstream with an LLMincludeDescription: truefilters

companies is the only required field. Everything else is off by default.

What you get

One row per unique live job:

FieldNotes
title, company, location, apply_urlfilled on 100% of jobs in our benchmark run
remoteATS flag when available, location text signal otherwise
department, employment_typewhen the ATS provides them
posted_atISO 8601, only when the source serves a real date, never a guess
salary_min, salary_max, salary_currency, salary_periodAshby, Lever and Recruitee publish ranges
descriptionfull text, opt-in via includeDescription
rawthe untouched original payload, for anything ATS-specific
ats, board_slug, job_idprovenance, 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_at stays null there. Use new-only mode 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 includeDescription is 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.