ATS Jobs Scraper: Greenhouse, Lever, Workday & Ashby avatar

ATS Jobs Scraper: Greenhouse, Lever, Workday & Ashby

Pricing

from $0.60 / 1,000 jobs

Go to Apify Store
ATS Jobs Scraper: Greenhouse, Lever, Workday & Ashby

ATS Jobs Scraper: Greenhouse, Lever, Workday & Ashby

Scrape live job listings directly from Greenhouse, Lever, Workday & Ashby ATS boards. Pass company slugs, get clean unified job data. No login, no anti-bot, pay per job. Hiring signal & recruiting feeds. Use it as an MCP server in Claude, ChatGPT & AI agents.

Pricing

from $0.60 / 1,000 jobs

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

3

Monthly active users

3 hours ago

Last modified

Share

๐Ÿ’ผ ATS Jobs Scraper: Greenhouse, Lever, Workday & Ashby

Part of the Recruiting & Jobs MCP. This actor's data is also available to AI agents through our Recruiting & Jobs MCP server โ€” seven job-market and sourcing tools behind one endpoint. No result, no charge.

โšก 19/19 runs succeeded in the last 30 days ยท no login, no auth, no ban risk.

๐Ÿ’ธ You're only charged for delivered results. Empty searches, failed pages and duplicate listings are never billed.

Overview

ATS Jobs Scraper pulls live job openings straight from employer applicant-tracking systems (Greenhouse, Lever, Workday, and Ashby) by company slug. Instead of fighting the anti-bot walls and duplicate noise of consumer job boards, it reads jobs from the same structured boards employers publish for candidates. Give it ["stripe","notion"] and it returns clean, deduplicated job records: title, location, department, employment type, remote flag, posting URL, and timestamps. No login, no CAPTCHA, no API key.

Built for recruiters, sales teams building hiring-signal lists, market intelligence, and AI agents that need live employer hiring data.

Reliability posture: blocked, empty, or failed runs are never charged. You only pay for a job record that was actually delivered.

โœ… No login | โœ… No anti-bot fight | โœ… First-party ATS source | โœ… MCP-ready for AI agents

Features

Pulls jobs from Greenhouse, Lever, Workday, and Ashby boards in one unified schema. Per-company slug input so you scan only the accounts you care about. Optional job description text, location filter, department filter, and remote-only flag. Structured fields for ATS, company slug, job ID, title, location, department, and timestamps. Same output whether you consume it via CSV, JSON, Excel, API, or MCP tool call.

How it works

Every modern employer publishes its live job openings on an applicant-tracking system: Greenhouse, Lever, Workday, or Ashby. Each of these exposes a public board per company (e.g. boards.greenhouse.io/stripe, jobs.lever.co/notion) that is stable, structured, and rate-limit friendly. This actor talks to each ATS in its native format, joins the results into one clean schema, and returns them as flat records.

Because the data comes from the employer's own board, there is no duplication across aggregators, no stale listings, and no anti-bot game. You give it the slug list, it returns the jobs.

๐Ÿงพ Input configuration

Pass plain company slugs in companies and the ATS is auto-detected. Use boards when you already know the ATS, or for Workday, which cannot be auto-detected.

