ATS Job Scraper: Greenhouse, Lever, Workable & More
Pricing
from $1.90 / 1,000 results
ATS Job Scraper: Greenhouse, Lever, Workable & More
Scrape jobs from Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, and Personio. Get normalized job data and detect new postings.
Workday, Greenhouse, Lever & Workable ATS Job Scraper
Scrape public job postings from company career pages hosted on Workday, Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, and Personio. This multi-ATS job scraper returns one clean, normalized dataset with job titles, locations, departments, seniority levels, remote type, employment type, and detected tech stack. Track new postings between runs so you always work with fresh hiring signals.
Built for recruiting research, sales prospecting, competitor hiring intelligence, talent market analysis, and job aggregation. No browser automation and no flaky DOM selectors: the Actor reads public ATS job feeds directly, so output stays fast and stable.
Use cases
- Recruiters & sourcers — monitor competitor hiring, find passive candidates by skill set, build pipelines from public openings.
- Sales & RevOps teams — detect buying signals (a company hiring a "Salesforce admin" hints at a Salesforce purchase).
- Market researchers & analysts — track hiring trends across industries, geographies, and seniority bands.
- Founders & operators — benchmark headcount growth, compensation bands, and tech-stack adoption against competitors.
- Job board builders — aggregate fresh tech jobs from hundreds of company career pages into a single feed.
- Investors & VCs — measure portfolio growth and hiring velocity with weekly snapshots.
What you get
For every job posting, the scraper returns a structured record with:
- Job basics: title, company name and domain, location, department, employment type, source URL.
- Detected attributes: seniority (intern through executive), remote/hybrid/on-site, role category, technologies mentioned (Python, AWS, React, Kubernetes, …).
- Tracking fields:
firstSeen,lastSeen, andisNewto spot fresh openings between scheduled runs. - Full descriptions (text + HTML, optional) for deeper analysis or LLM enrichment.
What this scraper does NOT do
The actor only extracts publicly available job postings. It does not:
- Scrape LinkedIn Jobs, Indeed, Glassdoor, or any other job aggregator.
- Access private ATS dashboards or recruiter views.
- Bypass logins, captchas, or anti-bot systems.
- Collect candidate data, applications, or private salary information.
This keeps the data legal, stable, and reliable across long-running schedules.
Supported ATS platforms
| ATS | Career page URL pattern | Example slug |
|---|---|---|
| Workday | https://{tenant}.{dataCenter}.myworkdayjobs.com/{locale}/{site} | tenant/site plus full URL |
| Greenhouse | https://boards.greenhouse.io/{slug} | stripe |
| Lever | https://jobs.lever.co/{slug} | spotify |
| Ashby | https://jobs.ashbyhq.com/{slug} | notion |
| Workable | https://apply.workable.com/{slug} | huggingface |
| SmartRecruiters | https://careers.smartrecruiters.com/{slug} | SmartRecruiters |
| Recruitee | https://{slug}.recruitee.com | helloprint |
| Personio | https://{slug}.jobs.personio.com or .de | company hostname |
The Actor uses public, no-login endpoints only. A Personio company must have its public XML feed enabled. For Workday, provide the full public career-site URL because the tenant, data center, and site name are all required.
How to use the ATS jobs scraper
Paste career-page URLs, provide advanced explicit targets, or choose curated preset lists. You can combine all three methods; duplicate companies are merged automatically.
1. Paste career-page URLs (recommended)
{"careerPageUrls": ["https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite","https://boards.greenhouse.io/stripe","https://jobs.lever.co/spotify","https://jobs.ashbyhq.com/notion"],"keywords": ["python", "backend"],"locations": ["remote", "europe"],"includeDescriptions": true}
You can paste either a career-page URL or an individual job URL. The Actor recognizes the ATS hostname and extracts the correct company board automatically.
2. Advanced explicit targets
Use explicit {ats, slug} objects when you already store normalized ATS identifiers. A URL-only target works too:
{"targets": [{ "ats": "greenhouse", "slug": "stripe" },{ "ats": "lever", "slug": "spotify" },{ "url": "https://apply.workable.com/huggingface" },{"ats": "workday","slug": "nvidia/NVIDIAExternalCareerSite","url": "https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite"}]}
You can override company metadata when an ATS uses an abbreviated or legacy board name:
{"targets": [{"url": "https://jobs.lever.co/acme-holdings","companyName": "Acme","companyDomain": "acme.com"}]}
The Actor takes company names from ATS data when available and otherwise creates a readable name from the board slug. It derives companyDomain only from a corporate job URL or an explicit override; ATS-owned domains are never reported as the employer's domain.
How to identify an explicit ATS target:
- Open the company's careers page.
- Look at the URL of any job listing (or the iframe/embed).
- For Workday, copy the complete career-site URL. For other platforms, use the slug shown in the URL:
nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite→ full URL plus slugnvidia/NVIDIAExternalCareerSiteboards.greenhouse.io/stripe→ slug isstripejobs.lever.co/spotify→ slug isspotifyjobs.ashbyhq.com/notion→ slug isnotionapply.workable.com/huggingface→ slug ishuggingfacecareers.smartrecruiters.com/SmartRecruiters→ slug isSmartRecruitershelloprint.recruitee.com→ slug ishelloprintacme.jobs.personio.com→ slug isacme
3. Preset company lists
Skip the manual research and run one or more curated, manually verified bundles of companies:
{"presetLists": ["ai-ml", "fintech"],"keywords": ["engineer", "ml"],"locations": ["remote", "europe"]}
Currently available:
| Preset | Companies | Examples |
|---|---|---|
top-tech | ~34 | Stripe, Anthropic, OpenAI, Notion, Vercel, Linear, Figma, Spotify, Mistral, Cloudflare, Datadog, GitLab |
ai-ml | ~27 | Anthropic, OpenAI, Mistral, Cohere, Cursor, Perplexity, ElevenLabs, Modal, Pinecone, Scale AI, DeepL |
fintech | ~23 | Stripe, Brex, Mercury, Ramp, Monzo, Robinhood, Affirm, Adyen, Carta, Lithic, Modern Treasury |
devtools | ~29 | Vercel, GitLab, Supabase, PostHog, Linear, Cursor, Sentry, Render, Datadog, Cloudflare, Twilio, Mux |
eu-startups | ~20 | Mistral, Monzo, ElevenLabs, Adyen, Spotify, Doctolib, HelloFresh, Celonis, BlaBlaCar, GetYourGuide |
yc-alumni | ~26 | Stripe, Airbnb, Brex, Reddit, Notion, Gusto, Vanta, Webflow, Mercury, Replit, Algolia, Whatnot |
crypto-web3 | ~11 | Kraken, Alchemy, Ripple, Anchorage Digital, Mysten Labs, OpenSea, Phantom, Foundation, Gemini |
remote-first | ~17 | GitLab, PostHog, Supabase, Linear, Vercel, Buffer, Zapier, Deel, Mattermost, Notion, Mercury |
You can combine multiple presets and targets in the same run. Duplicates are removed automatically. Slugs are re-verified periodically — if a company changes ATS provider, it shows up in FAILED_TARGETS as not_found.
Filtering job postings
| Field | What it does |
|---|---|
keywords | Keep only jobs whose title, department, location, or description contains at least one keyword (case-insensitive). |
excludeKeywords | Drop any job matching any of these keywords (e.g. intern). |
locations | Keep only jobs whose location contains one of these terms (e.g. remote, europe, berlin). |
maxJobsPerTarget | Hard cap fetched per company before filters run (default: 200). Raise it to search deeper into large boards. |
includeDescriptions | Whether to include full descriptions in output (default: true). |
Example normalized job output
{"jobId": "greenhouse:stripe:1234567","source": "greenhouse","sourceJobId": "1234567","sourceUrl": "https://stripe.com/jobs/search?gh_jid=1234567","companyName": "Stripe","companyDomain": "stripe.com","atsBoard": "stripe","jobTitle": "Senior Python Engineer","department": "Engineering","locationText": "Remote, Europe","locations": ["Remote", "Europe"],"remoteType": "remote","employmentType": null,"seniority": "senior","roleCategory": "engineering","technologies": ["python", "django", "postgresql", "aws"],"descriptionText": "Build high-scale services at Stripe...","descriptionHtml": "<p>Build high-scale services...</p>","publishedAt": "2026-05-15T16:00:00Z","scrapedAt": "2026-05-18T12:00:00Z","firstSeen": "2026-05-01T08:00:00Z","lastSeen": "2026-05-18T12:00:00Z","isNew": false,"isMatchedByFilters": true,"matchedKeywords": ["python"],"dedupeKey": "greenhouse:stripe:1234567"}
Run summary
After each run, check the default Key-Value Store:
OUTPUT— counts by source, started/finished timestamps, totals.FAILED_TARGETS— per-target errors (404 board not found, network, parse).UNSUPPORTED_TARGETS— preset names that were not found.
Tracking new job postings
The actor keeps its own state in a named Key-Value Store (JOB_STATE). On every run:
- A job seen for the first time gets
isNew: trueandfirstSeen= now. - A job seen previously keeps its original
firstSeenand updateslastSeen.
Run the actor on a schedule (every day, every hour, …) and filter the dataset by isNew = true to get a feed of fresh job postings only. Ideal for a daily "new tech jobs" alert, a Slack digest, or a webhook into your CRM.
Troubleshooting
| Problem | Likely cause |
|---|---|
not_found for a target | The slug does not exist on that ATS, or the company changed ATS provider. |
| No jobs returned | The company has no public openings, or your filters are too narrow. |
network_error repeated | ATS endpoint is rate-limiting. Enable the Apify proxy or reduce concurrency. |
| Missing descriptions | Some ATS responses omit descriptions for some jobs (rare). Enable includeDescriptions. |
| Want LinkedIn jobs | Out of scope. Use a dedicated LinkedIn Jobs actor instead. |
FAQ
What is an ATS job scraper? An ATS (Applicant Tracking System) job scraper pulls openings directly from company career pages hosted on systems such as Workday, Greenhouse, Lever, and Workable. Because the data comes from each company's own public board, it is usually more timely and structured than data scraped from a job aggregator.
Does this scraper work with LinkedIn Jobs or Indeed? No. The Actor supports the eight public ATS platforms listed above and intentionally avoids aggregators like LinkedIn, Indeed, and Glassdoor for legal and stability reasons.
Can I scrape job postings from any company? You can scrape companies whose public career page uses Workday, Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, or Personio. iCIMS, Oracle Taleo, SAP SuccessFactors, and fully custom career sites are not yet supported.
Can I combine different ATS platforms in one run? Yes. Paste URLs from any supported ATS and combine them with explicit targets or curated preset lists. Every posting is normalized into the same dataset schema, regardless of its source.
Do I need to know which ATS a company uses?
No. Paste its public career-page or job URL into careerPageUrls; the Actor detects the ATS and company board automatically. Custom career-site domains that hide the underlying provider still need an explicit target.
Where do company names and domains come from?
Company names come from the ATS response when available, with the board slug as a fallback. Company domains are returned only when a job points to the employer's own website or you provide companyDomain; the Actor does not mistake Workday, Greenhouse, Lever, or another ATS host for the employer's domain.
Does the Actor scrape candidate or applicant data? No. It reads public job listings only. It never signs in to employer dashboards and does not collect applications, resumes, candidate profiles, or recruiter-only data.
How often should I run the scraper?
Daily is enough for most use cases. For time-sensitive hiring intelligence, hourly works too. Public ATS endpoints rarely rate-limit, but you can enable the Apify proxy if you hit issues. Use the isNew field to alert on fresh postings only.
Does Apify proxy cost extra when scraping Greenhouse, Lever, or Ashby? The actor uses public, free ATS endpoints, so most runs do not need a proxy. Apify proxy is optional and only useful if a board starts rate-limiting your IP.
How is this different from a generic web scraper? This Actor reads structured ATS feeds directly instead of parsing rendered career-page HTML, so output is stable, fast, and resilient to visual redesigns. You also get post-processing out of the box: seniority detection, remote-type detection, role categorization, technology tagging, cross-source deduplication, and new-job tracking.
Roadmap
- v0.6 — CSV target upload; more preset lists (YC batches, EU fintech, …); hiring velocity metrics.
- v0.7 — iCIMS and Oracle Taleo adapters.
- v2 — Slack / webhook alerts on new jobs; watchlists; scheduled run templates.