ATS Jobs Scraper: Greenhouse, Lever, Workday +15 avatar

ATS Jobs Scraper: Greenhouse, Lever, Workday +15

Pricing

from $0.80 / 1,000 jobs

Go to Apify Store
ATS Jobs Scraper: Greenhouse, Lever, Workday +15

ATS Jobs Scraper: Greenhouse, Lever, Workday +15

Scrape every open job from company career sites on Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable and 12 more ATS. Parsed salary, location, remote type and seniority in one schema. For job boards, recruiting, sales leads, hiring-trend research and new-job alerts.

Pricing

from $0.80 / 1,000 jobs

Rating

0.0

(0)

Developer

PANIX AI LAB

PANIX AI LAB

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Security

Limited permissions

Share

ATS Jobs Scraper: every job from Greenhouse, Lever, Workday and 15 more career sites

Get every open job from company career sites in one clean format. Paste a job board link, a job link, a company website or just a company name: the Actor finds the company's applicant tracking system (ATS), reads its public job feed and returns one row per job with title, location, remote type, salary, seniority, job function, skills and the full description.

It reads 18 job boards: Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee, Personio, Teamtailor, BambooHR, Breezy HR, Rippling, Gem, Pinpoint, HireHive, Polymer, Manatal and Oracle Cloud HCM. No login, no API key, no browser.

Price: $1.20 per 1,000 jobs on paid plans (from $0.80 on higher plans), plus $0.001 per run. Filtered, duplicate and unchanged jobs, closed-job rows and companies that fail are free.

What it does

  • Any input: board links (boards.greenhouse.io/stripe), single job links, company websites (stripe.com) and company names (Notion). Mix them freely, up to 2,000 per run.
  • Finds the board for you: a built-in directory of 244 checked companies, then the links on the company's own careers page, then board names checked against each job board's API.
  • Reads big boards completely: Workday shows at most 2,000 jobs per search, so large Workday boards are split with the site's own filters and merged without duplicates (tested on Apify: Target's 14,000+ jobs and Capital One's 2,040 came back whole).
  • One schema for every job board: the same fields and values whichever ATS a company uses.
  • Parsed and enriched: city, region, country code, coordinates and time zone; remote, hybrid or on-site; employment type; seniority; job function; salary with currency, period and a yearly figure; posting date; skills; years of experience; education; visa sponsorship; description language.
  • Filters before any charge: title words, keywords in the description, countries, states, cities, regions such as EMEA, distance from a city, workplace type, employment type, seniority, job function, department, posting date, minimum salary, visa sponsorship and language.
  • Monitoring: on a schedule, return only jobs that are new since the last run, plus free rows for jobs that closed (with days open) and reposted jobs flagged.
  • Hiring summaries: one row per company with open jobs, jobs posted in the last 7 and 30 days, jobs open over 90 days, remote share, jobs by function and seniority, top locations and pay ranges.
  • Ready-made company lists: AI labs, tech, startups, fintech, remote-first, Europe, enterprise, gaming, health, climate, security and developer tools.

Who uses it

  • Job boards and newsletters fill niche boards with fresh jobs straight from employers and expire closed ones.
  • Recruiters and sourcers watch target companies and get new roles the day they open.
  • Sales and RevOps teams use hiring as a buying signal: new teams, new countries, leadership hires.
  • Job seekers follow the companies they want to work for, filtered by role, place and pay.
  • Analysts and investors track hiring velocity, remote mix and pay bands across a portfolio.
  • AI and RAG pipelines get Markdown descriptions and stable IDs, through the API or Apify's MCP server.

Why this ATS jobs scraper

  • 18 job boards in one Actor, including the enterprise systems (Workday, Oracle Cloud HCM, SmartRecruiters) that many company-name lookups miss.
  • Complete large boards: Workday boards above the 2,000-job search cap are split and merged, so every open job is returned, not only the newest 2,000.
  • Accurate salaries: structured pay from the job board where it exists, otherwise pay ranges read from pay-transparency sections ("$120,000 - $150,000 USD", "€60.000 - €75.000 brutto/Jahr", "₹12,00,000 per annum"), with currency, period and a yearly figure. Funding amounts, budgets and perks are not mistaken for pay.
  • Accurate locations: "US, CA, Santa Clara", "Toronto, ON", "Remote - EMEA" and "China, Shenzhen" are all parsed into city, region and country code with a gazetteer of 31,000 cities, so country, state and distance filters work.
  • You only pay for what you keep: filtered, duplicate, unchanged and failed jobs cost nothing, and a job whose page cannot be read is delivered free without its description.
  • Safe by default: personal email addresses and phone numbers are removed from descriptions; role mailboxes such as careers@ stay.
  • Status for every company: the COMPANIES table (JSON and CSV) says which board each input matched, how many jobs it has, how many matched your filters and why any company failed.
  • Robust: polite per-host request limits, retries on a new IP address, resume after a platform restart, and a clean stop at your spending limit or the run timeout.

