Lever ATS Jobs Scraper – Scrape Lever.co avatar

Lever ATS Jobs Scraper – Scrape Lever.co

Pricing

from $2.00 / 1,000 results

Go to Apify Store
Lever ATS Jobs Scraper – Scrape Lever.co

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

Logiover

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

Share

Lever Postings API — Tech Jobs, Salary & ATS Data Scraper

Lever Postings API — Tech Jobs, Salaries & ATS Data

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 salaryRange as {currency, interval, min, max}, not buried in HTML. Filter, sort and benchmark compensation directly.
  • Workplace type — explicit remote, hybrid, on-site or unspecified per posting, perfect for remote-job pipelines.
  • Server-side filteringteam, department, location, commitment and level are 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 modesjobs (list every posting from one or more sites) and jobDetail (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

FieldTypeDescription
modestring (enum)jobs — list all postings (one call per site), or jobDetail — fetch single postings by ID. Default jobs. Required.
sitesarrayOne or more Lever site names (the account name in https://jobs.lever.co/{SITE}). Case-sensitive. For jobDetail only the first site is used.
instancestring (enum)global (api.lever.co) or eu (api.eu.lever.co). Use eu if global returns 404s. Default global.
jobIdsarrayPosting UUIDs to fetch. Required when mode = jobDetail.
teamarrayServer-side filter on Lever's team category. Case-sensitive; multiple values OR'ed.
departmentarrayServer-side filter on department. Case-sensitive; multiple values OR'ed.
locationarrayServer-side filter on location. Case-sensitive; multiple values OR'ed.
commitmentarrayServer-side filter on employment type (e.g. Full Time, Internship, Contract). Case-sensitive.
levelarrayServer-side filter on seniority level (customer-defined, e.g. Senior, Director).
limitintegerLever's native ?limit= — caps postings returned per board. 0 = no cap.
skipintegerLever's native ?skip= — offset for pagination.
groupstring (enum)Lever's ?group=none, team, commitment or location. Default none.
filterTitleKeywordsarrayClient-side: keep postings whose title contains any of these strings (case-insensitive).
filterWorkplaceTypesarrayClient-side: keep only chosen workplace types (on-site, remote, hybrid, unspecified).
filterCountriesarrayClient-side: keep only postings matching these ISO 3166-1 alpha-2 country codes.
filterSalaryMinintegerClient-side: keep only postings with salaryRange.min >= this value. Postings without a disclosed salary are dropped when active. 0 = disabled.
maxResultsPerSiteintegerHard cap applied after all filters. 0 = unlimited.
concurrencyintegerHow 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.

FieldDescription
_modeWhich mode produced the record (jobs or jobDetail).
siteThe Lever account name (URL slug).
instanceglobal or eu.
idLever's globally unique posting UUID.
titleJob title (Lever's text field).
teamInternal team name.
departmentBroader org unit (optional).
locationPrimary office / location string.
allLocationsArray of all eligible locations for multi-city postings.
commitmentEmployment type (Full Time, Internship, Contract, …).
levelSeniority tag (optional, customer-defined).
countryISO 3166-1 alpha-2 country code for the primary location.
workplaceTypeon-site, remote, hybrid or unspecified.
createdAt / createdAtIsoPosting creation time as epoch ms and ISO 8601.
hostedUrl / applyUrlPublic Lever-hosted posting page and application form URLs.
opening / openingPlainIntro paragraph, HTML and plaintext.
description / descriptionPlainCombined opening + body, HTML and plaintext.
descriptionBody / descriptionBodyPlainBody without the intro, HTML and plaintext.
additional / additionalPlainClosing content (EEO statements, boilerplate).
fullDescription / fullDescriptionPlainConvenience concatenation of all sections + lists.
listsStructured sub-sections (Qualifications, Responsibilities…) as {text, content} objects.
salaryRangeRaw Lever object {currency, interval, min, max}; null when not disclosed.
salaryMin / salaryMaxFlattened salary bounds for easy filtering/sorting.
salaryCurrency / salaryIntervalFlattened currency and interval (e.g. per-year-salary).
salaryDescription / salaryDescriptionPlainOptional employer note about the salary.
scrapedAtISO 8601 timestamp of when the record was produced.

Note: Many Lever fields are optional. salaryRange, workplaceType, country, commitment, location and department may be absent depending on how the employer configured the posting. The Actor returns null (or an empty array for allLocations / 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 createdAt field.
  • AI agents & LLM context — the *Plain text fields and structured lists[] 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.