ATS Jobs Scraper: Greenhouse, Lever, Ashby & More
Pricing
from $1.05 / 1,000 job results
ATS Jobs Scraper: Greenhouse, Lever, Ashby & More
Search jobs across 12,000+ verified career boards (Greenhouse, Lever, Ashby, Workable, Recruitee, Personio) or your own list. Seniority, country, salary and remote filters, new and closed job alerts, hiring velocity per company. $1.50/1K jobs.
Pricing
from $1.05 / 1,000 job results
Rating
0.0
(0)
Developer
Michael Best
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 hours ago
Last modified
Categories
Share

Search open jobs across 12,000+ verified company career boards at once, or pull every job from the companies you choose, from Greenhouse, Lever, Ashby, Recruitee, Personio and Workable. One clean dataset with seniority, country and remote type on every job, alerts for new and closed jobs, and hiring velocity per company.
Type a keyword like data engineer, tick Search every company, and get matching jobs from ~10,300 company boards with open jobs, from OpenAI and Stripe to thousands of YC-style startups. Or paste your own list in any form you have it: company names (Stripe), board URLs (https://jobs.lever.co/spotify), careers pages (https://www.notion.com/careers), domains (linear.app) or slugs (ramp). The Actor finds each company's board for you.
It reads the official public job-board APIs these ATSs publish for exactly this purpose, so runs need no proxies, browser or login, and don't break when a careers page is redesigned.
Price: $1.50 per 1,000 jobs. You pay only for jobs in your results, and in monitoring mode only for new jobs.
Why this jobs scraper?
| 🌍 Search many companies at once | A built-in directory of 12,000+ verified boards on all 6 ATSs (~10,300 with open jobs, 300,000+ jobs). Search them all by keyword, location, remote and date. Most job-board scrapers make you know the companies first; this one finds them. |
| 📋 Paste companies in any form | Names, board URLs, careers-page URLs, domains, slugs or ats:slug, one per line. Careers pages are scanned for an embedded board, and unknown slugs are auto-detected. |
| ⭐ Preset lists | One click adds verified lists: AI & ML, fintech, developer tools, top tech, climate, health. |
| 🧩 6 ATSs, one schema | Greenhouse, Lever, Ashby, Recruitee, Personio and Workable in one dataset with the same field names. |
| 🔔 New and closed jobs (monitoring) | Remembers what earlier runs returned and outputs only new postings, plus a free closed row when a job you saw before is taken down. Schedule it daily and you have a new-job alert feed, and you pay only for new jobs. |
| 📈 Hiring velocity | A HIRING_VELOCITY record ranks every company read in the run by open jobs and jobs posted in the last 7/30/90 days: a ready-made buying-signal and talent-intel list. |
| 🧭 Seniority, country, job type, remote type | Every job gets seniority (intern → executive), country (ISO code), job_type and remote_type (remote / hybrid / onsite), plus a stable global_id. Filter on any of them, or on a salary floor. |
| 📈 Salary parsing | Structured pay ranges from Ashby, Lever and Recruitee, plus min/max/currency parsed from pay-transparency text elsewhere. |
| 🎯 Filters and de-duplication | Keywords, exclude keywords, locations, remote only, posted since, max results, per-company caps; de-duplicated by URL and company + title + location. |
What data do you get?
One normalized record per open job, with the same field names whatever the ATS:
event · global_id · company · ats · board_slug · job_id · title · seniority · job_type · remote_type · country · countries · department · team · location · all_locations · remote · workplace_type · employment_type · salary_min · salary_max · salary_currency · salary_interval · salary_source · salary_yearly_max · posted_at · updated_at · job_url · apply_url · description_text · description_html (optional) · scraped_at
In monitoring mode, jobs that disappeared from a board since the last run come as event: "closed" rows with first_seen_at and closed_detected_at (never charged).
Export it as JSON, CSV, Excel or HTML, or pull it through the Apify API.
Use cases
- Job seekers: search every company for "staff data engineer, remote" or watch 20 dream companies and get only new openings every morning.
- Job boards and newsletters: build a niche board (remote, AI, fintech, climate) straight from company career pages, the original source rather than reposted aggregator listings.
- Sales and lead generation: hiring is a buying signal. Find every company hiring for "Salesforce admin" or "data platform" this week and feed them into your CRM, Clay or a sheet.
- Recruiters and talent intelligence: track competitors' hiring by department, location and seniority.
- Market and salary research: collect pay-transparency ranges across thousands of companies.
- AI agents and RAG: a clean, structured jobs feed for LLM apps.
How to use it
Your own list of companies
- Click Try for free. The input is prefilled with
Stripe,https://jobs.lever.co/spotifyandramp, 5 jobs each, so your first run takes seconds and costs about 2 cents. - Replace them with your companies, one per line, in any form. Set Max jobs per company to
0to get every open job. - Optionally add filters, then click Start.
Search every company
- Enable Search every company in the directory.
- Add keywords (e.g.
machine learning engineer) and/or locations, Remote only or Posted since. - Set Max results (e.g.
500) to cap cost and run time. A full sweep reads every board and takes about 5-10 minutes; with Max results it stops as soon as enough jobs are found.
What can I put in "Companies"?
| You type | What happens |
|---|---|
Stripe, Scale AI | Looked up by name in the directory (any ATS). If missing, slug guesses are auto-detected. |
https://jobs.lever.co/spotify, job-boards.greenhouse.io/figma, jobs.ashbyhq.com/ramp, bunq.recruitee.com, acme.jobs.personio.de, apply.workable.com/acme | Board read directly. |
https://www.notion.com/careers | The page is opened and scanned for an embedded/linked ATS board. |
linear.app | Directory lookup, then the site's /careers and /jobs pages are scanned. |
ramp | Directory, else auto-detected on Greenhouse, Lever and Ashby, then Recruitee, Personio and Workable. |
lever:spotify | Exactly that board. |
Through the API you can still pass the original object format {"ats": "greenhouse", "slug": "stripe", "name": "Stripe"}.
Input example
{"companies": ["Stripe", "https://jobs.lever.co/spotify", "notion.com", "lever:palantir"],"presetLists": ["ai-ml"],"keywords": ["engineer", "data"],"excludeKeywords": ["intern"],"locations": ["New York", "Remote"],"postedSince": "14 days","onlyNew": true,"stateKey": "my-watchlist"}
Search every company:
{ "searchAllCompanies": true, "keywords": ["rust engineer"], "remoteOnly": true, "maxResults": 200 }
Senior remote Python roles open to US candidates, paying at least 150k a year:
{ "searchAllCompanies": true, "keywords": ["python"], "seniority": ["senior", "staff"], "remoteTypes": ["remote"], "countries": ["US"], "minSalaryYearly": 150000, "maxResults": 100 }
| Field | Description |
|---|---|
companies | One per line: names, board URLs, careers pages, domains, slugs, ats:slug (or {ats, slug, name} objects via API). |
presetLists | ai-ml, fintech, devtools, top-tech, climate, health. |
searchAllCompanies | Search the whole directory (~10,300 boards with jobs). |
directoryAts | Limit the directory search to some of greenhouse, lever, ashby, recruitee, personio, workable. |
keywords / excludeKeywords | Keep / drop jobs whose title contains any of these (case-insensitive). |
searchDescription | Also match keywords in the description. |
locations | Keep jobs whose location contains any of these strings. |
remoteOnly | Keep only remote / remote-eligible jobs. |
postedSince | YYYY-MM-DD or relative (7 days, 2 weeks, 1 month). |
seniority | Keep these levels: intern, junior, mid, senior, staff, principal, lead, manager, head, director, vp, executive. |
jobTypes | full_time, part_time, contract, internship, temporary. |
remoteTypes | remote, hybrid, onsite. |
countries / countriesIncludeRemoteUnknown | ISO codes or names (US, Germany); optionally keep remote jobs with no stated country. |
requireSalary / minSalaryYearly | Only jobs with a salary / with a yearly maximum of at least this much (hourly and monthly pay annualized). |
onlyNew / stateKey | Output only jobs not returned by previous runs with the same state name. |
reportClosedJobs | With onlyNew, also output a free closed row for jobs that disappeared (default true). |
includeDescriptionHtml | Add the original HTML description (default false). |
velocityDays | Window for new_jobs_{N}d in HIRING_VELOCITY (default 7). |
includeDescription | Include plain-text description (default true). |
dedupeByTitle | Merge same company + title across locations. |
maxJobsPerCompany | Cap per company (0 = no limit). |
maxResults | Cap for the whole run (0 = no limit). |
maxConcurrency | Your listed boards fetched in parallel (default 3, max 10). |
Output example
{"company": "Ramp","event": "open","global_id": "ats_143fa3766650b2e1","ats": "ashby","board_slug": "ramp","job_id": "34413f8d-26bf-4bbc-8ade-eb309a0e2245","title": "Security Engineer, Cloud","seniority": null,"job_type": "full_time","remote_type": "hybrid","country": "US","countries": ["US", "CA"],"department": "Engineering","team": "Backend","location": "New York, NY (HQ)","all_locations": ["New York, NY (HQ)", "Remote (Canada)", "Remote (US)", "Miami, FL"],"remote": true,"workplace_type": "Hybrid","employment_type": "FullTime","salary_min": 211400,"salary_max": 290600,"salary_currency": "USD","salary_interval": "year","salary_source": "ats","posted_at": "2026-04-07T17:12:35.753000Z","updated_at": null,"job_url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245","apply_url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application","description_text": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams...","scraped_at": "2026-10-26T08:10:40Z"}
RUN_SUMMARY in the run's key-value store lists, per company, how many jobs were fetched, matched, de-duplicated, already seen and output, plus any error and inputs that couldn't be understood.
HIRING_VELOCITY (same store) looks like:
{ "window_days": 7, "companies": [{ "company": "Stripe", "ats": "greenhouse", "open_jobs": 712, "new_jobs_7d": 45, "new_jobs_30d": 204, "new_jobs_90d": 532, "share_new_30d": 0.287, "newest_posting": "2026-10-26T20:53:41Z" }] }
Field notes
senioritycomes from the title first (what the employer wrote), then the ATS's own level field.nullwhen neither says.countryis the first ISO code found in the ATS's structured location, then the location text (cities, US states,Austin, TX,Toronto, ON).global_idis stable across runs and Actors for the same ATS job.remoteistruewhen the ATS marks the job remote / remote-eligible, or a location mentions "Remote".salary_*isnullwhen the company publishes no range.salary_sourceisats(structured field) ordescription(parsed from text).posted_atis what the ATS reports (Greenhousefirst_published, LevercreatedAt, AshbypublishedAt, Recruiteepublished_at, PersoniocreatedAt, Workablepublished_on), in UTC.
Pricing
$1.50 per 1,000 jobs ($0.0015 per job in your dataset), pay per event. No start fee, and nothing to pay for boards with zero matching jobs, so a directory-wide search that finds 40 jobs costs 6 cents.
| Example | Jobs | Cost |
|---|---|---|
| First test run (3 companies × 5 jobs) | 15 | ~$0.02 |
| "Rust engineer" across all ~10,300 companies | ~25 | ~$0.04 |
| Full snapshot of 10 mid-size companies | ~1,000 | ~$1.50 |
Daily new-job alerts for 50 companies (onlyNew) | ~30 new/day | ~$1.35/month |
Filters are applied before charging. Set Max results or a maximum charge per run and the Actor stops cleanly when it's reached.
Monitoring: get alerts for new jobs
- Fill in your company list and filters, and enable Only new jobs with a Monitoring state name such as
my-watchlist. - Click Save as a new task.
- In the task, open Schedules and run it daily (for example at 8:00) or hourly.
- Add an integration so new jobs come to you: Slack, email, Google Sheets, webhook, Zapier, Make or n8n.
The first run returns everything that matches and saves it as "seen". Each later run returns only jobs that appeared since. Older postings that a cap such as Max jobs per company left out of earlier runs are not sold to you later as "new": on companies you already monitor, a job posted more than 3 days before the previous run is skipped (free, counted as backlog_skipped in RUN_SUMMARY). Companies you add to the list later still get their full first batch. Use a different state name for each watchlist so schedules don't interfere.
Run it from the API
curl -X POST "https://api.apify.com/v2/acts/resonating_quoll~ats-jobs-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"companies": ["Stripe", "https://jobs.lever.co/spotify", "ramp"], "remoteOnly": true}'
FAQ
How is this different from other ATS job scrapers? Most require you to know each company's ATS and slug and only read the boards you list. This Actor also searches a built-in directory of 12,000+ verified boards on all six ATSs, adds seniority / country / remote type, reports closed jobs and hiring velocity, accepts names, URLs, careers pages and domains, and offers ready-made company lists.
Is it legal to scrape Greenhouse, Lever, Ashby, Recruitee, Personio and Workable jobs?
The Actor uses only the public, unauthenticated job-board APIs and feeds these platforms provide so companies' listings can be shown on other sites (boards-api.greenhouse.io, api.lever.co, api.ashbyhq.com/posting-api, {company}.recruitee.com/api/offers, {company}.jobs.personio.de/xml, apply.workable.com/api/v1/widget). It collects job postings only, no personal data. You're responsible for how you use the data.
Do I need proxies or a login? No. These are public APIs, so runs are fast and cheap.
How many companies are in the directory, and how fresh is it? 12,033 boards (Greenhouse, Lever, Ashby, plus 245 Workable, Recruitee and Personio boards), each verified live when the directory was built (~10,300 had open jobs). Jobs are always fetched live at run time. Any other Recruitee, Personio or Workable company works when you list it by URL or slug.
What if a company can't be found?
It gets an error in RUN_SUMMARY, the rest of the run continues, and you aren't charged for it. Try its careers-page URL or a job URL instead of the name.
Why is a salary missing?
Many companies don't publish pay. Where the ATS has no structured pay field, salary comes from pay-transparency text in the description, and is null when none is stated.
Does it support Workday or SmartRecruiters? No. SmartRecruiters' API policy prohibits systematic data extraction and Workday has no public jobs API with clear terms, so we leave them out.
Limitations
- The directory is mostly Greenhouse, Lever and Ashby; it has only 245 Workable, Recruitee and Personio boards so far. Any other company on those works when you list it.
- Closed-job detection only runs on boards read completely in that run (a board cut short by Max results is skipped, so it never reports false closures).
- Seniority and country are inferred from text and can be
nullor occasionally wrong. - Workable rate-limits its public API; very long Workable lists run slower.
- Description salary parsing skips hourly rates.
posted_atreflects what each ATS reports, and some companies re-publish old jobs.
Use with AI agents (Apify MCP)
Give Claude, Cursor, ChatGPT or any MCP client this Actor as a tool through the Apify MCP server:
{"mcpServers": {"apify": { "url": "https://mcp.apify.com?tools=resonating_quoll/ats-jobs-scraper" }}}
The first connection signs you in to Apify in the browser (OAuth). Then ask, for example: "Find senior remote data engineering jobs in the US posted this week, salary 150k+" or "Which AI companies are hiring fastest right now?" The agent can also read HIRING_VELOCITY from the run's key-value store.
Directory sources and credits
The company directory was built from openly licensed lists and every board was verified against its live API:
- LastRound AI ATS directory by LastRound AI, licensed CC BY 4.0. We filtered it to live boards and added job counts.
- Workable, Recruitee and Personio slugs from OpenJobs (MIT, © 2026 Santiago Fernández de Valderrama and Outscal), africa-ats-directory (MIT) and ever-jobs (MIT). Full notices ship in
src/DIRECTORY_LICENSES.txt. - ats-jobs-mcp
directory.jsonby Ground Truth, used under the MIT License:
MIT LicenseCopyright (c) 2026 Ground TruthPermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THESOFTWARE.
More from this developer
- Remote Jobs Scraper: terms-clean remote jobs straight from 5,800+ employer career pages plus Remote OK and Jobicy, deduplicated and trust-scored.
- Startup Funding Tracker: SEC Form D: companies that just raised money, from SEC Form D filings, with a weekly funding drop summary.
Feedback
Found a bug or want another ATS supported? Open an issue on the Issues tab.