{
"companies": ["stripe", "notion"],
"boards": [
{ "ats": "workday", "slug": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite" }
],
"maxJobsPerCompany": 100,
"includeDescription": true,
"locationFilter": "United States",
"departmentFilter": "Engineering",
"remoteOnly": false
}
FieldWhat it takes
companiesPlain slugs. Tries Greenhouse, then Lever, then Ashby, and keeps the first that returns jobs.
boards{ "ats": "greenhouse" | "lever" | "ashby" | "workday", "slug": "..." }. Skips auto-detect. Workday's slug is its full careers URL.
maxJobsPerCompanyCaps jobs per employer, and caps cost.
includeDescriptionAdds the full posting body. On Workday this costs one extra request per job.
locationFilter / departmentFilter / remoteOnlyPost-fetch filters. Workday rows carry no department.

๐Ÿ“ค Output format

{
"ats": "greenhouse",
"company_slug": "stripe",
"job_id": "7954688",
"title": "Account Executive, AI Sales (Grower)",
"location": "San Francisco, CA",
"department": "1654 Account Executives (AI)",
"remote": false,
"url": "https://stripe.com/jobs/search?gh_jid=7954688",
"description": "Who we are. About Stripe. Stripe is a financial infrastructure platform for businesses. Millions of companies, from the world's largest enterprises to the most ambitious startups, use Stripe to accept payments, grow their revenue, and accelerate new business opportunities. Our mission is to increase the GDP of the internet, and we have a staggering amount of work ahead...",
"posted_at": "2026-06-02T08:58:57-04:00",
"updated_at": "2026-07-13T14:37:36-04:00",
"scraped_at": "2026-07-15T04:14:45.761Z"
}

This is a real record captured live from Stripe's Greenhouse board. Every job record contains these fields:

FieldDescription
๐Ÿท๏ธ atsATS source (greenhouse, lever, workday, ashby)
๐Ÿข company_slugCompany slug on the ATS
๐Ÿ†” job_idATS internal job ID
๐Ÿ“„ titleJob title
๐Ÿ“ locationLocation string as posted
๐Ÿ—‚๏ธ departmentDepartment or team
โฑ๏ธ employment_typeFull time, contract, part time, etc. Omitted from the record when the ATS doesn't expose a detectable value
๐ŸŒ remoteRemote flag when the ATS marks it
๐Ÿ”— urlDirect link to the public job posting
๐Ÿ“ descriptionFull posting body when includeDescription is on, otherwise plain text truncated to 500 characters
๐Ÿ“… posted_atOriginal posting date
๐Ÿ”„ updated_atLast update timestamp
๐Ÿ•’ scraped_atISO timestamp of capture

๐Ÿ’ผ Common use cases

Recruiting and talent research Watch a portfolio of competitors and get notified the day they open a role you can steal. Build a live map of hiring in a niche (e.g. all rust engineering roles across YC companies).

Sales hiring signals Trigger outbound the moment a target account opens a role in your ICP (e.g. VP Marketing at any Series B SaaS). Prioritise accounts that are hiring aggressively as a proxy for budget and growth.

Market and industry intelligence Track hiring trends by function and location across a set of employers. Benchmark team size and hiring velocity across competitors.

AI hiring copilots Give an agent live ATS data so it can answer "who's hiring for X right now?" Feed structured job posts into a search index for candidates.

๐Ÿš€ Getting started

  1. Put company slugs in companies and the actor auto-detects the ATS, trying Greenhouse, then Lever, then Ashby.
  2. For Workday, and for any company whose ATS you already know, use boards instead: [{"ats":"greenhouse","slug":"stripe"}]. Workday is explicit-only, see the note below.
  3. Set maxJobsPerCompany to cap volume per employer.
  4. Optionally set locationFilter, departmentFilter, or remoteOnly to narrow the run.
  5. Toggle includeDescription on if you need the full posting body.
  6. Click Start, then download the dataset as JSON, CSV, or Excel, or pull it via API or MCP.

๐Ÿ’ต Pricing

EventPriceYou pay when
Job posting delivered$0.0025A posting lands in your dataset

$2.50 per 1,000 postings, falling to $1.50 on higher Apify plans. Companies with zero open roles cost nothing to check, which matters when you monitor a watchlist where most companies change nothing week to week.

How that compares

Four ATS platforms in one call, at a fraction of what the multi-ATS alternatives charge:

ATS coveredPer 1,000 jobs
This actorGreenhouse, Lever, Ashby, Workday$2.50, down to $1.50
Premium career-site APIGreenhouse, Lever, Ashby, Workday$12.00
Other multi-ATS aggregatormixed$4.00
Single-ATS actorsone each$2.00 to $2.50 each

Running one Greenhouse actor plus one Workday actor plus one Lever actor costs more than this actor covering all four, and leaves you joining three different schemas by hand.

โฐ Run it on a schedule

Competitor-hiring monitoring is this actor's natural mode: postings originate on the company's ATS board and syndicate outward, so polling the board directly is the earliest public signal.

  1. On this actor's page, click โ‹ฏ โ†’ Schedule actor (or Console โ†’ Schedules โ†’ Create new).
  2. Pick a frequency. @weekly Monday 06:00 fits most watchlists, daily for active searches.
  3. Your saved input is reused on every run; each run appends to a named dataset.
  4. Wire the dataset to Google Sheets, Slack, or a webhook via the actor's Integrations tab so new rows reach you automatically.

FAQ

How do I find a company's ATS slug? Open the company's careers page and look at the URL. boards.greenhouse.io/stripe gives slug stripe, and the same pattern works for Lever (jobs.lever.co/notion) and Ashby (jobs.ashbyhq.com/scale). For those three you can skip this entirely and just pass the company name in companies, and the actor auto-detects which board it is on.

Why does Workday need a full URL instead of a slug? Because a Workday slug does not exist. Every Workday customer runs its own tenant on its own numbered datacentre, so the board lives at https://{company}.wd{N}.myworkdayjobs.com/{SiteName} and neither the wd{N} number nor the site name can be derived from the company's name. Rather than fire dozens of guesses per company, we take the careers URL you already have:

{ "boards": [
{ "ats": "workday", "slug": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite" }
] }

Copy it straight from the employer's careers page. Workday is the only ATS here that cannot be auto-detected, which is also why many competing actors skip it.

Does every field come back for Workday? Almost. Workday's public board carries no department field, so department is empty on Workday rows and departmentFilter will not match them, and we leave it blank rather than guess from the job title. Workday descriptions, employment type, posting date and apply URL all come back in full when includeDescription is on.

Are the postings real time? Yes. ATS boards update the moment a recruiter opens or closes a requisition. Schedule a daily run for a live hiring feed.

Do you scrape LinkedIn Jobs or Indeed? No. Consumer job boards are duplicative, anti-bot walled, and stale. Reading straight from the employer's ATS gives you the canonical, first-party posting.

How much does it cost? Pay per job. You pay only for jobs actually delivered, at a low per-job rate. Empty runs cost nothing.

Can I use it inside an AI agent? Yes. It is exposed as an MCP tool. See below.

Does Greenhouse have a public API for job postings? Yes. Every Greenhouse job board exposes public JSON at boards-api.greenhouse.io, no key needed. Lever and Ashby are similar. This actor wraps all of them in one normalized schema, so you don't maintain three parsers.

Can I get job postings before they appear on LinkedIn? Usually. Postings originate on the company's ATS board and syndicate outward, so polling the ATS directly is the earliest public signal.

How do I track when a company is hiring for a specific role? Schedule this actor with a departmentFilter, or filter downstream on title keywords, and diff against last week's dataset.

๐Ÿค– Use from Claude, ChatGPT & any MCP agent

Hosted MCP endpoint โ€” no install, OAuth on first connect:

https://mcp.apify.com/?tools=themineworks/ats-jobs

Claude Desktop / Cursor config (token auth):

{
"mcpServers": {
"ats-jobs": {
"url": "https://mcp.apify.com/?tools=themineworks/ats-jobs",
"headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
}
}
}

Ask your agent: "Check which of these 10 companies posted new engineering roles this week and summarize by location."

For the full recruiting stack in one connection (ATS boards + LinkedIn jobs + profiles + company data), use our Recruiting & Jobs MCP server โ€” seven tools behind one endpoint.

Or call it programmatically with the Apify client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('themineworks/ats-jobs').call({
companies: [
{ slug: 'stripe', board: 'greenhouse' },
{ slug: 'notion', board: 'lever' }
],
maxJobsPerCompany: 100,
includeDescription: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

๐Ÿ› ๏ธ Complete your hiring intelligence pipeline

Pair this actor with the rest of the themineworks recruiting and sales suite:

Typical flow: ats-jobs surfaces the hiring event, b2b-leads-finder finds the right person to reach, ambitionbox-companies gives context on the employer.

Found a bug or have a feature request? Open an issue on the actor's Apify Console page or reach out through the Apify profile.