Greenhouse & Lever ATS Jobs Scraper (FreshActors)
Pricing
from $20.00 / 1,000 company jobs fetcheds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 hours ago
Last modified
Categories
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.

✅ 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).automode 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.
| Field | Type | Description |
|---|---|---|
_type | string | Always job. |
_schemaVersion | string | Output schema version (e.g. 1.0). |
_source | string | greenhouse or lever — which ATS this record came from. |
company | string | Board token / company slug. |
jobId | string | ATS-native posting ID. |
title | string | Job title. |
department | string | null | Department. |
team | string | null | Team (Lever-rich). |
location | string | null | Primary location. |
allLocations | string[] | All listed locations. |
workplaceType | string | null | remote / hybrid / onsite where provided. |
commitment | string | null | e.g. Permanent, Contract. |
country | string | null | Country code where provided. |
url | string | Public posting URL. |
applyUrl | string | null | Direct apply URL. |
postedAt | string | null | ISO timestamp posted. |
updatedAt | string | null | ISO timestamp updated. |
descriptionText | string | null | Full description text (when includeDescription is on). |
_scrapedAt | string | ISO 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,postedAtper posting. - Recruiting & talent sourcing. Aggregate live openings across dozens of target employers into one table. Filter by
workplaceType: remoteorcommitmentwithout 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/updatedAtgive you a clean time series of when roles open across companies — no manual board-watching.
Input
| Field | Type | Required | Notes |
|---|---|---|---|
companies | string[] | ✅ | Board tokens (gitlab) or board URLs (https://jobs.lever.co/spotify, https://boards.greenhouse.io/airbnb). One per row. |
ats | string | — | auto (try Greenhouse then Lever) / greenhouse / lever. Default auto. URLs auto-detect regardless. |
includeDescription | boolean | — | Fetch full description text per posting. Default true. |
maxJobsPerCompany | integer | — | Cap 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:
| Event | Price (USD) | When it fires |
|---|---|---|
| Company jobs fetched | $0.02 | Once per company board successfully fetched. |
| Job posting fetched | $0.0005 | Once 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 actor | What it scrapes |
|---|---|
| App Store Scraper | Apple App Store — app details, search, reviews |
| Google Play Scraper | Google Play — app details + reviews |
| Shopify App Store Scraper | Shopify App Store — app details, reviews, discovery |
| Redfin Scraper | Redfin — US real-estate listings |
| Greenhouse & Lever Jobs Scraper | Greenhouse + 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.