Lever Jobs Scraper: Job Board with Salary Ranges avatar

Lever Jobs Scraper: Job Board with Salary Ranges

Pricing

from $0.80 / 1,000 jobs

Go to Apify Store
Lever Jobs Scraper: Job Board with Salary Ranges

Lever Jobs Scraper: Job Board with Salary Ranges

Lever jobs scraper with salary ranges: min, max, currency and pay period when posted, plus team, location, remote/hybrid, apply link. Any jobs.lever.co board.

Pricing

from $0.80 / 1,000 jobs

Rating

0.0

(0)

Developer

MRSLM Data

MRSLM Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 hours ago

Last modified

Categories

Share

Open roles from any company's Lever job board: team, location, remote/hybrid, commitment, salary range when posted, links and full description. $1.00 per 1,000 jobs.

This Lever jobs scraper reads the public jobs.lever.co/<company> board (and the EU jobs.eu.lever.co boards), so you get every open role without an API key or login, with the salary range split into min, max, currency and pay period whenever the company posts one.

Lever boards are where many US and European scale-ups publish salary ranges, so you can track pay bands as well as headcount.

Quick start

  1. Press Start. The form is already filled with this example input, so the first run returns real rows in under a minute:
{
"companies": [
"palantir",
"https://jobs.lever.co/spotify"
],
"maxJobsPerCompany": 10
}
  1. Swap in your own values, or call the Actor through the Apify API, Make, Zapier, n8n or the Python/JS clients with the same JSON.
  2. Download the results as JSON, CSV or Excel from the Output tab, or schedule the run to repeat.

Full guide: How to Scrape Lever Job Postings with Salary Ranges (Real Run on 3 Companies)

What the Lever Jobs Scraper does

You give the Actor a list of Lever boards as names (shieldai) or links (jobs.lever.co/shieldai, including EU boards on jobs.eu.lever.co). It reads each board's public postings feed, applies your filters, sorts by posting date and saves one row per job.

Lever's feed is one of the richest public job feeds: it carries a workplace type (remote, hybrid or on-site), a commitment such as full-time or intern, the team and department, the country and, when the company fills it in, a salary range with currency and pay period. The Actor maps all of it into tidy columns. You only pay for jobs saved after your filters.

  • Structured salary object: min, max, currency, period (such as per-year-salary or per-hour-wage) and any free-text note.
  • Filters by title words, excluded title words, location, department or team, remote and posting date.
  • Same columns as our Greenhouse, Workable and multi-ATS scrapers, so you can combine the files.

Who it is for

  • Compensation analysts and HR teams: benchmark posted pay ranges for a role family across competitors, by city and currency.
  • Recruiters: see which target companies are hiring, for what, and at what published pay, before you reach out.
  • Sales teams: use new roles in a buyer department as a timely trigger for outreach.
  • Job seekers: track the companies you like and sort the roles by the top of the published range.
  • Researchers and journalists: study pay transparency in practice: who publishes ranges, and how wide they are.

Real example: engineering pay ranges at Shield AI, Outreach and PointClickCare

Say you are benchmarking engineering pay. You pick three Lever companies that publish ranges: Shield AI (autonomy software and aircraft, US), Outreach (sales software, US and India) and PointClickCare (healthcare software, Canada and the US). You want up to six of the newest engineering roles from each.

Step 1: Enter the input

Open the Lever Jobs Scraper in Apify Console, switch the input form to JSON and paste this. It is the exact input used for the run in this guide:

{
"companies": [
"shieldai",
"outreach",
"pointclickcare"
],
"titleKeywords": [
"engineer"
],
"maxJobsPerCompany": 6
}

What each setting does:

  • companies: Lever board names, as they appear in jobs.lever.co/<name>. Links work too.
  • titleKeywords: keep jobs whose title contains any of these words, ignoring case.
  • maxJobsPerCompany: save at most six jobs per company, the newest first because newestFirst defaults to true.

Step 2: Run it

Press Start. On 30 October 2026 this input finished with status SUCCEEDED in about 6 seconds and saved 16 rows to the run's dataset. The run was charged 16 job events plus one start event, so the bill was $0.0161 on the Free/Bronze tier. Per the run summary, Shield AI had 655 open jobs and 434 had "engineer" in the title, so the 6 newest were saved. PointClickCare had 72 open, 22 matched and 6 were saved. Outreach had 19 open and 4 matched, so all 4 were saved.