Coming from another ATS jobs scraper?

Common problemHow this Actor handles it
Large Workday boards stop at 2,000 jobsBoards are split with Workday's own filters and merged, so every job comes back
A company name finds the wrong companyChecked directory first, then the company's own careers links; name guesses must match the board's own company name
Charged for empty boards, failed companies or filtered jobsOnly delivered jobs are charged
Salary is a raw string or missingMin, max, currency, period and a yearly value, from the board or the description
"Remote" and locations are free textCity, region, country code, coordinates, remote regions such as EMEA
Every daily run returns the whole board againOnly new jobs, closed jobs as free rows, reposts flagged
No way to see which inputs workedCOMPANIES table with status, counts and errors per input
One Actor per job board18 job boards, one schema

Supported job boards

Job boardPaste a link likeFound by company name
Greenhouse (also EU boards)boards.greenhouse.io/stripe, job-boards.greenhouse.io/anthropicYes
Lever (also EU boards)jobs.lever.co/spotify, jobs.eu.lever.co/innogamesYes
Ashbyjobs.ashbyhq.com/openaiYes
Workdaynvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite, wd1.myworkdaysite.com/recruiting/wf/WellsFargoJobsDirectory and website
SmartRecruitersjobs.smartrecruiters.com/BoschGroupYes
Workableapply.workable.com/huggingfaceYes
Recruiteefastned.recruitee.com (and custom career domains)Yes
Personioottonova.jobs.personio.deYes
Teamtailorpolestar.teamtailor.com (and custom career domains)Yes
BambooHR401auto.bamboohr.com/careersYes
Breezy HRnexo.breezy.hrYes
Ripplingats.rippling.com/rippling/jobsYes
Gemjobs.gem.com/retoolYes
Pinpointuktv.pinpointhq.comYes
HireHivefocus-ireland.hirehive.comYes
Polymerjobs.polymer.co/magnendoYes
Manatalcareers-page.com/hr-ways-3Yes
Oracle Cloud HCMjpmc.fa.oraclecloud.com/hcmUI/CandidateExperience/en/sites/CX_1001Directory and website

Workday and Oracle sites carry tenant IDs that a name cannot be turned into: paste the career site link or the company's website, or use a name from the directory (NVIDIA, Salesforce, Visa, Target, JPMorgan Chase, Marriott, Hilton, Kroger, Uber and more).

How to use it

  1. Click Try for free and sign in to Apify.
  2. Paste companies into Companies, one per line: links, websites or names. Or pick a Ready-made company list.
  3. Optional: set filters, for example Title includes data engineer and Locations Germany.
  4. Click Start. Open the Jobs view and export to JSON, CSV, Excel or HTML.

Input examples

Every open engineering job at three companies, remote or in Germany:

{
"companies": ["https://boards.greenhouse.io/stripe", "https://jobs.ashbyhq.com/openai", "Datadog"],
"jobFunctions": ["engineering", "data"],
"locations": ["Germany", "Remote"]
}

Remote jobs with published pay at remote-first companies, newest 5 per company:

{
"companyLists": ["remote-first"],
"workplaceTypes": ["remote"],
"salaryOnly": true,
"maxJobsPerCompany": 5
}

Senior data roles paying at least $150,000 a year in California:

{
"companyLists": ["ai", "tech"],
"titleIncludes": ["data", "machine learning"],
"seniorities": ["senior", "lead"],
"locations": ["California"],
"minSalary": 150000,
"salaryCurrency": "USD"
}

A daily monitor: new jobs and closed jobs at your watchlist (schedule it, see below):

{
"companies": ["stripe.com", "linear.app", "https://jobs.lever.co/spotify"],
"onlyNewJobs": true,
"monitorName": "watchlist-daily"
}

One hiring summary per company for an account list:

{
"companies": ["stripe.com", "notion.so", "figma.com", "datadoghq.com"],
"outputMode": "companies"
}

Output

One row per job. The Jobs, Salaries, Descriptions and skills, Monitoring changes and Company summaries views in the dataset show the main fields; every row has the full set.

A real row from a run of the example input on Apify (November 2026), with the description shortened:

