Multi-ATS Job Scraper — Greenhouse, Lever, Ashby, Workday avatar

Multi-ATS Job Scraper — Greenhouse, Lever, Ashby, Workday

Pricing

$3.00 / 1,000 job scrapeds

Go to Apify Store
Multi-ATS Job Scraper — Greenhouse, Lever, Ashby, Workday

Multi-ATS Job Scraper — Greenhouse, Lever, Ashby, Workday

Scrape jobs from the 5 biggest ATS platforms in one dataset — Greenhouse, Lever, Ashby, SmartRecruiters & Workday. Full descriptions, salaries, locations, departments & apply links. Auto-detects the ATS from a careers URL or company name. Monitor mode emits only new jobs.

Pricing

$3.00 / 1,000 job scrapeds

Rating

0.0

(0)

Developer

Scrape Sage

Scrape Sage

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 hours ago

Last modified

Share

Multi-ATS Job Scraper — Greenhouse, Lever, Ashby, SmartRecruiters & Workday

Scrape job postings from the 5 biggest applicant tracking systems (ATS) in one runGreenhouse, Lever, Ashby, SmartRecruiters, and Workday — into a single, unified, richly-structured dataset. Paste a careers URL or just a company name and the actor auto-detects the ATS, pulls every public posting, and normalizes it: full job descriptions, salary ranges, locations & geo, departments, employment type, and direct apply links — the same column layout no matter which ATS the job came from.

No login, no cookies, no browser — fast, direct API extraction straight from each company's own career board, with monitor mode to capture only newly-posted jobs on a schedule.

Why this job scraper?

Most job scrapers cover one ATS, or one job aggregator that's hours-to-days stale and strips the fields that matter. This actor reads each company's live career board directly — so the data is as fresh as the company's own careers page — and merges five different ATS formats into one clean schema. It ships the richest job dataset in the category:

DataSingle-ATS / aggregator scrapersThis actor
Greenhouse + Lever + Ashby + SmartRecruiters + Workday❌ one at a time✅ all five, one dataset
Auto-detect ATS from a company name or URL
Full job description (HTML and plain text)partial
Salary range + currency + equity flag❌ usually null✅ when published
City / region / country + lat-long geopartial
Department, team, employment type, experience level
Direct apply URL + canonical job URLpartial
Requisition ID, posted/updated dates
Employer custom fields (division, brand, contract…)✅ (SmartRecruiters)
Unified columns across every ATS
Monitor mode — only new postings

Use cases

  • Recruiting & sourcing intelligence — track who's hiring, for what, and where, across hundreds of companies' real career boards in one feed.
  • Sales & lead generation — a new job posting is a buying signal. Monitor target accounts for roles that signal budget, expansion, or a new initiative (e.g. "Head of RevOps", "first Data Engineer"), and reach out the day it appears.
  • Job boards & aggregators — power a niche job site with fresh, structured, deduplicated postings — including descriptions and salaries — without scraping each ATS yourself.
  • Labor-market & compensation research — analyze salary ranges, remote/hybrid mix, and hiring velocity by company, department, and location.
  • Competitive monitoring — watch competitors' headcount plans: which teams are growing, which markets they're entering, how fast they post.

How to use

  1. Sign up for Apify — the free plan is enough to try this actor.
  2. Open the Multi-ATS Job Scraper, add companies (a careers URL, an ats:token shorthand, or a plain company name), and click Start.
  3. Watch results stream into the dataset table — one clean row per job, same columns for every ATS.
  4. Export as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the Apify API.

Input

