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

ATS Jobs Scraper: Greenhouse, Lever, Ashby & more

Pricing

Pay per usage

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

ATS Jobs Scraper: Greenhouse, Lever, Ashby & more

Scrape public jobs from Greenhouse, Lever, Ashby, Workable, Personio, Recruitee & Teamtailor in one schema. Auto-detects the ATS. Only-new-jobs mode.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Tom Studio

Tom Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 hours ago

Last modified

Share

ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workable, Personio, Recruitee & Teamtailor jobs API

Get every open job posting straight from company career pages - in one clean, unified format - from the 7 applicant tracking systems (ATS) most used by tech companies, startups and European scale-ups: Greenhouse, Lever, Ashby, Workable, Personio, Recruitee and Teamtailor.

Paste a careers page URL (e.g. https://www.notion.com/careers) and the Actor auto-detects the ATS behind it. Filter by keyword, location, department, remote and posting date, and on scheduled runs get only the jobs that are new since the last run - so you pay only for fresh data.

What can this ATS jobs scraper do?

  • 🧭 Auto-detect the ATS from any company careers page, or use board URLs / ats:slug shorthands
  • 🧩 One schema for 7 ATS - title, department, team, location(s), country, remote/hybrid/onsite, employment type, posting date, apply URL, salary range (when published), description as text and/or HTML
  • 🇪🇺 European ATS included - Personio, Recruitee, Teamtailor and Workable, plus EU-hosted Greenhouse and Lever boards
  • 🔎 Filters before you pay - keywords (title or description), excluded words, locations, departments, remote only, posted within N days. Filtered-out jobs are never stored
  • 🔔 "Only new jobs" monitoring - remembers job IDs between runs; perfect for daily schedules, Slack/email alerts, n8n / Make / Zapier flows
  • 🛡️ Polite and reliable - uses each ATS's public job-board feed (the same data the company publishes for candidates), checks robots.txt, one request at a time per host, retries with backoff, one failing company never breaks the run
  • 🤖 AI-agent ready - flat JSON, stable jobId and contentHash fields for de-duplication and change detection

Who is it for?

  • Job boards & aggregators that need fresh postings from hundreds of company career sites
  • Recruiters & talent-intelligence teams tracking who is hiring, for which roles and where
  • Sales teams using hiring as a buying signal ("companies hiring data engineers in Germany")
  • Investors & analysts monitoring headcount growth of portfolio or competitor companies
  • Job seekers & communities building niche boards (remote, climate, AI, DACH...)

How to scrape jobs from Greenhouse, Lever, Ashby and more

  1. Click Try for free.
  2. In Company career pages or ATS boards, add one line per company, any of:
    • a board URL: https://boards.greenhouse.io/airbnb, https://jobs.lever.co/palantir, https://jobs.ashbyhq.com/openai, https://apply.workable.com/huggingface, https://bunq.recruitee.com, https://personio.jobs.personio.de, https://career.teamtailor.com
    • a shorthand: greenhouse:airbnb, lever:palantir, ashby:openai, workable:huggingface, recruitee:bunq, personio:personio, teamtailor:career, greenhouse-eu:<slug>, lever-eu:<slug>
    • any careers page: https://www.notion.com/careers, https://linear.app/careers
  3. Optionally add filters (keywords, locations, remote only, posted within days).
  4. Click Start and download the results as JSON, CSV, Excel or via API.

Example input

{
"companies": [
"greenhouse:airbnb",
"https://jobs.lever.co/palantir",
"https://www.notion.com/careers",
"https://bunq.recruitee.com",
"https://personio.jobs.personio.de"
],
"keywords": ["engineer", "developer"],
"locations": ["London", "Amsterdam", "Munich", "Remote"],
"postedWithinDays": 30,
"onlyNewJobs": true,
"stateKey": "eu-engineering-monitor",
"descriptionFormat": "text"
}

Example output

{
"jobId": "ashby:linear:d3bc1ced-3ce4-4086-a050-555055dbb1ff",
"ats": "ashby",
"companySlug": "Linear",
"companyName": "Linear",
"title": "Senior / Staff Fullstack Engineer",
"department": "Product",
"team": "Engineering",
"location": "Europe",
"locations": ["Europe"],
"country": "European Union",
"workplaceType": "remote",
"isRemote": true,
"employmentType": "FullTime",
"postedAt": "2021-04-27T20:13:45.158000Z",
"url": "https://jobs.ashbyhq.com/Linear/d3bc1ced-3ce4-4086-a050-555055dbb1ff",
"applyUrl": "https://jobs.ashbyhq.com/Linear/d3bc1ced-3ce4-4086-a050-555055dbb1ff/application",
"salaryMin": null,
"salaryMax": null,
"salaryCurrency": null,
"salaryText": null,
"descriptionText": "At Linear, we're building the product development system for teams and agents...",
"contentHash": "75b14f030f31a8f0",
"scrapedAt": "2026-10-23T03:44:27Z"
}

Ashby boards that publish compensation also fill salaryMin, salaryMax, salaryCurrency, salaryInterval and salaryText (e.g. "$250K - $445K"). Lever and Recruitee salary ranges are included when the company publishes them.

A run summary (jobs found / saved per company, errors, request count) is saved as OUTPUT in the run's key-value store.

Output fields

FieldDescription
jobIdStable unique ID ats:company:postingId - use it to de-duplicate
ats, companySlug, companyNameWhere the job comes from
title, department, team, seniorityRole details (seniority from Personio)
location, locations, countryPrimary location, all locations, country (when provided)
workplaceType, isRemoteremote / hybrid / onsite and a boolean remote flag
employmentTypeFull-time, part-time, contract... as given by the ATS
postedAt, updatedAtISO-8601 UTC
url, applyUrlPublic job page and application link
salaryMin, salaryMax, salaryCurrency, salaryInterval, salaryTextPay range when the company publishes it
descriptionText, descriptionHtmlFull job description
contentHashChanges when title, location or description change

How much does it cost to scrape ATS jobs?

During the launch period this Actor is free to use - you only pay standard Apify platform usage, which is tiny because it calls public JSON/XML feeds instead of rendering pages. In our test on the Apify platform, a run that saved 659 jobs from 5 companies cost about $0.004 in platform usage at 256 MB memory (roughly $0.006 per 1,000 jobs); a single small board costs well under $0.001. Your actual cost depends on your plan and inputs.

Jobs removed by your filters or already returned by a previous "only new jobs" run are never written to the dataset, so they cost nothing.

Tips

  • JavaScript-only careers pages: if auto-detection fails, open the page, click any job and copy the board URL (e.g. jobs.lever.co/...) into the input.
  • EU-hosted boards: use greenhouse-eu:slug / lever-eu:slug or paste the .eu. board URL.
  • Personio language: set Personio feed language (e.g. de) to get German descriptions.
  • Several monitors: give each schedule its own Monitoring state key.

Integrations and API

Run it from the Apify API, the Python/JS clients, or connect it to Make, Zapier, n8n, Google Sheets, Slack, Airbyte and webhooks. AI agents can call it through the Apify MCP server.

This Actor only reads public job postings that companies publish through their ATS's public job-board feeds for candidates and job aggregators. It does not log in, bypass paywalls or CAPTCHAs, and it does not collect candidate or employee data (recruiter contact fields such as reply-to mailboxes are dropped). It respects robots.txt and paces requests. You are responsible for how you use the data and for complying with each company's terms and with laws such as GDPR. When in doubt, consult a lawyer. Read more in Apify's blog post Is web scraping legal?

Not supported (yet)

Workday, SmartRecruiters, iCIMS, SuccessFactors, BambooHR and LinkedIn/Indeed are not supported in this version. Missing an ATS? Open an issue in the Issues tab - requests with the most votes get built first.

Support

Found a bug or a board that doesn't parse? Open an issue with the input you used - we aim to fix broken boards quickly.