Step 3: Read the output

Here are the first rows of the real dataset, cut to the most useful columns:

companytitlelocationworkplaceTypesalarypostedAt
outreachStaff Software Engineer (Backend Engineer – Gola…Hyderabadremote2026-10-21T11:34:17.428Z
outreachStaff Software Engineer (Backend)Hyderabadremote2026-10-19T10:26:32.590Z
outreachSenior Forward Deployed Engineer, Managed Servic…Hyderabadremote2026-10-08T09:39:35.755Z
outreachStaff Software Engineer, Identity and Access Pla…Seattle, WAhybrid{"min": 165000, "max": 215000, "currency": "USD"…2024-09-24T18:33:25.687Z
pointclickcareIntermediate Software EngineerMississauga/Toronto/Kitchener/Waterloo/Cambridgehybrid{"min": 112000, "max": 125000, "currency": "CAD"…2026-10-21T20:57:35.853Z
pointclickcareIntermediate Site Reliability Engineer (SRE)Salt Lake City, UThybrid{"min": 138000, "max": 154000, "currency": "USD"…2026-10-19T20:42:32.137Z
pointclickcareIntermediate Software Engineer-(A&P)Salt Lake City, UThybrid{"min": 123000, "max": 137000, "currency": "USD"…2026-10-09T20:31:23.642Z
pointclickcareMarketing Data Analytics Engineer (CA)Remote or Mississaugaremote{"min": 82000, "max": 92000, "currency": "CAD",…2026-10-09T14:40:06.079Z
pointclickcareMarketing Data Analytics Engineer (US)Remote, USAremote{"min": 87000, "max": 97000, "currency": "USD",…2026-10-09T14:38:40.559Z
pointclickcareSenior Machine Learning Systems Engineer (CAD)Mississaugahybrid{"min": 174000, "max": 218000, "currency": "CAD"…2026-09-22T12:55:14.879Z
shieldaiSenior Applications Engineer, Maritime Autonomy…United Stateson-site{"min": 130000, "max": 200000, "currency": "USD"…2026-10-30T08:39:52.314Z
shieldaiSummer 2027 - Product Support Engineering Intern…Dallas, Texason-site{"min": 37, "max": 97, "currency": "USD", "perio…2026-10-28T22:25:02.681Z
shieldaiSenior Software Engineer, Frontend Platform (R57…San Diego, Californiaon-site{"min": 130000, "max": 240000, "currency": "USD"…2026-10-28T20:13:16.822Z
shieldaiSenior Field Services Engineer (R6380)San Diego, Californiaon-site{"min": 84000, "max": 127000, "currency": "USD",…2026-10-27T22:38:21.899Z
shieldaiStaff Engineer, Propulsion (R5899)Dallas, Texason-site{"min": 146000, "max": 219000, "currency": "USD"…2026-10-27T16:45:38.741Z
shieldaiEngineer II, Autonomy (R5714)Taipeihybrid2026-10-26T04:54:38.600Z

And one full row as JSON (long text shortened with …):

{
"platform": "Lever",
"company": "shieldai",
"jobId": "f8b2ffef-ae89-4860-ba6f-b5e59cb6d31e",
"title": "Senior Software Engineer, Frontend Platform (R5790)",
"department": "Hivemind Enterprise Division",
"team": "Engineering",
"location": "San Diego, California",
"country": "US",
"workplaceType": "on-site",
"isRemote": false,
"employmentType": "full-time-employee",
"salary": {
"min": 130000,
"max": 240000,
"currency": "USD",
"period": "per-year-salary",
"text": null
},
"postedAt": "2026-10-28T20:13:16.822Z",
"url": "https://jobs.lever.co/shieldai/f8b2ffef-ae89-4860-ba6f-b5e59cb6d31e",
"applyUrl": "https://jobs.lever.co/shieldai/f8b2ffef-ae89-4860-ba6f-b5e59cb6d31e/apply"
}

What the 16 real rows show:

  • Pay ranges are common, and wide. 14 of 16 rows have a salary object. Shield AI's Senior Software Engineer, Frontend Platform in San Diego is posted at $130,000 to $240,000 a year. Its Staff Engineer, Propulsion in Dallas is $146,000 to $219,000. A range that wide usually spans several levels, so compare midpoints rather than minimums.
  • Currency and period are real columns. PointClickCare posts its Canadian roles in CAD (Intermediate Software Engineer: CAD 112,000 to 125,000) and its Salt Lake City roles in USD (Intermediate SRE: USD 138,000 to 154,000). Shield AI's Summer 2027 product support engineering intern is per-hour-wage, $37 to $97. Never average those together without converting the currency and the period first.
  • Missing ranges are honest gaps. Outreach's three newest roles are in Hyderabad and carry no range, and Shield AI's Engineer II in Taipei has none either. Pay-transparency rules are mostly a US and Canadian thing, so non-US roles often have no range.
  • Old postings stay open. Outreach's Staff Software Engineer, Identity and Access Platform was posted on 24 September 2024 and is still live. Use postedWithinDays if you only want fresh roles.
  • Workplace type is structured. Lever gives remote, hybrid or on-site directly, so Shield AI shows as on-site and PointClickCare as mostly hybrid without any text parsing.

Lever's employmentType values are whatever the company uses: Shield AI says full-time-employee, intern and international-eor, the others say full-time. Normalise them if you group by type.

Is there a Lever jobs API?

Yes. Lever publishes every company's open postings at a public endpoint, with no key needed:

GET https://api.lever.co/v0/postings/{company}?mode=json

EU-hosted boards use api.eu.lever.co. The Actor reads this feed, converts epoch-millisecond dates to ISO dates, flattens categories into department, team, location and commitment, turns salaryRange into the salary object, and adds your filters, sorting and run summary. Lever's other API, the one with candidates and opportunities, is private to each company and is never touched.

Not every Lever company fills in salaryRange. In our probing, Palantir and Spotify did not, while Shield AI, Outreach, PointClickCare, Match Group, Aledade and Tala did. If pay is the point of your project, check a few companies first with a small maxJobsPerCompany.

Output fields

Each row in the dataset has these fields. The example column shows a value from the run above.

FieldWhat it meansExample from this run
platformThe ATS the job came from, e.g. Greenhouse, Lever or Workable.Lever
companyThe board name you gave, or the one the Actor detected.outreach
companyNameThe company display name, when the board publishes it.outreach
jobIdThe ATS job ID. Stable from run to run, so use it to spot new jobs.88257b0f-9915-4e5f-96bf-d37b183b6cf6
titleThe job title as posted.Staff Software Engineer (Backend Engineer – Golang / 7+ Year…
department / teamDepartment and team, when the company sets them.Engineering / Engineering
location / locationsThe main location text, plus every location for multi-office roles.Hyderabad / Hyderabad
countryCountry, when the platform gives one.IN
workplaceType / isRemoteremote, hybrid or on-site, plus a true/false remote flag.remote / yes
employmentTypefull-time, part-time, intern and so on, when published.full-time
seniorityExperience level, when the platform publishes one.(empty in this run)
salaryStructured pay range (min, max, currency, period, text) when the company publishes it; otherwise empty.{"min": 165000, "max": 215000, "currency": "USD", "period":…
postedAt / updatedAtWhen the job was first published and last edited (ISO dates).2026-10-21T11:34:17.428Z / (empty in this run)
url / applyUrlThe public job page and the application page.https://jobs.lever.co/outreach/88257b0f-9915-4e5f-96bf-d37b1… / https://jobs.lever.co/outreach/88257b0f-9915-4e5f-96bf-d37b1…
boardUrlThe company's careers board.https://jobs.lever.co/outreach
scrapedAtWhen the row was read (UTC).2026-10-30T16:15:08.248Z

In CSV and Excel exports the salary object becomes salary/min, salary/max, salary/currency and salary/period columns, ready to sort. In the export URL, ask for fields=salary and you get all of those sub-columns; a path such as salary/min in fields comes back empty.

Export Lever jobs to CSV, Excel or Google Sheets

Every run saves its rows to a dataset, and a dataset can be downloaded in any common format. You do not need to write code for this.

From Apify Console. Open the run, go to the Output tab and click Export. Pick CSV, Excel (XLSX), JSON, XML, HTML or RSS. You can tick only the columns you want, for example company, title, location, salary, postedAt. Nested values such as lists are flattened into columns like salary/min in CSV and Excel.

From a URL. The same export is a plain HTTPS link. Replace <DATASET_ID> with the dataset ID shown on the run's Storage tab:

# CSV with just the columns you need
curl -H "Authorization: Bearer $APIFY_TOKEN" \
"https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv&clean=1&fields=company,title,location,salary,postedAt,url" -o lever-jobs.csv
# Excel
curl -H "Authorization: Bearer $APIFY_TOKEN" \
"https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=xlsx&clean=1" -o lever-jobs.xlsx

Into Google Sheets. You have three good options:

  1. One-off: download the CSV and use File > Import > Upload in Google Sheets. Choose "Replace current sheet" to refresh an existing tab.
  2. Automatic, no code: in Make, Zapier or n8n, use the Apify app's "Watch Actor runs" (or "Run Actor") trigger, then "Get dataset items", then the Google Sheets "Add row" action. Every scheduled run then lands in your sheet. Apify's own Google Sheets Import & Export Actor can also append a dataset to a sheet, and you can chain it to this Actor's runs with an integration.
  3. Formula: =IMPORTDATA("https://api.apify.com/v2/actor-tasks/<USERNAME>~<TASK_NAME>/runs/last/dataset/items?status=SUCCEEDED&format=csv&token=<YOUR_TOKEN>") always pulls the latest successful run of a saved task. The token sits in the formula, so anyone who can open the sheet can see it. Only use this in a private sheet.

Schedule it to run every Monday at 6:00

Job boards change every day. A daily run with postedWithinDays set to 1 or 2 gives you only the new roles, which keeps each run small and cheap. Because jobId is stable, you can also keep the full list and compare it with yesterday's to see which roles closed.

For pay benchmarking, a weekly run is usually enough. Keep each week's file and you can see when a company widens or raises a published range.

  1. In the Actor's input form, set up the input from Step 1 and click Save as new task. Give it a clear name such as lever-pay-benchmark.
  2. Go to Schedules > Create new, set the cron expression to 0 6 * * 1 and pick your timezone, so it runs every Monday at 6:00.
  3. Add the task to the schedule and save. Each run gets its own fresh dataset.
  4. Optional: on the task's Integrations tab, add a webhook, Slack or email notification for "Run succeeded", or connect Make, Zapier or n8n, so the new rows go where you need them.

To fetch the newest results without looking up a run ID, use the task's last-run link: https://api.apify.com/v2/actor-tasks/<USERNAME>~lever-pay-benchmark/runs/last/dataset/items?status=SUCCEEDED&format=json.

Call it from the API (Python, JavaScript or curl)

You can start the Actor from your own code with the official Apify clients. Put your API token (Console > Settings > API & Integrations) in an environment variable called APIFY_TOKEN rather than in the code.

Python (pip install "apify-client>=3"). Tested with apify-client 3.4:

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {
"companies": [
"shieldai",
"outreach",
"pointclickcare"
],
"titleKeywords": [
"engineer"
],
"maxJobsPerCompany": 6
}
run = client.actor("mrslm_data/lever-jobs").call(run_input=run_input)
# apify-client 3.x returns a Run object, so use run.default_dataset_id
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item["title"], item["salary"])

In apify-client 3.x, call() returns a typed object. Older examples that use run["defaultDatasetId"] were written for 1.x and 2.x and fail in 3.x with TypeError: 'Run' object is not subscriptable.

JavaScript / Node.js (npm install apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const input = {
"companies": [
"shieldai",
"outreach",
"pointclickcare"
],
"titleKeywords": [
"engineer"
],
"maxJobsPerCompany": 6
};
const run = await client.actor('mrslm_data/lever-jobs').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]);

curl, one request that runs the Actor and returns the rows as CSV (it waits up to 5 minutes, so keep the input small):

curl -X POST "https://api.apify.com/v2/acts/mrslm_data~lever-jobs/run-sync-get-dataset-items?format=csv" \
-H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
-d '{"companies": ["shieldai", "outreach", "pointclickcare"], "titleKeywords": ["engineer"], "maxJobsPerCompany": 6}' -o lever-jobs.csv

What it costs

The Actor uses pay-per-event pricing. Job: $1.00 per 1,000 on the Free and Bronze tiers, $0.90 on Silver and $0.80 on Gold. Each run also has a start fee of $0.00005 per GB of memory (one event at the default memory). You are not billed separately for compute on normal runs: the event prices are the whole bill.

Price per event

Current pay-per-event prices for this Actor on Apify, by Apify subscription plan:

Event (per 1,000)Free / BronzeSilverGold / Platinum / Diamond
Job (job)$1.00$0.90$0.80
Actor start (once per run at the default memory, not per 1,000)$0.00005$0.00005$0.00005

You are charged only for the events in this table: nothing for compute, and nothing for searches that return no rows beyond the start fee.

ScenarioFree / BronzeSilverGold
The run in this guide (16 jobs)$0.0161$0.0144$0.0129
Full export of Shield AI's 655 open roles$0.66$0.59$0.52
Weekly pay benchmark: 50 companies, about 400 matching roles each week (4 runs a month)$1.60$1.44$1.28
Daily new-roles feed of about 50 jobs, for a year (365 runs)$18.27$16.44$14.62

To cap spending, set Maximum cost per run in the run options (or maxTotalChargeUsd in the API). The Actor stops cleanly at the cap and you are never billed past it.

Limits

  • It reads open jobs only. Closed roles are gone from the public board, so keep your own history if you need it.
  • Filters are plain keyword matches on the title, location or department text. engineer also matches "Engineering Manager" and "Solutions Engineer"; use excludeTitleKeywords to trim.
  • Descriptions are capped at 5,000 characters of plain text when includeDescription is on.
  • Salary only when the company publishes salaryRange on Lever. The Actor does not guess pay from the description.
  • Lever boards only. For a mixed list of Lever, Greenhouse, Workable and other ATS, use the ATS Jobs Scraper.
  • Values such as employmentType and department are the company's own labels and are not normalised across companies.

FAQ

What share of Lever jobs list a salary? It depends on the company and on local pay-transparency rules. The Actor never guesses: when a posting has no range, the salary fields are null.

Does every Lever posting have a salary? No. Only postings where the company filled in the pay range. In this run 14 of 16 did; at Palantir and Spotify, none did.

What do the salary period values mean? They come from Lever: per-year-salary, per-month-salary, per-hour-wage and so on. Convert to one period before comparing.

Does it work with EU Lever boards? Yes. Pass the jobs.eu.lever.co/<name> link and the Actor reads the EU API.

Do I need an API key or a login for the job board? No. Every board this Actor reads is the public one behind the company's careers page. You only need your own Apify token to run the Actor.

Does it include recruiter or applicant data? No. Only the public job ad. Application questions, recruiters and candidates are never read, and email addresses and phone numbers in descriptions are removed.

How fresh is the data? Live. Each run reads the boards at that moment, so closed jobs disappear and new ones appear.

What happens if I mistype a company name? That company is reported as not found in the run summary and costs nothing. The rest of the run carries on.

How do I get only new jobs every day? Save your input as a task with postedWithinDays set to 1 and give it a daily schedule. For boards with irregular dates, set it to 2 and drop duplicates by jobId.

Can I run it on a schedule? Yes. Save your input as a task and attach a schedule, as shown above. Each run is independent and returns the Lever jobs available at that moment.

Does it work with Make, Zapier or n8n? Yes. All three have an Apify app. Use "Run Actor" (or run a saved task), then "Get dataset items" to pass the rows to the next step, such as Google Sheets, Airtable, a CRM or Slack.

Can AI agents use it through MCP? Yes. Apify's hosted MCP server can expose this Actor as a tool to any MCP client (Claude Desktop, Cursor, VS Code and others). Add https://mcp.apify.com/?tools=mrslm_data/lever-jobs as a remote MCP server and sign in with your Apify account or API token. The agent fills in the same input fields shown above and gets the same rows back, billed at the same per-event prices.

This Actor only reads pages and feeds that the website itself publishes to every visitor without a login. It obeys each site's robots.txt, keeps a polite request rate, and never tries to get past logins, paywalls, captchas or bot checks. It does not collect personal data such as emails, phone numbers or names of private individuals. You are responsible for how you use the data: follow the source site's terms, copyright and the privacy laws that apply to you (GDPR, CCPA, etc.). This tool is independent and not affiliated with or endorsed by the platforms it reads.