ATS Jobs Scraper: Greenhouse, Lever, Workday & Ashby
Pricing
from $0.60 / 1,000 jobs
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
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
3
Monthly active users
3 hours ago
Last modified
Categories
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}
| Field | What it takes |
|---|---|
companies | Plain 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. |
maxJobsPerCompany | Caps jobs per employer, and caps cost. |
includeDescription | Adds the full posting body. On Workday this costs one extra request per job. |
locationFilter / departmentFilter / remoteOnly | Post-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:
| Field | Description |
|---|---|
๐ท๏ธ ats | ATS source (greenhouse, lever, workday, ashby) |
๐ข company_slug | Company slug on the ATS |
๐ job_id | ATS internal job ID |
๐ title | Job title |
๐ location | Location string as posted |
๐๏ธ department | Department or team |
โฑ๏ธ employment_type | Full time, contract, part time, etc. Omitted from the record when the ATS doesn't expose a detectable value |
๐ remote | Remote flag when the ATS marks it |
๐ url | Direct link to the public job posting |
๐ description | Full posting body when includeDescription is on, otherwise plain text truncated to 500 characters |
๐
posted_at | Original posting date |
๐ updated_at | Last update timestamp |
๐ scraped_at | ISO 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
- Put company slugs in
companiesand the actor auto-detects the ATS, trying Greenhouse, then Lever, then Ashby. - For Workday, and for any company whose ATS you already know, use
boardsinstead:[{"ats":"greenhouse","slug":"stripe"}]. Workday is explicit-only, see the note below. - Set
maxJobsPerCompanyto cap volume per employer. - Optionally set
locationFilter,departmentFilter, orremoteOnlyto narrow the run. - Toggle
includeDescriptionon if you need the full posting body. - Click Start, then download the dataset as JSON, CSV, or Excel, or pull it via API or MCP.
๐ต Pricing
| Event | Price | You pay when |
|---|---|---|
| Job posting delivered | $0.0025 | A 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 covered | Per 1,000 jobs | |
|---|---|---|
| This actor | Greenhouse, Lever, Ashby, Workday | $2.50, down to $1.50 |
| Premium career-site API | Greenhouse, Lever, Ashby, Workday | $12.00 |
| Other multi-ATS aggregator | mixed | $4.00 |
| Single-ATS actors | one 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.
- On this actor's page, click โฏ โ Schedule actor (or Console โ Schedules โ Create new).
- Pick a frequency.
@weeklyMonday 06:00 fits most watchlists, daily for active searches. - Your saved input is reused on every run; each run appends to a named dataset.
- 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:
- B2B Leads Finder: turn hiring companies into decision-maker emails and LinkedIn profiles.
- AmbitionBox Scraper: pull company reviews, salaries, and ratings for target employers.
- GitHub Repo Intelligence: cross-check engineering hiring signals with public GitHub activity.
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.