ATS Jobs Scraper — Greenhouse, Lever & Ashby avatar

ATS Jobs Scraper — Greenhouse, Lever & Ashby

Pricing

from $1.90 / 1,000 results

Go to Apify Store
ATS Jobs Scraper — Greenhouse, Lever & Ashby

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.

Pricing

from $1.90 / 1,000 results

Rating

0.0

(0)

Developer

i-Scraper

i-Scraper

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

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, and isNew to 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)

ATSCareer page URL patternExample slug
Greenhousehttps://boards.greenhouse.io/{slug}stripe
Leverhttps://jobs.lever.co/{slug}netflix
Ashbyhttps://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:

  1. Open the company's careers page.
  2. Look at the URL of any job listing (or the iframe/embed).
  3. The path after the ATS hostname is the slug:
    • boards.greenhouse.io/stripe → slug is stripe
    • jobs.lever.co/netflix → slug is netflix
    • jobs.ashbyhq.com/notion → slug is notion

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:

PresetCompaniesExamples
top-tech~34Stripe, Anthropic, OpenAI, Notion, Vercel, Linear, Figma, Spotify, Netflix, Cloudflare, Datadog, GitLab
ai-ml~27Anthropic, OpenAI, Mistral, Cohere, Cursor, Perplexity, ElevenLabs, Modal, Pinecone, Scale AI, DeepL
fintech~23Stripe, Brex, Mercury, Ramp, Monzo, Robinhood, Affirm, Adyen, Carta, Lithic, Modern Treasury
devtools~29Vercel, GitLab, Supabase, PostHog, Linear, Cursor, Sentry, Render, Datadog, Cloudflare, Twilio, Mux
eu-startups~20Mistral, Monzo, ElevenLabs, Adyen, Spotify, Doctolib, HelloFresh, Celonis, BlaBlaCar, GetYourGuide
yc-alumni~26Stripe, Airbnb, Brex, Reddit, Notion, Gusto, Vanta, Webflow, Mercury, Replit, Algolia, Whatnot
crypto-web3~11Kraken, Alchemy, Ripple, Anchorage Digital, Mysten Labs, OpenSea, Phantom, Foundation, Gemini
remote-first~17GitLab, 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

FieldWhat it does
keywordsKeep only jobs whose title, department, location, or description contains at least one keyword (case-insensitive).
excludeKeywordsDrop any job matching any of these keywords (e.g. intern).
locationsKeep only jobs whose location contains one of these terms (e.g. remote, europe, berlin).
maxJobsPerTargetHard cap on jobs returned per company (default: 500).
includeDescriptionsWhether 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: true and firstSeen = now.
  • A job seen previously keeps its original firstSeen and updates lastSeen.

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

ProblemLikely cause
not_found for a targetThe slug does not exist on that ATS, or the company changed ATS provider.
No jobs returnedThe company has no public openings, or your filters are too narrow.
network_error repeatedATS endpoint is rate-limiting. Enable the Apify proxy or reduce concurrency.
Missing descriptionsSome ATS responses omit descriptions for some jobs (rare). Enable includeDescriptions.
Want LinkedIn jobsOut 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.