{
"rowType": "job",
"id": "greenhouse:anthropic:5464234008",
"title": "Data Engineer",
"companyName": "Anthropic",
"ats": "greenhouse",
"url": "https://job-boards.greenhouse.io/anthropic/jobs/5464234008",
"applyUrl": "https://job-boards.greenhouse.io/anthropic/jobs/5464234008",
"location": "San Francisco, CA | New York City, NY; Seattle, WA",
"city": "San Francisco",
"region": "California",
"regionCode": "CA",
"country": "United States",
"countryCode": "US",
"workplaceType": "onsite",
"isRemote": false,
"employmentType": null,
"seniority": "mid",
"jobFunction": "data",
"department": "Engineering & Design - Product",
"team": null,
"salaryMin": 320000,
"salaryMax": 405000,
"salaryCurrency": "USD",
"salaryPeriod": "year",
"salaryAnnualMin": 320000,
"salaryAnnualMax": 405000,
"salaryText": "$320,000—$405,000 USD",
"salarySource": "description",
"postedAt": "2026-10-30T23:34:18Z",
"postedDateApproximate": null,
"daysSincePosted": 1,
"postedMoreThan30DaysAgo": null,
"updatedAt": "2026-10-30T23:37:41Z",
"closesAt": null,
"description": "About Anthropic\n\nAnthropic’s mission is to create reliable, interpretable, and steerable AI systems. We want AI to be safe and beneficial for our users and for society as a whole. Our team is a quickly growing group of committed researchers, engineers, policy experts, and business leaders working together to build beneficial AI systems.\n\nAbout the role ...",
"descriptionMarkdown": null,
"descriptionHtml": null,
"descriptionLanguage": "en",
"skills": ["SQL", "Python", "LLMs", "Salesforce"],
"experienceYears": 5,
"educationLevel": "bachelor",
"visaSponsorship": true,
"locations": [
{"city": "San Francisco", "region": "California", "regionCode": "CA", "country": "United States", "countryCode": "US", "latitude": 37.775, "longitude": -122.419, "timezone": "America/Los_Angeles", "text": "San Francisco, CA"},
{"city": "New York City", "region": "New York", "regionCode": "NY", "country": "United States", "countryCode": "US", "latitude": 40.714, "longitude": -74.006, "timezone": "America/New_York", "text": "New York City, NY"},
{"city": "Seattle", "region": "Washington", "regionCode": "WA", "country": "United States", "countryCode": "US", "latitude": 47.606, "longitude": -122.332, "timezone": "America/Los_Angeles", "text": "Seattle, WA"}
],
"countryCodes": ["US"],
"remoteRegions": [],
"requisitionId": "PIP-267933",
"jobId": "5464234008",
"boardId": "anthropic",
"boardUrl": "https://job-boards.greenhouse.io/anthropic",
"employmentTypeText": null,
"extra": {"internalJobId": 4567883008},
"input": "https://job-boards.greenhouse.io/anthropic",
"matchedBy": "url",
"scrapedAt": "2026-11-01T21:14:58Z",
"schemaVersion": 1
}

Main fields

FieldWhat it holds
idStable ID ats:board:job, the same in every run: use it to join or deduplicate
title, companyName, department, teamAs the job board shows them
url, applyUrlThe job page and the application link
location, city, region, regionCode, country, countryCodeThe main location, parsed; locations lists every location with coordinates and time zone
workplaceType, isRemote, remoteRegionsremote, hybrid or onsite; for remote jobs the regions they are open to, such as emea
employmentTypefull_time, part_time, contract, temporary, internship, apprenticeship, volunteer or other; the board's own value is in employmentTypeText
seniorityintern, entry, mid, senior, lead, manager, director, vp or executive
jobFunctionengineering, data, product, design, sales, marketing, customer_success, operations, finance, hr, legal, it, security, research and more
salaryMin, salaryMax, salaryCurrency, salaryPeriodPay as published; salaryAnnualMin/salaryAnnualMax convert hourly, daily, weekly and monthly pay to a year; salarySource is ats or description
postedAt, updatedAt, closesAt, daysSincePostedDates in UTC. Workday lists without a page show 'Posted 3 Days Ago', so the date is computed and postedDateApproximate is true
description, descriptionMarkdown, descriptionHtmlThe text in the format you chose, personal emails and phone numbers removed
skills, experienceYears, educationLevel, visaSponsorship, descriptionLanguageRead from the description
changeType, firstSeenAt, closedAt, daysOpen, repostedWith a monitor
extraBoard-specific fields such as the hiring legal entity, job family or category

Monitoring new jobs on a schedule

  1. Set Only new jobs since the last run and a Monitor name, such as watchlist-daily.
  2. Click Start once. The first run returns every open job (and is charged for them).
  3. Click Save as a new task, then in Schedules create a schedule for the task, for example every morning.

