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

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

Pricing

from $3.00 / 1,000 job postings

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

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

Lantern Lane Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 days ago

Last modified

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

ATSExample inputHow it's readDescriptionSalary
Greenhousehttps://boards.greenhouse.io/airbnb, StripeJob Board APIโœ…parsed from text, or structured when published
Lever (US & EU)https://jobs.lever.co/palantir, spotifyPostings APIโœ…โœ… structured salaryRange when published, else parsed from text
Ashbyhttps://jobs.ashbyhq.com/openai, notion.soJob Posting APIโœ…โœ… structured compensation
Workdayhttps://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite, intel.comCareer-site JSONโœ… (1 request per job)parsed from text
SmartRecruitershttps://jobs.smartrecruiters.com/ServiceNow, ServiceNowPosting APIโœ… (1 request per job)parsed from text
Workablehttps://apply.workable.com/huggingface/Public widget APIโœ…parsed from text
Recruiteehttps://bunq.recruitee.com, bunqCareers 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

FieldDescription
companies (required)Company names, domains, careers-page URLs or job-board URLs, one per line.
keywordsKeep jobs whose title contains any of these words (whole-word, case-insensitive).
searchInDescriptionAlso match keywords in department and description.
excludeKeywordsDrop jobs whose title contains any of these words.
locationsKeep jobs whose location or country contains any of these strings. Remote also keeps all remote jobs.
workplaceany, remote, remoteOrHybrid or onsite.
departmentsKeep jobs whose department or team contains any of these strings.
employmentTypesfull-time, part-time, contract, internship, temporary, volunteer, other.
postedSince2026-09-01 or relative: 7 days, 2 weeks, 1 month.
maxJobsTotal cap on job records (default 1,000; 0 = no limit). Also caps your cost.
maxJobsPerCompanyCap per job board (0 = no limit).
includeDescriptionReturn full description text + HTML (default on). Turning it off makes Workday and SmartRecruiters boards much faster.
enrichWithAIAdd aiSeniority, aiWorkplace, aiJobFunction, aiConfidence and techStack to every job (default off, no extra charge).
trackChangesRemember each board's jobs between runs and set isNew / firstSeenAt (default on).
onlyNewJobsOutput only jobs that weren't open on the previous run.
includeClosedJobsAlso output a short status: "closed" record for jobs removed since the previous run.
stateStoreNameName of the key-value store that keeps tracking state; use different names for separate monitors.
maxConcurrencyBoards fetched in parallel (default 5). Requests per host are rate-limited regardless.
proxyConfigurationOptional. 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: ats when the employer published a structured range in the ATS, description when a range like $150,000 - $200,000 was found in the job text. null when 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, otherwise postedAtIsApproximate is true.
  • isNew, firstSeenAt, lastSeenAt, status, closedAt: change tracking (see above).

๐Ÿค– AI enrichment (enrichWithAI: true)

Turn it on and every job also gets:

FieldValues
aiSeniorityintern, entry, mid, senior, lead_manager, director, executive
aiWorkplaceremote, hybrid, onsite
aiJobFunctionengineering, data_science, product, design, sales, marketing, customer_success, operations, finance, people, it_security, other
aiConfidence0โ€“1 confidence for each of the three fields above
techStackTechnologies 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.

EventPrice
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 ApifyClient
client = 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.text and salary.source.
  • Some providers (e.g. Workable) rate-limit by IP address. If a board fails with HTTP 429, enable Apify Proxy in proxyConfiguration or run again later.

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.