{
"companies": [
"https://boards.greenhouse.io/figma",
"lever:palantir",
"ashby:openai",
"https://careers.smartrecruiters.com/BoschGroup",
"https://salesforce.wd12.myworkdayjobs.com/External_Career_Site"
],
"searchTerms": ["engineer", "data"],
"locationFilters": ["remote", "london"],
"includeDescription": true,
"includeCompensation": true,
"maxItemsPerCompany": 200,
"onlyNewItems": false
}
  • companies — one entry per company. Each can be:
    • a careers/board URL (most reliable): https://boards.greenhouse.io/figma, https://jobs.lever.co/palantir, https://jobs.ashbyhq.com/openai, https://careers.smartrecruiters.com/BoschGroup, https://salesforce.wd12.myworkdayjobs.com/External_Career_Site;
    • an ats:token shorthand: greenhouse:figma, lever:palantir, ashby:openai, smartrecruiters:BoschGroup;
    • a plain company name to auto-detect across Greenhouse, Lever, Ashby and SmartRecruiters. Workday always needs a URL (its address encodes the data-center and career-site, which can't be guessed from a name).
  • searchTerms — optional keyword filter; a job is kept if any term appears in its title, department, tags, or description.
  • locationFilters — optional location filter (remote, london, united states, …) matched against location, city, region, and country.
  • includeDescription (default true) — full description (HTML + plain text). Free for Greenhouse/Lever/Ashby; adds one detail request per job for SmartRecruiters/Workday.
  • includeCompensation (default true) — parse salary ranges and equity flags where published.
  • includeRawData (default false) — attach the complete original ATS object under raw.
  • maxItemsPerCompany / maxItems (default 0 = no limit) — caps for test runs or budget control.
  • onlyNewItems (default false)monitor mode: emit only postings not seen in previous runs (see below).
  • dedupStoreName (default ats-jobs-state) — named store holding seen job IDs for monitor mode.
  • proxyConfiguration — proxy settings (default Apify datacenter proxy; residential is not needed).

Output

One clean record per job, identical columns across every ATS:

{
"ats": "greenhouse",
"companyName": "Figma",
"companySlug": "figma",
"jobId": "5822886004",
"title": "Staff Software Engineer, Platform",
"url": "https://boards.greenhouse.io/figma/jobs/5822886004",
"applyUrl": "https://boards.greenhouse.io/figma/jobs/5822886004",
"descriptionHtml": "<div class=\"content-intro\"><p>Figma is growing…</p></div>",
"descriptionText": "Figma is growing our team of passionate creatives and builders…",
"department": "Engineering",
"team": "Platform",
"jobFunction": null,
"employmentType": "Full-time",
"experienceLevel": null,
"location": "San Francisco, CA",
"locations": ["San Francisco, CA", "New York, NY"],
"isRemote": false,
"workplaceType": "hybrid",
"city": "San Francisco",
"region": "CA",
"country": "US",
"postalCode": "94103",
"latitude": 37.7765,
"longitude": -122.3963,
"salaryMin": 230000,
"salaryMax": 310000,
"salaryCurrency": "USD",
"salaryInterval": "year",
"salaryRaw": "$230K – $310K • Offers Equity",
"hasEquity": true,
"requisitionId": "2178",
"postedAt": "2026-04-17T12:21:54.000Z",
"updatedAt": "2026-04-17T16:25:57.000Z",
"tags": ["Engineering"],
"customFields": [{ "label": "Division", "value": "Product" }],
"companyInput": "https://boards.greenhouse.io/figma",
"scrapedAt": "2026-06-12T12:00:00.000Z"
}

What to expect (field coverage)

Different ATS platforms expose different fields, and many are populated only when the employer filled them in. Verified across all five platforms, you can typically expect:

FieldGreenhouseLeverAshbySmartRecruitersWorkday
Title, URL, apply URL
Full description✅ (detail call)✅ (detail call)
Department / team
Location✅ + lat-long
Salary rangewhen setwhen setoftenrarely
Requisition ID
Posted / updated dates

A blank field means the employer didn't publish it for that posting — not that scraping failed. Nothing is dropped, so you always get the richest record available from each board.

Monitor only new jobs

Turn on onlyNewItems and the actor saves every job ID it has seen in a named key-value store (dedupStoreName), then on each later run emits only postings that weren't there before. Combined with a daily Schedule, you get a clean feed of just the new roles at your target companies — perfect for hiring-signal alerts and job-board ingestion.

  • The first run emits everything (and seeds the store); subsequent runs emit only the delta.
  • Monitor mode is the actor's own dedupe layer — it complements, and does not conflict with, Apify Schedules (a cron trigger) or the Console Monitoring tab (charts & alerts).
  • Use a distinct dedupStoreName per independent monitor (e.g. per client or per company set) so their states don't mix.
  • If you schedule frequent runs, enable the Schedule's exclusive option so a new run doesn't start before the previous one finishes writing its state.
  • Heads-up: a quiet run legitimately returns 0 items, which can trip a Console Monitoring "results lower than N" alert — expected behavior, not an error.

Automate & schedule

Run this actor on autopilot and pull results into your own stack:

  • Apify API — start runs, fetch datasets, and manage schedules over REST.
  • apify-client for JavaScript and apify-client for Python — official SDKs.
  • Schedules — run it hourly/daily/weekly to track new postings at your target companies; pair with onlyNewItems for a new-jobs-only feed.
  • Webhooks — trigger downstream actions (CRM import, Slack alert, job-board ingest) the moment a run finishes.
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });
const run = await client.actor('scrapesage/multi-ats-job-scraper').call({
companies: [
'https://boards.greenhouse.io/figma',
'lever:palantir',
'ashby:openai',
],
searchTerms: ['engineer'],
onlyNewItems: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} new job postings`);

Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

  • Make — multi-step automation scenarios.
  • Zapier — push new job postings straight into your ATS, CRM, or spreadsheet.
  • Slack — get notified when a monitored company posts a new role.
  • Google Drive / Sheets — auto-export every run to a spreadsheet.
  • Airbyte — pipe results into your data warehouse.
  • GitHub — trigger runs from commits or releases.

Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the Apify MCP server — ask your assistant to "find all remote data engineering roles at these ten companies and list salary and apply links" and let it run the scraper for you.

More scrapers from scrapesage

Build a complete hiring-intelligence & lead-gen stack:

Tips

  • The careers URL is the most reliable input. Plain company names are auto-detected by trying common slugs — great for Greenhouse/Lever/Ashby/SmartRecruiters, but if a name doesn't resolve, paste the board URL or use an ats:token shorthand. Workday always needs the URL.
  • Listing-only, faster runs: set includeDescription: false to skip the per-job detail calls on SmartRecruiters and Workday (Greenhouse/Lever/Ashby always include descriptions for free).
  • Big boards: use maxItemsPerCompany for quick tests; the actor paginates the whole board by default.
  • Salaries are richest on Ashby, Lever, and Greenhouse — many US postings publish ranges and equity; SmartRecruiters/Workday rarely do.
  • Recurring monitoring: combine onlyNewItems with Schedules and a webhook to push new roles into your CRM the moment they appear.

FAQ

Which ATS platforms are supported? Greenhouse, Lever, Ashby, SmartRecruiters, and Workday — the five most widely used by mid-market and enterprise employers. One run can mix all of them.

How do I find a company's careers URL? It's the page their "Apply" / "Open roles" links point to — e.g. boards.greenhouse.io/<company>, jobs.lever.co/<company>, jobs.ashbyhq.com/<company>, careers.smartrecruiters.com/<Company>, or <company>.wdN.myworkdayjobs.com/<Site>. Paste that, or just try the company name.

Does it need an API key or login? No. It reads each company's public career-board API — the same data their own careers page shows — no key, cookie, or login required.

Why does a plain company name sometimes not resolve? Auto-detection guesses the board token by trying common slug spellings. Unusual slugs (or any Workday tenant) can't be guessed — paste the careers URL or use ats:token and it works every time.

Can I export to Google Sheets, CSV, or Excel? Yes — one click in the dataset view, or automatically on every run via the Google Drive integration.

How do I monitor companies for new jobs automatically? Turn on onlyNewItems, create a Schedule (e.g. daily), and optionally add a webhook or Zapier zap to push new postings into your CRM as they appear.

A field is empty — why? Different ATS platforms expose different fields, and many (salary, department, requisition ID) are filled in only when the employer chooses to. Empty means the employer didn't publish it — never that the scraper skipped it.

Is scraping job boards legal? This actor collects publicly available data only. You're responsible for using the data in compliance with applicable laws (e.g. GDPR/CCPA for personal data) and each site's terms.

Need help?

Open an issue on the actor's Issues tab, or visit the Apify help center. Feature requests — more ATS platforms, more fields — are welcome; this actor is actively maintained.