Lever ATS Jobs Scraper – Scrape Lever.co
Pricing
from $2.00 / 1,000 results
Lever ATS Jobs Scraper – Scrape Lever.co
Unofficial Lever.co API: scrape Lever ATS job postings and salary data without an API key, export to CSV/JSON. No login, global + EU instances.
Pricing
from $2.00 / 1,000 results
Rating
0.0
(0)
Developer
Logiover
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Lever Postings API — Tech Jobs, Salary & ATS Data Scraper

Scrape jobs, structured salary data, workplace type and full content blocks from any company powered by Lever — Netflix, Spotify, Shopify, Mixpanel, Lyra Health, Reddit and thousands more Lever-hosted career pages. This unofficial Lever Postings API Actor turns Lever's raw public endpoints into clean, normalized, downstream-ready records you can export to JSON, CSV or Excel.
Pure HTTP — no authentication, no API key, no headless browser. Sub-second responses per board, support for both global (api.lever.co) and EU (api.eu.lever.co) Lever instances, and server-side filtering forwarded straight to Lever's native API for the fastest possible results. If you want to scrape Lever jobs or build a Lever ATS data pipeline, this is the Actor.
✨ What this Actor does / Key features
- Unofficial Lever Postings API — scrape every published job from any Lever site with a single input; no credentials required.
- Real structured salary data — Lever exposes
salaryRangeas{currency, interval, min, max}, not buried in HTML. Filter, sort and benchmark compensation directly. - Workplace type — explicit
remote,hybrid,on-siteorunspecifiedper posting, perfect for remote-job pipelines. - Server-side filtering —
team,department,location,commitmentandlevelare forwarded to Lever's native API so only matching postings are downloaded. - Client-side filtering — title keywords, workplace types, ISO country codes and minimum disclosed salary, applied after fetch for criteria Lever can't filter on.
- Two modes —
jobs(list every posting from one or more sites) andjobDetail(refresh specific postings by UUID). - Global + EU instances — a simple toggle swaps the base URL for European employers.
- Concurrent multi-site batching — fetch up to 20 Lever boards in parallel.
- Structured content blocks — Lever's
lists[](Qualifications, Responsibilities, etc.) are preserved as separate objects, plus HTML and LLM-ready plaintext (*Plain) variants of every content field. - Stable & low-maintenance — built on Lever's public API, not fragile HTML parsing.
🔍 Input
| Field | Type | Description |
|---|---|---|
mode | string (enum) | jobs — list all postings (one call per site), or jobDetail — fetch single postings by ID. Default jobs. Required. |
sites | array | One or more Lever site names (the account name in https://jobs.lever.co/{SITE}). Case-sensitive. For jobDetail only the first site is used. |
instance | string (enum) | global (api.lever.co) or eu (api.eu.lever.co). Use eu if global returns 404s. Default global. |
jobIds | array | Posting UUIDs to fetch. Required when mode = jobDetail. |
team | array | Server-side filter on Lever's team category. Case-sensitive; multiple values OR'ed. |
department | array | Server-side filter on department. Case-sensitive; multiple values OR'ed. |
location | array | Server-side filter on location. Case-sensitive; multiple values OR'ed. |
commitment | array | Server-side filter on employment type (e.g. Full Time, Internship, Contract). Case-sensitive. |
level | array | Server-side filter on seniority level (customer-defined, e.g. Senior, Director). |
limit | integer | Lever's native ?limit= — caps postings returned per board. 0 = no cap. |
skip | integer | Lever's native ?skip= — offset for pagination. |
group | string (enum) | Lever's ?group= — none, team, commitment or location. Default none. |
filterTitleKeywords | array | Client-side: keep postings whose title contains any of these strings (case-insensitive). |
filterWorkplaceTypes | array | Client-side: keep only chosen workplace types (on-site, remote, hybrid, unspecified). |
filterCountries | array | Client-side: keep only postings matching these ISO 3166-1 alpha-2 country codes. |
filterSalaryMin | integer | Client-side: keep only postings with salaryRange.min >= this value. Postings without a disclosed salary are dropped when active. 0 = disabled. |
maxResultsPerSite | integer | Hard cap applied after all filters. 0 = unlimited. |
concurrency | integer | How many sites to fetch in parallel (1–20). Default 5. |
🚀 Example input
{"mode": "jobs","sites": ["netflix-jobs", "shopify"],"instance": "global","team": ["Engineering"],"filterWorkplaceTypes": ["remote", "hybrid"],"filterCountries": ["US", "CA"],"filterSalaryMin": 150000,"concurrency": 4}
Minimal smoke test (the leverdemo site always works):
{"mode": "jobs","sites": ["leverdemo"]}
📦 Output
Each posting is a flat, normalized record. Below are the main fields from the dataset schema.
| Field | Description |
|---|---|
_mode | Which mode produced the record (jobs or jobDetail). |
site | The Lever account name (URL slug). |
instance | global or eu. |
id | Lever's globally unique posting UUID. |
title | Job title (Lever's text field). |
team | Internal team name. |
department | Broader org unit (optional). |
location | Primary office / location string. |
allLocations | Array of all eligible locations for multi-city postings. |
commitment | Employment type (Full Time, Internship, Contract, …). |
level | Seniority tag (optional, customer-defined). |
country | ISO 3166-1 alpha-2 country code for the primary location. |
workplaceType | on-site, remote, hybrid or unspecified. |
createdAt / createdAtIso | Posting creation time as epoch ms and ISO 8601. |
hostedUrl / applyUrl | Public Lever-hosted posting page and application form URLs. |
opening / openingPlain | Intro paragraph, HTML and plaintext. |
description / descriptionPlain | Combined opening + body, HTML and plaintext. |
descriptionBody / descriptionBodyPlain | Body without the intro, HTML and plaintext. |
additional / additionalPlain | Closing content (EEO statements, boilerplate). |
fullDescription / fullDescriptionPlain | Convenience concatenation of all sections + lists. |
lists | Structured sub-sections (Qualifications, Responsibilities…) as {text, content} objects. |
salaryRange | Raw Lever object {currency, interval, min, max}; null when not disclosed. |
salaryMin / salaryMax | Flattened salary bounds for easy filtering/sorting. |
salaryCurrency / salaryInterval | Flattened currency and interval (e.g. per-year-salary). |
salaryDescription / salaryDescriptionPlain | Optional employer note about the salary. |
scrapedAt | ISO 8601 timestamp of when the record was produced. |
Note: Many Lever fields are optional.
salaryRange,workplaceType,country,commitment,locationanddepartmentmay be absent depending on how the employer configured the posting. The Actor returnsnull(or an empty array forallLocations/lists) when a field is missing.
💡 Use cases
- Recruitment intelligence & talent acquisition — build a real-time feed of every role a target company is hiring for, with salary benchmarks per level and region.
- HR tech & ATS market analytics — track which companies use Lever, hiring velocity, role mix and remote/hybrid split; compare against Greenhouse, Workday and Ashby.
- Job boards & aggregators — ingest any Lever-powered career page into your job feed with one input, including EU employers.
- Competitive sales intelligence — spot headcount growth, new team formation and geographic expansion from public postings and the
createdAtfield. - AI agents & LLM context — the
*Plaintext fields and structuredlists[]are RAG-ready with no HTML cleanup needed. - Compensation researchers — analyze disclosed salary ranges across companies, roles and countries.
❓ Frequently Asked Questions
Do I need a Lever API key or login? No. The Postings API this Actor uses is fully public and works without any credentials. (Lever's separate authenticated Data API is out of scope here.)
Is it legal / are confidential postings exposed?
The Actor only reads postings in the published state — exactly what a candidate sees on the company's public Lever career page. Internal, confidential, draft and closed postings are never exposed. You are responsible for complying with Lever's terms and applicable law.
How much data can I get and how fast? Lever returns all published postings for a board by default. A small board responds in under a second; 10 sites in parallel typically finish in 2–5 seconds. Lever's GET endpoints have no documented rate limit and are generous in practice; the Actor uses backoff on the rare 429.
Can I filter by salary, country or workplace type?
Yes — but client-side. Lever's server only filters on team, department, location, commitment and level. Salary, country, workplace type and title-keyword filters are applied by the Actor after fetching.
A site returns 404 — what's wrong?
Either the site name is misspelled (it's case-sensitive) or the company is on the other instance. Toggle instance to eu — European employers are often on api.eu.lever.co.
How do I find a company's Lever site name?
Open their careers page. If the URL is https://jobs.lever.co/SITENAME (or https://jobs.eu.lever.co/SITENAME), SITENAME is your input.
What output formats are supported and can I schedule it? Results land in an Apify dataset, exportable to JSON, CSV, Excel, XML or HTML, or via the Apify API. You can schedule the Actor to run on any interval for a continuously fresh jobs feed.
⏰ Scheduling & integration
Schedule this Actor on Apify to run hourly or daily for an always-fresh Lever jobs feed. Export results to JSON, CSV or Excel, pull them through the Apify API, or wire the dataset into Google Sheets, a data warehouse or webhooks for automated recruitment and market-intelligence pipelines.