Each later run returns only jobs that are new (changeType: new), and one free row per job that closed (changeType: closed, with daysOpen). A new job with the same title and location as a job closed in the last 30 days has reposted: true. Turn on Also return updated jobs to get jobs whose title, location, department, workplace, employment type or pay changed. To send new jobs to Slack, email or Google Sheets, add an integration to the task (Apify's Slack and Gmail integrations, or a Make, Zapier or n8n webhook).

Pricing

You pay per delivered job, and less on higher Apify plans.

EventFree planStarter (Bronze)Scale (Silver)Business (Gold) and above
Job$1.50 per 1,000$1.20 per 1,000$1.00 per 1,000$0.80 per 1,000
Company summary (only when you ask for summaries)$0.004$0.003$0.0025$0.002
Run start$0.001$0.001$0.001$0.001
  • Free: jobs left out by filters, duplicates, jobs unchanged since the last monitoring run, closed-job rows, companies with no board or a failed board, and jobs whose page could not be read (those are delivered without a description).
  • Set a spending limit on the run and the Actor stops cleanly when it is reached.
  • Example: 50 companies with 40 matching jobs each are 2,000 jobs, $2.40 on the Starter plan.

Use it from code, n8n, Make, Zapier and AI agents

Python (apify-client 3.x):

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("panix/ats-jobs-scraper").call(run_input={
"companies": ["https://boards.greenhouse.io/stripe", "Notion"],
"titleIncludes": ["engineer"],
"maxJobsPerCompany": 50,
})
for job in client.dataset(run.default_dataset_id).iterate_items():
print(job["companyName"], job["title"], job["location"], job["url"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('panix/ats-jobs-scraper').call({ companies: ['stripe.com'], locations: ['Remote'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]);

One HTTP request that waits for the run and returns the jobs:

curl -X POST "https://api.apify.com/v2/acts/panix~ats-jobs-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"companies": ["https://jobs.ashbyhq.com/openai"], "maxJobsPerCompany": 20}'
  • n8n: use the Apify node (Run an Actor and get dataset items) with panix/ats-jobs-scraper and the input JSON above.
  • Make and Zapier: use the Apify app's "Run an Actor" action, then "Get dataset items". For a daily feed, schedule a task with a monitor and trigger on "Actor run finished".
  • AI agents (MCP): add https://mcp.apify.com/?tools=panix/ats-jobs-scraper to Claude, ChatGPT, Cursor or VS Code. Ask, for example: "List the open data engineering jobs at Stripe, Notion and Datadog posted in the last 14 days, with salary."

FAQ

Does it work with a company name only? Yes for the 244 companies in the directory and for most companies on Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee, Personio, Teamtailor, BambooHR, Breezy, Rippling, Gem, Pinpoint, HireHive, Polymer and Manatal. A guessed board must answer with the same company name, otherwise the company is reported as not found instead of returning another company's jobs. For Workday and Oracle sites, paste the career site link or the company's website. matchedBy says how each board was found.

How fresh are the jobs? Each run reads the job boards live, so new jobs appear as soon as the company publishes them and closed jobs drop out.

Can it search all companies by keyword? It reads the companies you give it or a ready-made list, then filters. Combine a list with Title includes and Locations to search across many companies.

Why is the salary empty? The company publishes no pay on its board or in the description. Pay transparency laws mean most US postings in California, Colorado, New York and Washington include a range.

Does it read LinkedIn, Indeed or Glassdoor? No. It reads the companies' own job boards, which is where those sites get many of their listings. Aggregator links are reported as invalid input, free.

What happens when a board fails? The run goes on with the other companies. The failed company is listed in COMPANIES with an error code and is not charged.

Are job descriptions complete? Yes, the full text the job board publishes, up to 60,000 characters. Workday, SmartRecruiters, Oracle, BambooHR, Breezy, Rippling and Polymer need one request per job for it, which is included in the price.

How long does a run take? Measured on Apify with the default 512 MB: the example input (4 companies, 10 jobs each, with descriptions) takes about 15-30 seconds; 20 companies on 18 different job boards, 25 jobs each, under 2 minutes; summaries for the 50 companies of the AI list under 4 minutes; all 16,192 jobs of Target and Capital One (without descriptions) about 8 minutes. Runs with tens of thousands of jobs finish sooner with more memory (Run options → Memory, for example 2 GB), because the Actor then gets more CPU. The price per job stays the same.

Limits

  • 2,000 companies per run. Very large boards (Accenture has over 40,000 jobs on Workday) take longer with descriptions on: add filters, set Max jobs per company, or turn descriptions off.
  • Company names cannot find Workday or Oracle sites outside the directory; paste the link or the website.
  • Companies that host jobs only on their own career site software (not one of the 18 job boards) are reported as not found.
  • Seniority, job function, skills and visa sponsorship are read from the text with fixed rules, so unusual titles can be classified as mid or other.

The Actor reads only job postings that companies publish on public job boards for applicants, with no login. It is built for job data, not personal data: personal email addresses, phone numbers and recruiter names are not included. You are responsible for using the data in line with the laws and terms that apply to you. Not affiliated with any of the job boards named here; their names are trademarks of their owners.

Countries, regions and cities come from GeoNames, licensed under CC BY 4.0.

Support

Found a problem or need another job board? Open an issue on the Issues tab with an example link. Output fields are only added, never renamed or removed without a note in the changelog.