ATS Jobs Scraper — Greenhouse, Lever & Ashby
Pricing
from $1.90 / 1,000 results
ATS Jobs Scraper — Greenhouse, Lever & Ashby
Scrape public job postings from company career pages on Greenhouse, Lever, and Ashby. Normalized output with seniority, remote-type, role and technology detection. Tracks new vs. recurring jobs.
Greenhouse, Lever & Ashby Job Scraper — ATS Career Page Data
Scrape job postings from any company career page hosted on Greenhouse, Lever, or Ashby. This ATS jobs scraper returns clean, normalized data for every opening: job titles, locations, departments, seniority levels, remote type, and detected tech stack. Detect 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 tech jobs aggregation. No browser automation, no flaky DOM scraping: the actor reads public ATS endpoints 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, 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 (MVP)
| ATS | Career page URL pattern | Example slug |
|---|---|---|
| Greenhouse | https://boards.greenhouse.io/{slug} | stripe |
| Lever | https://jobs.lever.co/{slug} | netflix |
| Ashby | https://jobs.ashbyhq.com/{slug} | notion |
Workable, Recruitee, Personio, and Workday adapters are on the roadmap.
How to use the ATS jobs scraper
Two ways to pick the companies you want to scrape: an explicit list of targets, or curated preset lists.
1. Explicit company targets
{"targets": [{ "ats": "greenhouse", "slug": "stripe" },{ "ats": "lever", "slug": "netflix" },{ "ats": "ashby", "slug": "notion" }],"keywords": ["python", "backend"],"locations": ["remote", "europe"],"includeDescriptions": true}
How to find a company's ATS slug:
- Open the company's careers page.
- Look at the URL of any job listing (or the iframe/embed).
- The path after the ATS hostname is the slug:
boards.greenhouse.io/stripe→ slug isstripejobs.lever.co/netflix→ slug isnetflixjobs.ashbyhq.com/notion→ slug isnotion
2. 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, Netflix, 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 on jobs returned per company (default: 500). |
includeDescriptions | Whether to include full descriptions in output (default: true). |
Example output (Greenhouse job posting)
{"jobId": "greenhouse:stripe:1234567","source": "greenhouse","sourceJobId": "1234567","sourceUrl": "https://boards.greenhouse.io/stripe/jobs/1234567","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 jobs scraper? An ATS (Applicant Tracking System) jobs scraper pulls job postings directly from the career pages a company hosts on platforms like Greenhouse, Lever, or Ashby. Because the data comes from each company's own public board, it is more accurate and timely than scraping an aggregator like LinkedIn or Indeed.
Does this scraper work with LinkedIn Jobs or Indeed? No. The actor only supports public ATS platforms (Greenhouse, Lever, Ashby) and intentionally avoids aggregators like LinkedIn, Indeed, and Glassdoor for legal and stability reasons.
Can I scrape job postings from any company? Only companies whose public career page is hosted on a supported ATS (Greenhouse, Lever, Ashby). Companies on Workday, SmartRecruiters, or fully custom platforms are on the roadmap.
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 endpoints directly instead of parsing HTML, so output is stable, fast, and resilient to career-page redesigns. You also get post-processing out of the box: seniority detection, remote-type detection, role categorization, and a technology tagger.
Roadmap
- v1.1 — Workable, Recruitee, Personio adapters; CSV preset upload; more preset lists (YC batches, EU fintech, …).
- v1.2 — Workday and SmartRecruiters adapters; hiring velocity metrics.
- v2 — Slack / webhook alerts on new jobs; watchlists; scheduled run templates.