Multi-ATS Jobs Scraper (Greenhouse, Lever, Ashby) avatar

Multi-ATS Jobs Scraper (Greenhouse, Lever, Ashby)

Pricing

from $3.00 / 1,000 jobs

Go to Apify Store
Multi-ATS Jobs Scraper (Greenhouse, Lever, Ashby)

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

Always Prime

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

🤖 Multi-ATS Jobs Scraper — Greenhouse · Lever · Ashby

Python Apify Output

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_period populated from the cleanest source each ATS exposes (JSON-LD on Ashby, regex-best-effort on Greenhouse and Lever).
  • Change-detection. Toggle onlyNewSinceLastRun and each subsequent run pushes only new jobs (is_new: true) and closed jobs (is_closed: true). Perfect for nightly diffs.
  • Incremental mode. Filter by since to 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

  1. Try for free — click the green Try for free button on this page.
  2. Pick your companies — paste each company's slug into Greenhouse / Lever / Ashby fields. (See FAQ for how to find a slug.)
  3. Start — click Start and watch the live log.
  4. Download — once the run finishes, grab the dataset as JSON, CSV, or Excel (or open it in the Apify Console).

⚙️ Input fields

FieldTypeDefaultDescription
greenhouseCompanieslist of strings[]Greenhouse slugs (e.g. airbnb, stripe, discord). Find at boards.greenhouse.io/<slug>.
leverCompanieslist of strings[]Lever slugs (e.g. palantir, mixpanel, netflix). Find at jobs.lever.co/<slug>.
ashbyCompanieslist of strings[]Ashby slugs (e.g. ramp, linear, vercel). Find at jobs.ashbyhq.com/<slug>.
maxItemsinteger0 (unlimited)Stop after this many records across all companies. Useful for testing or daily caps.
includeDescriptionHtmlbooleantrueDrop full HTML descriptions to shrink dataset by ~70-90%.
includeDescriptionTextbooleantrueDrop plaintext descriptions.
sincedatetimeSkip jobs published/updated before this date. ISO format.
onlyNewSinceLastRunbooleanfalseDiff mode — emit only new and closed jobs vs the previous run.
concurrencyinteger5In-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

WhoWhat for
🤖 AI-recruiter SaaSFeed candidates fresh openings across the YC/SaaS company list with a single API.
🎯 Niche job boardsPower vertical job boards (DevOps, FinTech, Climate, etc.) with a curated company list — one ETL, three ATS covered.
🔍 Executive search firmsTrack movement at competitor companies — new VP-level roles, closed CFO searches — via the diff mode.
📊 Wage / market researchersBuild salary distributions over time. With onlyNewSinceLastRun, you get an append-only event log of postings and their compensation.
🧠 ML / NLP teamsTitle-to-skill, JD-to-skill, salary-prediction datasets. Same schema across three ATS = no normalization preprocessing.
🛠️ HR-tech toolingEmbed 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: 1 for 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: false and includeDescriptionText: false to drop ~80% of the bytes when you only care about which roles exist, not the full JD.
  • Cross-ATS dedupe: use the id field ({ats}:{slug}:{job_id}). Same role posted to two ATS → two records with different IDs, but same title+company_slug lets 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.ioGreenhouse
  • jobs.lever.co/<slug>Lever
  • jobs.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.