ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workday & more
Pricing
from $3.00 / 1,000 job postings
ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workday & more
Scrape every open job from company career pages on Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable and Recruitee. Paste company names or URLs, the ATS is auto-detected, and you get one clean schema with salary, remote flag and full description, plus new and closed job alerts.
Pricing
from $3.00 / 1,000 job postings
Rating
0.0
(0)
Developer
Lantern Lane Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable & Recruitee
๐ผ What is the ATS Jobs Scraper?
Get every open job from company career pages in one clean, normalised dataset. Paste a list of companies (names, website domains or job-board URLs) and this Actor auto-detects which applicant tracking system (ATS) each company uses, reads the ATS's public job-board feed and returns one consistent schema with title, locations, remote/hybrid flag, department, employment type, salary when published, full description (text + HTML), apply link and posted date.
Run it on a schedule and it also tells you which jobs are new and which were closed since the last run, which makes it a ready-made job monitoring, hiring-signal and lead-generation feed.
- โ 7 ATS platforms: Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee
- โ Auto-detects the ATS and board slug from a company name, domain or careers-page URL
- โ One normalised schema for all sources (no per-ATS parsing on your side)
- โ Salary ranges from structured ATS data, or parsed from the job text when the employer publishes a range
- โ New / closed job flags between runs (change tracking)
- โ Filters: keywords, locations, remote / hybrid / on-site, departments, employment type, posted since
- โ NEW: optional AI enrichment tags every job with seniority, remote / hybrid / on-site, job function and tech stack (no extra charge)
- โ Recruiter personal names, personal e-mails and phone numbers removed
- โ No login, no browser, no captcha solving: only the official public job-board endpoints, with polite rate limiting
- โ Pay only for jobs you get: $3 per 1,000 jobs
๐ฏ What can I use it for?
- Job boards & aggregators: fill a niche job board (remote jobs, AI jobs, jobs in Berlin, ...) straight from employers' own career sites, with apply links that go to the source.
- Hiring signals & sales intelligence: see which companies are hiring for what (e.g. "who opened Data Engineering roles this week?") and trigger outreach.
- Recruiting & sourcing: monitor competitor and target-company openings, salary bands and new teams.
- Market & salary research: build datasets of roles, locations and published pay ranges across hundreds of companies.
- Job seekers & career tools: get alerted when a company you like posts a job that matches your keywords.
- AI agents: a predictable, schema-documented output that agents can call through the Apify API or MCP.
๐งฉ Supported applicant tracking systems
| ATS | Example input | How it's read | Description | Salary |
|---|---|---|---|---|
| Greenhouse | https://boards.greenhouse.io/airbnb, Stripe | Job Board API | โ | parsed from text, or structured when published |
| Lever (US & EU) | https://jobs.lever.co/palantir, spotify | Postings API | โ | โ
structured salaryRange when published, else parsed from text |
| Ashby | https://jobs.ashbyhq.com/openai, notion.so | Job Posting API | โ | โ structured compensation |
| Workday | https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite, intel.com | Career-site JSON | โ (1 request per job) | parsed from text |
| SmartRecruiters | https://jobs.smartrecruiters.com/ServiceNow, ServiceNow | Posting API | โ (1 request per job) | parsed from text |
| Workable | https://apply.workable.com/huggingface/ | Public widget API | โ | parsed from text |
| Recruitee | https://bunq.recruitee.com, bunq | Careers Site API | โ | โ structured when published |
Auto-detection. For each input the Actor (1) reads a job-board URL directly, (2) for a domain or careers-page URL, fetches the careers pages and looks for ATS links/embeds, and (3) for a plain name, checks the likely board slug on each ATS and picks the board with the most jobs. If you already know the ATS you can force it, e.g. greenhouse:airbnb, lever:palantir, ashby:openai, smartrecruiters:ServiceNow, workable:huggingface, recruitee:bunq, workday:intel.wd1/External.
Tip: job-board URLs are the most precise input. A name like Linear is matched to the board called linear, which is usually, but not always, the company you mean. Check the company and boardUrl fields, or the run summary.
โฌ๏ธ Input
| Field | Description |
|---|---|
companies (required) | Company names, domains, careers-page URLs or job-board URLs, one per line. |
keywords | Keep jobs whose title contains any of these words (whole-word, case-insensitive). |
searchInDescription | Also match keywords in department and description. |
excludeKeywords | Drop jobs whose title contains any of these words. |
locations | Keep jobs whose location or country contains any of these strings. Remote also keeps all remote jobs. |
workplace | any, remote, remoteOrHybrid or onsite. |
departments | Keep jobs whose department or team contains any of these strings. |
employmentTypes | full-time, part-time, contract, internship, temporary, volunteer, other. |
postedSince | 2026-09-01 or relative: 7 days, 2 weeks, 1 month. |
maxJobs | Total cap on job records (default 1,000; 0 = no limit). Also caps your cost. |
maxJobsPerCompany | Cap per job board (0 = no limit). |
includeDescription | Return full description text + HTML (default on). Turning it off makes Workday and SmartRecruiters boards much faster. |
enrichWithAI | Add aiSeniority, aiWorkplace, aiJobFunction, aiConfidence and techStack to every job (default off, no extra charge). |
trackChanges | Remember each board's jobs between runs and set isNew / firstSeenAt (default on). |
onlyNewJobs | Output only jobs that weren't open on the previous run. |
includeClosedJobs | Also output a short status: "closed" record for jobs removed since the previous run. |
stateStoreName | Name of the key-value store that keeps tracking state; use different names for separate monitors. |
maxConcurrency | Boards fetched in parallel (default 5). Requests per host are rate-limited regardless. |
proxyConfiguration | Optional. Not needed for most boards; useful if a board rate-limits you. |
Example input
{"companies": ["https://boards.greenhouse.io/airbnb","Stripe","https://jobs.lever.co/palantir","OpenAI","https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite","https://jobs.smartrecruiters.com/ServiceNow","https://apply.workable.com/huggingface/","https://bunq.recruitee.com"],"keywords": ["engineer", "data scientist"],"workplace": "remoteOrHybrid","postedSince": "14 days","maxJobs": 500}
Daily "new jobs only" monitor
Create a task with your company list and "onlyNewJobs": true, optionally "includeClosedJobs": true, and schedule it daily. The first run returns everything that matches (everything is new on the first run). From then on each run returns only jobs that appeared since the previous run, plus closed-job records if you asked for them. Connect a webhook, Slack, Google Sheets, Zapier or Make integration to get alerts.
โฌ๏ธ Output
One record per job. Abridged example (see sample_output.json for one record from every ATS):
{"id": "ashby-openai-8fb1615c-34bf-47c4-a1d1-b7b2f836bbd3","atsJobId": "8fb1615c-34bf-47c4-a1d1-b7b2f836bbd3","ats": "ashby","company": "OpenAI","companySlug": "openai","title": "Technical Program Manager, Compute Infrastructure","location": "San Francisco","locations": ["San Francisco"],"country": "United States","isRemote": false,"workplaceType": null,"department": "Technical Program Management","team": null,"employmentType": "full-time","employmentTypeRaw": "FullTime","salary": { "min": 257000, "max": 335000, "currency": "USD", "interval": "year", "text": "$257K โ $335K โข Offers Equity", "source": "ats" },"descriptionText": "About the Team\n\nThe compute infrastructure team runs the GPU fleet ...","descriptionHtml": "<h3><strong>About the Team</strong></h3><p>The compute infrastructure team ...","applyUrl": "https://jobs.ashbyhq.com/openai/8fb1615c-.../application","jobUrl": "https://jobs.ashbyhq.com/openai/8fb1615c-...","postedAt": "2026-03-12T16:38:15.322000Z","updatedAt": null,"postedAtIsApproximate": false,"requisitionId": null,"experienceLevel": null,"boardUrl": "https://jobs.ashbyhq.com/openai","status": "open","isNew": true,"firstSeenAt": "2026-10-08T06:12:22Z","lastSeenAt": "2026-10-08T06:12:22Z","closedAt": null,"input": "OpenAI","scrapedAt": "2026-10-08T06:12:22Z"}
Key fields:
id: stable across runs (<ats>-<board>-<atsJobId>), safe to use as a primary key. Jobs are de-duplicated by it.salary.source:atswhen the employer published a structured range in the ATS,descriptionwhen a range like$150,000 - $200,000was found in the job text.nullwhen no pay was published.workplaceType/isRemote: from the ATS's own remote/hybrid fields when available; otherwise from the location text or an explicit "work model" statement in the description.postedAt: ISO-8601 UTC. Workday only shows "Posted 3 Days Ago" in listings; with descriptions on, the exact start date is used, otherwisepostedAtIsApproximateistrue.isNew,firstSeenAt,lastSeenAt,status,closedAt: change tracking (see above).
๐ค AI enrichment (enrichWithAI: true)
Turn it on and every job also gets:
| Field | Values |
|---|---|
aiSeniority | intern, entry, mid, senior, lead_manager, director, executive |
aiWorkplace | remote, hybrid, onsite |
aiJobFunction | engineering, data_science, product, design, sales, marketing, customer_success, operations, finance, people, it_security, other |
aiConfidence | 0โ1 confidence for each of the three fields above |
techStack | Technologies named in the posting, e.g. ["Python", "React", "AWS", "Kubernetes"] |
When the model isn't confident (below 0.5), the field is unknown rather than a guess. Filter on aiSeniority = "senior" and aiJobFunction = "engineering" to get a clean senior-engineer feed, or count techStack across a company's openings to see what it's building.
"aiSeniority": "senior", "aiWorkplace": "remote", "aiJobFunction": "engineering","aiConfidence": {"seniority": 0.97, "workplace": 0.88, "function": 0.99},"techStack": ["PostgreSQL", "Kubernetes", "Rust"]
The dataset has three views in Apify Console: Overview, Salary and New & closed. Download it as JSON, CSV, Excel, XML or RSS, or read it through the API. Each run also saves a RUN_SUMMARY record in the key-value store with the detected ATS, board URL, job counts and any errors for every input.
๐ฐ How much does it cost?
Free until 22 October 2026. After that:
This Actor uses pay-per-event pricing: you pay for results, not for compute time.
| Event | Price |
|---|---|
Job record in the dataset (job-result) | $0.003 ($3 per 1,000 jobs) |
| Actor start | $0.00005 per run (Apify's standard start fee) |
Examples: 200 jobs โ $0.60, 1,000 jobs โ $3, a daily "new jobs only" monitor over 100 companies returning about 150 new jobs per day โ $0.45 per day. Inputs that can't be detected or fetched are not charged. Use maxJobs or the run's maximum cost setting to cap spending: the Actor stops cleanly when your limit is reached.
โ FAQ
Does AI enrichment cost extra? No. It's included in the per-job price. It's a classification step, so it adds about a second per job to the run.
Do I need an account with any of these ATS vendors? No. The Actor uses the public endpoints that power each company's own careers page. No login, cookies or API keys.
Why didn't my company get detected? Some companies use an ATS that isn't supported (for example a custom site, iCIMS, Taleo or SuccessFactors), or their careers page is fully JavaScript-rendered so the ATS link isn't in the HTML. Paste the job-board URL from any "Apply" link instead, e.g. https://<company>.wd5.myworkdayjobs.com/<site>. The run summary lists every input that couldn't be resolved, and you aren't charged for it.
How fresh is the data? Live: every run reads the boards at that moment.
How many companies can I add? Hundreds per run. Boards are fetched in parallel (maxConcurrency) with per-host rate limits so the sources aren't overloaded.
Why is Workday slower? Workday lists 20 jobs per page and needs one request per job for the description. Use maxJobsPerCompany, filters (they're applied before the per-job request where possible) or includeDescription: false for speed. Boards with more than 2,000 jobs are split by category automatically to work around Workday's 2,000-result limit.
Are recruiter names and e-mails removed? Yes. Personal e-mail addresses, phone numbers, "Recruiter: Jane Doe"-style lines and names next to removed contact details are removed from descriptions. Generic company mailboxes (careers@, accommodations@) are kept because candidates need them. Per-recruiter fields that some ATSes expose (e.g. the posting creator or internal application mailboxes) are never output.
Is "new" based on my filters? No. Change tracking is per board: a job is new the first time the Actor sees it open on that board. Jobs that matched your filters but weren't delivered because of maxJobs stay "new" for the next run. Closed-job detection needs the full board listing, so it's skipped for a board in runs where maxJobs or maxJobsPerCompany stopped that board early.
Can I use it from code? Yes. Use the Apify API, the Python or JavaScript apify-client, or MCP. Example with Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lanternlane-data/careers-page-jobs-aggregator").call(run_input={"companies": ["stripe", "openai"], "keywords": ["engineer"]})for job in client.dataset(run["defaultDatasetId"]).iterate_items():print(job["company"], job["title"], job["jobUrl"])
โ ๏ธ Limitations
- Only the 7 ATS platforms above. Custom careers sites and other ATSes aren't scraped.
- Name-based detection guesses the board slug; prefer job-board URLs for precision.
- Workday tenants that hide jobs behind login or captcha aren't supported.
- Salary parsing from description text is best-effort; check
salary.textandsalary.source. - Some providers (e.g. Workable) rate-limit by IP address. If a board fails with HTTP 429, enable Apify Proxy in
proxyConfigurationor run again later.
โ๏ธ Is it legal?
This Actor only reads publicly available job postings from the JSON endpoints that employers' own careers pages use to show their jobs. It doesn't log in, bypass captchas or access anything behind authentication, and it rate-limits its requests. Job postings are published by employers so that they reach as many candidates as possible; personal data of recruiters is stripped from the output.
You're still responsible for how you use the data: comply with the terms of the sites involved, copyright in job descriptions, and data-protection laws such as GDPR (for example, if you republish postings or combine them with personal data). If in doubt, consult a lawyer. This Actor isn't affiliated with or endorsed by Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable or Recruitee; their names are trademarks of their respective owners.
๐ฌ Support
Found a board that doesn't work, or need another ATS? Open an issue on the Actor's Issues tab with the board URL and we'll take a look.
๐ฎ More from Lantern Lane Data
Jobs & hiring data is our focus: job postings straight from employers' applicant tracking systems and official public feeds, in one consistent schema. More ATS platforms and hiring-signal tools are on the way.
- ๐ Remote Jobs Scraper: Remote jobs from 7 boards via their official public feeds, deduplicated, with salary and location filters.
Other tools
- ๐๏ธ Shopify Products Scraper: Every product, price, variant and stock level from any Shopify store, with price-change tracking.
- ๐บ๏ธ Sitemap URL Extractor: Every URL from any website's XML sitemaps, with lastmod, hreflang and new-page alerts.
- ๐ฆ AI Brand Visibility Tracker: How often ChatGPT, Perplexity, Gemini and Claude mention, rank and cite your brand vs competitors.
Built and maintained by Lantern Lane Data.