# Lever Jobs Scraper: Salary, Remote & New Jobs (`digital_influx/lever-jobs-scraper`) Actor

Search open jobs across 1,800+ companies on Lever, or read any company’s Lever job board: Spotify, Palantir, Binance and more. Salary ranges, workplace, employment type, team, department, seniority, visa and full text. Only-new-jobs mode. No login.

- **URL**: https://apify.com/digital_influx/lever-jobs-scraper.md
- **Developed by:** [Bruno Petrelli](https://apify.com/digital_influx) (community)
- **Categories:** Jobs, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 job saveds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Lever Jobs Scraper: Salary, Remote & New Jobs

Search **open jobs across 1,800+ companies that hire through Lever**, or read **any company's Lever job board** in full: Spotify, Palantir, Binance, Lyra Health and thousands more. Every job comes as a clean row with title, team, department, location, country, workplace (remote, hybrid, on-site), employment type, **salary range**, **seniority**, **visa sponsorship**, the **exact posting date** and the full description.

It reads Lever's public postings API, the same data a company's careers page shows. That means:

- **No proxies, no headless browser, no login.** Nothing breaks when a careers page changes its design.
- **Two ways to run it.** Leave *Lever job boards* empty to search every company in our Lever directory by title, location and date. Or paste the boards you care about and get every open job from each.
- **Fast searches over the whole directory.** A daily index of every open Lever job picks the companies that have a matching job, and only those are read live. A search for a week of software engineer jobs read 43 of the 1,886 companies in about 75 seconds (Lever allows one request per second).
- **The pay the company set in Lever, as data.** The salary range with its currency and period (year, month, hour), plus the company's own pay text. In the 25 biggest Lever boards, 843 of 2,300 jobs had a salary range, and 97% said whether the job is remote, hybrid or on-site.
- **Only new jobs.** Schedule it daily and get just the postings that are new since the last run, and pay only for those.

### What you can use it for

- **Job boards and newsletters:** fresh roles from tech, health care, retail and services companies, filtered by keyword, location, seniority, workplace and employment type.
- **Recruiters and talent teams:** follow competitors' and target accounts' openings every day with only-new mode.
- **Sales intelligence:** hiring is a buying signal. A company opening five sales roles is growing its go-to-market team.
- **Compensation research:** compare salary ranges across companies, locations and levels.
- **AI agents:** plain JSON with plain-text descriptions, ready for an LLM. Agents can call this Actor through the Apify MCP server.

### Input

| Field | What it does |
|---|---|
| Job title keywords | Keep jobs whose title has any of these words. Whole-word match: `intern` does not match `internal`. |
| Exclude title keywords | Drop titles with these words, e.g. `manager`. |
| Locations | Keep jobs whose location, other locations or country code contain the text: `New York`, `Germany`, `DE`. A two-letter code matches as a whole word or the country code, so `US` does not match "Dusseldorf". `remote` also matches jobs marked remote. |
| Remote only | Only jobs the company marked as remote in Lever. |
| Posted within (days) | Only jobs created on Lever in the last N days. |
| Seniority | Keep only these levels, read from the title: intern, entry, not stated (usually mid-level), senior, lead, director, executive. |
| Workplace type | Remote, hybrid or on-site, as the company set it in Lever (97% of jobs say it), or not stated. |
| Employment type | Full-time, part-time, contract, temporary or internship. Each company writes its own on Lever ("Full Time On-Site", "Temps partiel", "Contract Part time"); they are mapped to these types, in English, French, Spanish, German and Portuguese. |
| Description keywords / Exclude description keywords | Whole-word match on the full description: `Kubernetes`, `GDPR`; exclude `clearance`. |
| Only jobs that state a salary | The salary range the company set in Lever, or a pay range written in the description. |
| Only jobs that offer visa sponsorship | The description says the company sponsors visas. Jobs that say nothing are dropped. |
| **Lever job boards (optional)** | Empty: search the whole directory. Or the boards to read in full: the address (`jobs.lever.co/spotify`, `jobs.eu.lever.co/…`), a link to any job on it, or just the board name (`spotify`). Any public board works, in our directory or not. |
| Exclude companies | When searching the directory: skip these companies. |
| Max jobs | Newest first. Empty: 200 for a directory search, and every job when you give boards (up to 1,000 per board and 5,000 in all). |
| Max jobs per company | Newest first. Keeps one big employer from filling the results. |
| Job description | Plain text (default), HTML, both, or none. |
| Only new jobs (for scheduled runs) | Save only jobs that earlier runs of the same search or boards did not save. |
| Memory name | Optional: share one memory between tasks, or start over with a new name. |

Search the directory for sales jobs with their pay, posted in the last 14 days:

```json
{
  "keywords": ["account executive", "sales"],
  "postedWithinDays": 14,
  "onlyWithSalary": true,
  "maxJobs": 100
}
```

The 30 newest jobs of each of two companies (leave out *maxJobsPerCompany* for every job):

```json
{
  "boards": ["https://jobs.lever.co/spotify", "https://jobs.lever.co/palantir"],
  "maxJobsPerCompany": 30
}
```

Daily monitoring of new remote jobs across the directory (schedule it in *Schedules*):

```json
{
  "workplaceTypes": ["remote"],
  "postedWithinDays": 7,
  "maxJobs": 100,
  "onlyNew": true
}
```

**How to find a company's Lever board:** open the company's careers page and click on any job. If the address starts with `jobs.lever.co/` (or `jobs.eu.lever.co/`), the board name is the part after the slash (`jobs.lever.co/spotify` → `spotify`). **Lever board names are case-sensitive** (`CesiumAstro` works, `cesiumastro` does not): paste the address and it is kept as is. A name that is in our directory is fixed for you whatever its case.

### Output

One item per job. This one came from the board of Latitude, Inc. (`jobs.lever.co/latitudeinc`):

```json
{
  "id": "d2496008-8593-4f59-bc1e-9c89cbbc3aec",
  "platform": "lever",
  "companySlug": "latitudeinc",
  "company": "Latitudeinc",
  "title": "Educational Sales Account Manager",
  "department": "Client Opportunities",
  "team": "Sales Openings",
  "location": "Broomall, PA",
  "locations": ["Broomall, PA"],
  "country": "US",
  "remote": false,
  "workplaceType": "onsite",
  "employmentType": "Full Time",
  "experienceLevel": null,
  "postedAt": "2026-03-10T20:50:54.322Z",
  "updatedAt": null,
  "url": "https://jobs.lever.co/latitudeinc/d2496008-8593-4f59-bc1e-9c89cbbc3aec",
  "applyUrl": "https://jobs.lever.co/latitudeinc/d2496008-8593-4f59-bc1e-9c89cbbc3aec/apply",
  "salary": { "min": 80000, "max": 120000, "currency": "USD", "period": "year", "text": null, "source": "platform" },
  "descriptionText": "A growing technology solutions provider is seeking a K–12 Account Manager to join their team in Broomall, PA...",
  "descriptionHtml": null,
  "seniority": null,
  "visaSponsorship": null,
  "yearsOfExperience": 3,
  "scrapedAt": "2026-10-01T22:57:49.002Z"
}
```

Field notes:

- `companySlug` is the Lever board name, with its case. `company` is made from the board name (Lever's API sends no company name).
- `country` is the ISO 3166-1 alpha-2 code (`US`, `GB`, `DE`) the company set in Lever.
- `workplaceType` is `remote`, `hybrid` or `onsite` as the company set it, or `null`. `remote` is `true` for remote jobs.
- `employmentType` is the company's own text (Lever's "commitment"): "Full-time", "Temps plein- Permanent". The employment type filter maps it to full-time, part-time, contract, temporary or internship.
- `salary` is the salary range the company set in Lever, as numbers with its currency and period (`source: "platform"`), and the company's pay text when it wrote one. When Lever has none, it is read from the description (`source: "description"`) only when it is clearly pay.
- `seniority` is read from the title: `intern`, `entry`, `senior`, `lead` (lead, staff, principal), `director` (director, head of) or `executive` (VP, C-level). `null` means the title names no level.
- `yearsOfExperience` is the minimum asked for in the description ("5+ years of experience" → 5).
- `visaSponsorship` is `true` when the description offers visa sponsorship, `false` when it says there is none, and `null` when it does not say.
- The run's **OUTPUT** record in the key-value store has the totals: companies read, open jobs, matches, jobs already saved by an earlier run, boards not found on Lever and inputs that are not Lever boards.

### Only new jobs

Turn on **Only new jobs** and schedule the task (daily or hourly). Each run saves only the jobs that earlier runs of the same search, or the same boards and filters, did not save, so you get just the new postings and pay only for those. The memory is kept for 180 days in a key-value store named `lever-jobs-state` in your own Apify account.

Each search has its own memory. To share one between two tasks, give both the same **Memory name**; to start over, give a new one.

### Pricing

Pay per event: you pay **only for jobs saved to the dataset**, not for the jobs that were read and filtered out, and not for jobs skipped by *Only new jobs*. Filters cost nothing, so a precise filter is the cheapest run. Set a maximum cost for a run and the Actor stops cleanly when it is reached.

### Use it from AI agents (MCP)

Claude, ChatGPT, Cursor and any other MCP client can run this Actor as a tool: add `https://mcp.apify.com?tools=digital_influx/lever-jobs-scraper` as a remote MCP server and sign in with your Apify account. It is also one of the tools of Job Search MCP (`digital_influx/job-search-mcp`), by the same author, made for agents.

### Good to know

- Only **public** job boards are read: the same jobs anyone sees on the company's careers page.
- Lever asks API clients for one request per second (its robots.txt), and this Actor keeps to it. A board of 300 jobs takes 3 requests, so reading many boards in full takes a few seconds per board.
- The directory holds the Lever boards found in the public Common Crawl web index and checked live. It is rebuilt every month. A company that is not in it can still be read by giving its board.
- The daily index makes a directory search fast. A company whose first matching job appeared after the index was built is found once the index includes it (it is rebuilt every day). Boards you give are always read live.
- Lever lists every job of a board with its description and salary, so description filters cost no extra requests.
- **Greenhouse, Ashby, Workday and more?** Our **ATS Job Scraper** reads 12 job platforms, Lever included, with the same columns, and our **Job Search API** searches 20,000+ company career sites on 7 platforms. There are also our **Greenhouse Jobs Scraper**, **Ashby Jobs Scraper** and **Workday Jobs Scraper**.

### Support

Found a board that doesn't load, or a field that looks wrong? Open an issue on the Actor's Issues tab with the board address. Issues get an answer within a few days.

# Actor input Schema

## `keywords` (type: `array`):

Keep jobs whose title contains any of these words (whole-word match: 'intern' does not match 'internal'). Example: software engineer, data scientist. Leave empty for all jobs.

## `excludeKeywords` (type: `array`):

Drop jobs whose title contains any of these words, e.g. senior, manager, intern.

## `locations` (type: `array`):

Keep jobs whose location, any secondary location or country code contains one of these texts: New York, Germany, DE, London. Codes of two letters match whole words only. The word 'remote' also matches jobs flagged remote.

## `remoteOnly` (type: `boolean`):

Keep only jobs that the company marked as remote in Lever.

## `postedWithinDays` (type: `integer`):

Keep only jobs created on Lever in the last N days.

## `seniority` (type: `array`):

Keep only these levels, read from the job title: "Senior Data Engineer" is senior, "Head of Sales" is director. "Not stated" keeps titles without a level word, which are mostly mid-level roles. Empty = all levels.

## `workplaceTypes` (type: `array`):

Keep only these workplace types, as the company set them in Lever (remote, hybrid, on-site). 97% of Lever jobs state it; add "Not stated" to keep the others. Empty = all.

## `employmentTypes` (type: `array`):

Keep only these employment types. On Lever each company writes its own (Full-time, Full Time On-Site, Temps partiel, Contract Part time…): we map them to these types, and the rest count as "Not stated". Empty = all.

## `descriptionKeywords` (type: `array`):

Keep jobs whose description contains any of these words (whole-word match), e.g. Python, Kubernetes, GDPR.

## `excludeDescriptionKeywords` (type: `array`):

Drop jobs whose description contains any of these words, e.g. clearance, relocation.

## `onlyWithSalary` (type: `boolean`):

Keep only jobs with a salary: the salary range the company set in Lever (about a third of Lever jobs), or a pay range written in the description.

## `onlyVisaSponsorship` (type: `boolean`):

Keep only jobs whose description says the company sponsors visas. Jobs that say nothing about it are dropped.

## `boards` (type: `array`):

Leave empty to search every company in our Lever directory (1,800+). Or add companies' Lever job boards to read just those, whole: the board address (jobs.lever.co/spotify, jobs.eu.lever.co/…) or only its name on Lever (spotify). Lever names are case-sensitive; a name that is in our directory is fixed for you. A link to any job on the board works too. The filters above apply to both.

## `excludeCompanies` (type: `array`):

When searching the directory: skip companies whose name or Lever board name contains one of these texts.

## `maxJobs` (type: `integer`):

Newest first, across all companies. Empty: 200 for a directory search, and every job when you give boards (up to 1,000 per Lever board and 5,000 in all). You also never pay more than the spending limit you set for the run.

## `maxJobsPerCompany` (type: `integer`):

Newest first. Keeps one big employer from filling the results. 0 or empty = no limit.

## `descriptionFormat` (type: `string`):

Plain text is best for spreadsheets and AI agents. 'None' makes results smaller; the salary and compensation fields stay.

## `onlyNew` (type: `boolean`):

Save only jobs that earlier runs of this same search (or these same boards) did not save, so a daily schedule gives you just the new postings and you pay only for those. The memory is kept for 180 days in a key-value store named "lever-jobs-state" in your account.

## `memoryName` (type: `string`):

By default each search or set of boards has its own memory. Give a name to share one memory between tasks, or a new name to start over. Letters, digits, dot, dash and underscore.

## Actor input object example

```json
{
  "keywords": [
    "software engineer"
  ],
  "remoteOnly": false,
  "postedWithinDays": 7,
  "onlyWithSalary": false,
  "onlyVisaSponsorship": false,
  "maxJobs": 50,
  "descriptionFormat": "text",
  "onlyNew": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "software engineer"
    ],
    "postedWithinDays": 7,
    "maxJobs": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("digital_influx/lever-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": ["software engineer"],
    "postedWithinDays": 7,
    "maxJobs": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("digital_influx/lever-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "software engineer"
  ],
  "postedWithinDays": 7,
  "maxJobs": 50
}' |
apify call digital_influx/lever-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,digital_influx/lever-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/UabQsdQ0cL1s7YimU/builds/KhtNZOQQgftACHEvN/openapi.json
