Greenhouse & Lever ATS Jobs Scraper (FreshActors) avatar

Greenhouse & Lever ATS Jobs Scraper (FreshActors)

Pricing

from $20.00 / 1,000 company jobs fetcheds

Go to Apify Store
Greenhouse & Lever ATS Jobs Scraper (FreshActors)

Greenhouse & Lever ATS Jobs Scraper (FreshActors)

Reliable, always-fresh job postings normalized across Greenhouse and Lever ATS boards. Public JSON, no login. Monitored daily. By FreshActors.

Pricing

from $20.00 / 1,000 company jobs fetcheds

Rating

0.0

(0)

Developer

Martin Čech

Martin Čech

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 hours ago

Last modified

Share

Greenhouse & Lever ATS Jobs Scraper — One Normalized Schema, No API Key

Scrape Greenhouse and Lever ATS job postings from any company's public board into a single, stable JSON schema — no account, no login, no two-parser headache.

Greenhouse & Lever Jobs Scraper — two ATS, one normalized schema

Last verified working: 2026-06-01. Monitored by an automated daily canary. When an ATS changes its public API, we patch fast and log it in the changelog below.


Why this Greenhouse & Lever ATS jobs scraper

If you've ever tried to scrape Greenhouse and Lever jobs yourself, you know the catch: the two ATS platforms return completely different JSON, so you end up writing and maintaining two separate parsers — and re-fixing them every time a board shape shifts. This actor exists to kill that maintenance tax.

  • One schema for two ATS. Greenhouse (boards-api.greenhouse.io) and Lever (api.lever.co) are mapped into a single, stable job record. Query 100 companies uniformly instead of branching on which ATS each one uses. That normalization is the product.
  • No fragile site to break. Job data lives behind each company's own public JSON board token — there's no global search page, no rotating HTML, no anti-bot wall to fight. We read the lowest-risk, most stable source there is: the boards the companies already serve publicly.
  • Auto-detects the ATS. Pass a bare token (gitlab) or a full board URL (https://jobs.lever.co/spotify). auto mode tries Greenhouse, then Lever, so you don't have to know which a company uses.
  • Per-company isolation + retries. A dead, renamed, or private board is skipped — it never crashes the whole run. Transient errors retry with backoff.
  • Versioned, monitored schema. Every record carries _schemaVersion, and a daily canary confirms both ATS endpoints still parse — so your hiring-signal pipeline never breaks silently.

The "always-fresh" promise is operational, not marketing: a scheduled canary scrapes a known board every day, alerts on a parse change, and the fix ships the same day with a changelog entry.

What data you get

Every posting — Greenhouse or Lever — comes back as one normalized job record. Fields the source ATS doesn't provide return null rather than disappearing, so your downstream schema stays predictable.

FieldTypeDescription
_typestringAlways job.
_schemaVersionstringOutput schema version (e.g. 1.0).
_sourcestringgreenhouse or lever — which ATS this record came from.
companystringBoard token / company slug.
jobIdstringATS-native posting ID.
titlestringJob title.
departmentstring | nullDepartment.
teamstring | nullTeam (Lever-rich).
locationstring | nullPrimary location.
allLocationsstring[]All listed locations.
workplaceTypestring | nullremote / hybrid / onsite where provided.
commitmentstring | nulle.g. Permanent, Contract.
countrystring | nullCountry code where provided.
urlstringPublic posting URL.
applyUrlstring | nullDirect apply URL.
postedAtstring | nullISO timestamp posted.
updatedAtstring | nullISO timestamp updated.
descriptionTextstring | nullFull description text (when includeDescription is on).
_scrapedAtstringISO timestamp this record was fetched.

Modes: the ats input controls how bare tokens are resolved — auto (try Greenhouse, then Lever), greenhouse, or lever. Full board URLs are auto-detected regardless of this setting.

Use cases

  • Sales intelligence / hiring-signal tracking. Watch which companies are hiring AI engineers, opening a new office, or staffing a GTM team. Searching for a Greenhouse and Lever jobs API to feed your lead-scoring model? This is the structured feed — department, team, location, postedAt per posting.
  • Recruiting & talent sourcing. Aggregate live openings across dozens of target employers into one table. Filter by workplaceType: remote or commitment without writing a Lever-vs-Greenhouse adapter.
  • Job boards & aggregators. Building a niche board and need to scrape Greenhouse and Lever ATS jobs into a uniform feed? Point the actor at your company list and ingest normalized records on a schedule.
  • Labor-market & VC research. Track headcount-growth signals across a portfolio. postedAt / updatedAt give you a clean time series of when roles open across companies — no manual board-watching.

Input

FieldTypeRequiredNotes
companiesstring[]Board tokens (gitlab) or board URLs (https://jobs.lever.co/spotify, https://boards.greenhouse.io/airbnb). One per row.
atsstringauto (try Greenhouse then Lever) / greenhouse / lever. Default auto. URLs auto-detect regardless.
includeDescriptionbooleanFetch full description text per posting. Default true.
maxJobsPerCompanyintegerCap per company (1–5000). Default 1000.

Auto-detect mode (mixed tokens + URLs):

{
"companies": ["gitlab", "https://jobs.lever.co/spotify", "airbnb"],
"ats": "auto",
"includeDescription": true,
"maxJobsPerCompany": 1000
}

Greenhouse-only mode (bare tokens you know are Greenhouse):

{
"companies": ["gitlab", "airbnb", "stripe"],
"ats": "greenhouse",
"includeDescription": false,
"maxJobsPerCompany": 500
}

Lever-only mode:

{
"companies": ["spotify", "netflix"],
"ats": "lever",
"includeDescription": true
}

Output sample

A real normalized Lever record:

{
"_type": "job",
"_schemaVersion": "1.0",
"_source": "lever",
"company": "spotify",
"jobId": "1ff4a4e3-0000-0000-0000-000000000000",
"title": "Account Executive - Backstage",
"department": "Operations and Business Support",
"team": "Platform",
"location": "Toronto",
"allLocations": ["Toronto"],
"workplaceType": "hybrid",
"commitment": "Permanent",
"country": "CA",
"url": "https://jobs.lever.co/spotify/1ff4a4e3-...",
"applyUrl": "https://jobs.lever.co/spotify/1ff4a4e3-.../apply",
"postedAt": "2026-03-12T17:10:21.350Z",
"updatedAt": null,
"descriptionText": "About the role...",
"_scrapedAt": "2026-06-01T09:14:02.118Z"
}

A Greenhouse record (note ATS-specific gaps come back null, not missing):

{
"_type": "job",
"_schemaVersion": "1.0",
"_source": "greenhouse",
"company": "gitlab",
"jobId": "8503792002",
"title": "AI Engineer",
"department": "Enterprise Applications",
"team": null,
"location": "Remote, US",
"allLocations": ["Remote, US"],
"workplaceType": "remote",
"commitment": null,
"country": null,
"url": "https://job-boards.greenhouse.io/gitlab/jobs/8503792002",
"applyUrl": "https://boards.greenhouse.io/gitlab/jobs/8503792002#app",
"postedAt": "2026-05-29T07:49:29-04:00",
"updatedAt": "2026-05-29T07:49:29-04:00",
"descriptionText": "GitLab is...",
"_scrapedAt": "2026-06-01T09:14:02.090Z"
}

Pricing

Pay-per-event — no subscription. You pay only for the boards you fetch and the postings you receive:

EventPrice (USD)When it fires
Company jobs fetched$0.02Once per company board successfully fetched.
Job posting fetched$0.0005Once per job posting returned.

Worked example — "how much do 100 results cost?" Say you scrape 5 companies and get 100 job postings total:

  • Boards: 5 × $0.02 = $0.10
  • Postings: 100 × $0.0005 = $0.05
  • Total: $0.15 for 100 normalized jobs across 5 companies.

Scale it up: 50 companies × 1,000 postings each = 50 × $0.02 + 50,000 × $0.0005 = $1.00 + $25.00 = $26.00 for 50,000 normalized postings.

FAQ

Is scraping Greenhouse & Lever ATS jobs legal? This actor reads public, non-personal job-posting data from companies' own public ATS boards — the same data their careers pages serve to any visitor. No login, no personal data. Use responsibly and in line with applicable terms and laws.

Do I need an API key? No. There's no Greenhouse or Lever API key, no account, and no login. You provide a list of company board tokens or URLs and the actor reads their public JSON boards.

How do I find a company's board token? It's the slug in their careers URL — boards.greenhouse.io/**gitlab** or jobs.lever.co/**spotify**. You can paste either the bare token or the full URL.

What's the difference between Greenhouse and Lever in the output? None, by design — both are mapped to the same schema. The _source field tells you which ATS the record came from. Lever boards tend to populate team, commitment, and country; Greenhouse populates department. Missing fields return null.

How often is the data updated? It's live — every run fetches the companies' current public boards in real time. The actor itself is monitored by a daily canary so parsing stays correct as ATS endpoints evolve.

Can I get the full job description text? Yes. Set includeDescription: true (the default) and each posting includes descriptionText. Turn it off to fetch faster and lighter when you only need titles, locations, and metadata.

Can I scrape many companies at once? Yes — pass as many tokens/URLs in companies as you need. Each board is fetched in isolation; a dead or private board is skipped rather than failing the run. Use maxJobsPerCompany (1–5000) to cap per-company volume.

Does it handle remote / hybrid filtering? The output includes workplaceType (remote / hybrid / onsite where the ATS provides it), plus location and allLocations[], so you can filter downstream.

What if a company uses neither Greenhouse nor Lever? That board simply returns no jobs and is skipped — it won't crash the run. This actor covers Greenhouse and Lever specifically.

Can I get salary or applicant data? No. Public ATS boards don't expose salary or applicant data, so the actor doesn't either — it returns only the public posting fields listed above.

Other FreshActors tools

FreshActors actorWhat it scrapes
App Store ScraperApple App Store — app details, search, reviews
Google Play ScraperGoogle Play — app details + reviews
Shopify App Store ScraperShopify App Store — app details, reviews, discovery
Redfin ScraperRedfin — US real-estate listings
Greenhouse & Lever Jobs ScraperGreenhouse + Lever — normalized job postings

Reliability

Staying fresh is the whole point of FreshActors. A scheduled daily canary scrapes a known Greenhouse board and a known Lever board, validates the normalized schema, and alerts the moment a parse changes. When an ATS shifts its public JSON, we patch the same day and record it in the changelog below. Every record is stamped with _schemaVersion and _scrapedAt so you always know what shape you're consuming and when it was fetched.

Changelog

  • 2026-06-01 — v1.0 launch. Normalized Greenhouse + Lever jobs, ATS auto-detection, full descriptions, per-company isolation, daily canary monitoring.

Legal note: Reads public, non-personal job-posting data from companies' own public ATS boards (the same data their careers pages serve). No login, no personal data. Use responsibly and in line with applicable terms and laws.

Found a problem? Open an issue on the actor — issues are answered fast.