Multi-ATS Jobs Scraper (Greenhouse, Lever, Ashby)
Pricing
from $3.00 / 1,000 jobs
Multi-ATS Jobs Scraper (Greenhouse, Lever, Ashby)
Scrape job postings from Greenhouse, Lever, and Ashby into one unified, structured dataset. No login. Salary, location, department, employment type — normalized across all three ATS. Per-company change-detection between runs.
Pricing
from $3.00 / 1,000 jobs
Rating
0.0
(0)
Developer
Always Prime
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
🤖 Multi-ATS Jobs Scraper — Greenhouse · Lever · Ashby
One actor, three ATS, one unified schema. Scrape job postings from Greenhouse, Lever, and Ashby in a single run — every record is the same shape, no matter which ATS hosted it. Salary, location, department, employment type — all normalized.
⚡️ Fast (no browser, pure HTTP) · 🚀 Cheap (256 MB image) · 📦 Three output formats · 🆕 Built-in change-detection between runs.
🎯 Why this scraper
- Unified schema across three ATS. Filter, dedupe, and join on the same fields whether the job came from Greenhouse, Lever, or Ashby. No more ATS-specific glue code.
- Salary normalization.
salary_min,salary_max,salary_currency,salary_periodpopulated from the cleanest source each ATS exposes (JSON-LD on Ashby, regex-best-effort on Greenhouse and Lever). - Change-detection. Toggle
onlyNewSinceLastRunand each subsequent run pushes only new jobs (is_new: true) and closed jobs (is_closed: true). Perfect for nightly diffs. - Incremental mode. Filter by
sinceto skip jobs older than your last sync. - Stable IDs. Every record has a global ID
{ats}:{company_slug}:{job_id}— diff, join, and dedupe across runs without ambiguity. - Multi-company in one run. Drop a list of slugs per ATS and the actor fans out concurrently.
🚀 Quick start
- Try for free — click the green Try for free button on this page.
- Pick your companies — paste each company's slug into Greenhouse / Lever / Ashby fields. (See FAQ for how to find a slug.)
- Start — click Start and watch the live log.
- Download — once the run finishes, grab the dataset as JSON, CSV, or Excel (or open it in the Apify Console).
⚙️ Input fields
| Field | Type | Default | Description |
|---|---|---|---|
greenhouseCompanies | list of strings | [] | Greenhouse slugs (e.g. airbnb, stripe, discord). Find at boards.greenhouse.io/<slug>. |
leverCompanies | list of strings | [] | Lever slugs (e.g. palantir, mixpanel, netflix). Find at jobs.lever.co/<slug>. |
ashbyCompanies | list of strings | [] | Ashby slugs (e.g. ramp, linear, vercel). Find at jobs.ashbyhq.com/<slug>. |
maxItems | integer | 0 (unlimited) | Stop after this many records across all companies. Useful for testing or daily caps. |
includeDescriptionHtml | boolean | true | Drop full HTML descriptions to shrink dataset by ~70-90%. |
includeDescriptionText | boolean | true | Drop plaintext descriptions. |
since | datetime | — | Skip jobs published/updated before this date. ISO format. |
onlyNewSinceLastRun | boolean | false | Diff mode — emit only new and closed jobs vs the previous run. |
concurrency | integer | 5 | In-flight HTTP requests cap. Hard cap 25. |
📦 Sample output
{"id": "ashby:ramp:8c004352-f162-4d89-858f-75a649e77ec4","ats": "ashby","company_slug": "ramp","company_name": "Ramp","job_id": "8c004352-f162-4d89-858f-75a649e77ec4","title": "Account Executive | Commercial","url": "https://jobs.ashbyhq.com/ramp/8c004352-f162-4d89-858f-75a649e77ec4","apply_url": "https://jobs.ashbyhq.com/ramp/8c004352-f162-4d89-858f-75a649e77ec4","description_html": "<h1><strong>About Ramp</strong></h1>...","description_text": "About Ramp Ramp is building the smart infrastructure...","department": "Sales","teams": ["Sales", "Account Executive"],"location": "New York, NY (HQ)","secondary_locations": ["San Francisco, CA"],"country": "US","workplace_type": "hybrid","employment_type": "full_time","salary_min": 144000,"salary_max": 220000,"salary_currency": "USD","salary_period": "year","salary_summary": "$144K – $220K • Offers Equity • Offers Commission • Multiple Ranges","published_at": "2025-10-09","updated_at": null,"application_deadline": null,"is_new": false,"is_closed": false,"scraped_at": "2026-05-10T18:00:00Z"}
💼 Use cases
| Who | What for |
|---|---|
| 🤖 AI-recruiter SaaS | Feed candidates fresh openings across the YC/SaaS company list with a single API. |
| 🎯 Niche job boards | Power vertical job boards (DevOps, FinTech, Climate, etc.) with a curated company list — one ETL, three ATS covered. |
| 🔍 Executive search firms | Track movement at competitor companies — new VP-level roles, closed CFO searches — via the diff mode. |
| 📊 Wage / market researchers | Build salary distributions over time. With onlyNewSinceLastRun, you get an append-only event log of postings and their compensation. |
| 🧠 ML / NLP teams | Title-to-skill, JD-to-skill, salary-prediction datasets. Same schema across three ATS = no normalization preprocessing. |
| 🛠️ HR-tech tooling | Embed real openings in your product without each customer having to integrate with three different ATS APIs. |
💡 Tips & tricks
- Building a company list? Run with
maxItems: 1for each candidate slug to verify the slug is correct before committing to a full scrape. - Daily incremental runs: schedule the actor with
onlyNewSinceLastRun: true. The first run takes a snapshot; subsequent runs emit only new and closed jobs. Combine with Apify's webhooks for real-time recruiting alerts. - Cheap diff scans: set
includeDescriptionHtml: falseandincludeDescriptionText: falseto drop ~80% of the bytes when you only care about which roles exist, not the full JD. - Cross-ATS dedupe: use the
idfield ({ats}:{slug}:{job_id}). Same role posted to two ATS → two records with different IDs, but sametitle+company_sluglets you cluster them. - Large companies: Greenhouse and Lever return all jobs in one request; even a 500-job catalog takes < 5 seconds. Ashby fetches one detail per job, so a 200-job Ashby company is the slowest path (~30-60 seconds).
❓ FAQ
Q: How do I find a company's slug? A: Visit their public careers page. The URL will be one of:
boards.greenhouse.io/<slug>or<slug>.greenhouse.io→ Greenhousejobs.lever.co/<slug>→ Leverjobs.ashbyhq.com/<slug>→ Ashby
The <slug> part is what you put in the input field.
Q: Why are some salary fields null?
A: Salary transparency varies by company and jurisdiction. Ashby exposes structured comp via JSON-LD when the company posts it. Greenhouse and Lever rely on free-text in the description, which we parse on a best-effort basis. When parsing isn't confident, we leave the structured fields null and put the original text in salary_summary.
Q: What does maxItems actually cap?
A: Total records pushed to the dataset, across all ATS. If you ask for maxItems: 50 with three ATS configured, the run stops at 50 total — first-come-first-served. For balanced sampling across ATS, run with maxItems: 0 (unlimited) and post-filter.
Q: How does change-detection work?
A: With onlyNewSinceLastRun: true, the actor stores a snapshot of seen IDs in its key-value store (SEEN_JOBS). On the next run:
- IDs not in the snapshot → pushed with
is_new: true. - IDs in the snapshot but missing this run → pushed as stub records with
is_closed: true. - IDs present in both → skipped entirely (already had them).
The first run is always a "full scan" because there's no prior snapshot.
Q: Can I scrape Workable too? A: Workable is on the v0.2 roadmap. Their public job-board API needs a different infrastructure setup than the other three ATS. Coming soon.
Q: What's the rate limit?
A: We respect each ATS's published guidance — Lever's Crawl-delay: 1 from robots.txt is honored automatically. Greenhouse and Ashby have no published limits. We default to 5 concurrent in-flight requests; you can lower it if you're scraping hundreds of companies.
💰 Pricing
This actor is pay-per-result: you're charged once per successfully scraped job posting (job-scraped event). No charge for failed companies, deduplicated records, or is_closed stubs. Try-for-free credits cover ~3,000 jobs.
🔗 Roadmap
- v0.2 — Workable support (residential infrastructure)
- v0.2 — auto-detect ATS from a careers URL (paste
careers.acme.com, we figure out the rest) - v0.3 — curated company registry as a separate actor (1,000+ pre-tagged companies grouped by industry)
- v0.3 — webhook-friendly diff mode (push only changes to a URL of your choice)
Built on the Apify platform.