# Lever Jobs Scraper & API - Salary Ranges & Remote Filters (`ahmed.fouaad82/lever-salary-jobs`) Actor

Lever jobs scraper: public Lever job postings with salary min/max, currency, pay interval and workplace type; salary-floor filter. $2/1,000 jobs.

- **URL**: https://apify.com/ahmed.fouaad82/lever-salary-jobs.md
- **Developed by:** [Ahmed Fouad](https://apify.com/ahmed.fouaad82) (community)
- **Categories:** Jobs, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 saved jobs

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

### What does this Lever Jobs API tool do?

This **Lever jobs scraper and API** extracts public Lever job postings from known company boards for hiring and compensation research. Export normalized salary minimum/maximum, original currency/pay interval, workplace type and source links. Choose this focused utility when you want to save only salary-bearing jobs or apply a salary floor in an exact currency and pay interval before writing results. Our general multi-ATS tool already supports structured salary output and strict remote filtering; salary-floor and salary-required filters are the incremental features here.

### Pricing

**$2 per 1,000 chargeable saved jobs**, custom `result` event ($0.002/job); first **25 saved jobs per run free**. For example, 1,000 saved jobs incur 975 result events, or **$1.95**. Filtered-out jobs and duplicates do not incur result events, and there is no configured start fee. Apify plan allowances and any separately displayed platform usage charges still apply; the Pricing tab is authoritative.

### Quick start

```json
{"boards":["leverdemo"],"maxResults":10,"salaryOnly":true,"minSalary":0,"remoteOnly":false}
```

**The one-click default uses Lever’s demonstration board, not a real employer hiring signal.** Replace it with a known company’s global Lever board slug (from `https://jobs.lever.co/BOARD`). EU boards are not supported. No discovery or cross-company search index is included.

For example, select fully remote jobs with a published USD annual minimum of at least $100,000:

```json
{"boards":["includedhealth","wealthfront"],"maxResults":10,"salaryOnly":true,"minSalary":100000,"salaryCurrency":"USD","salaryInterval":"per-year-salary","remoteOnly":true}
```

Board availability and matching jobs change. Zero matches is a valid result. `minSalary: 0` disables the floor and currency/interval restriction, so `salaryOnly: true` can return both hourly and annual salaries with their original units.

Set `minSalary` above 0 to filter by a published minimum in exactly `salaryCurrency` and `salaryInterval`. A USD annual floor never matches EUR or hourly ranges. No currency conversion, annualization or compensation estimate is performed. `salaryOnly` requires a published numeric minimum; `remoteOnly` excludes hybrid and unspecified workplace types. Remote is the employer's classification, not a promise that applicants in every country are eligible.

### Output

Each dataset row has 18 fields: `id`, `board`, `title`, `location`, `team`, `department`, `commitment`, `country`, `workplaceType`, `description`, `url`, `applyUrl`, `createdAt`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryInterval`, `fetchedAt`. Missing strings are empty, absent salaries/date are null. Description is plain text capped at 50,000 characters. Salary values and intervals are those supplied by Lever, not verified offers. No recruiter identity fields are extracted; source descriptions may contain employer-authored contact text.

Illustrative output format, not a claim that this example job exists:

```json
{
  "id":"00000000-0000-0000-0000-000000000001",
  "board":"example-company",
  "title":"Software Engineer",
  "location":"Remote, United States",
  "team":"Engineering",
  "department":"Technology",
  "commitment":"Full-time",
  "country":"US",
  "workplaceType":"remote",
  "description":"Build useful products.",
  "url":"https://jobs.lever.co/example-company/00000000-0000-0000-0000-000000000001",
  "applyUrl":"https://jobs.lever.co/example-company/00000000-0000-0000-0000-000000000001/apply",
  "createdAt":"2026-01-15T12:00:00.000Z",
  "salaryMin":120000,
  "salaryMax":160000,
  "salaryCurrency":"USD",
  "salaryInterval":"per-year-salary",
  "fetchedAt":"2026-01-16T12:00:00.000Z"
}
```

Download the dataset as JSON, CSV or Excel through Apify. `SUMMARY` reports total, stop reason and source errors. `STATE` supports within-run migration/abort recovery and deduplication; it is not a cross-run jobs archive or a guarantee of exactly-once billing around a crash.

### Limits and responsible use

At most 20 boards, 20 pages per board, 100 postings per page and 10,000 saved jobs per run. A filtered run can finish with zero matches. Output may be truncated by page/result/budget limits; no exhaustive historical coverage is promised. Dynamic postings can shift pagination between requests. Errors on one board do not prevent other boards from running.

Uses only the documented unauthenticated global Postings API, checks robots before requests, waits at least one second per host, pins public DNS addresses, limits responses to 5 MB and requests to 25 seconds. No login, candidate/application access, proxies, browser or access-control bypass. No applications are submitted. Users must have the necessary reuse rights and comply with their selected employer’s terms. Lever explicitly notes that published postings are publicly viewable and may be scraped by third parties: https://github.com/lever/postings-api . No official Lever affiliation or endorsement.

### Support

Report a reproducible board slug, input and safe error message in Issues. Do not include tokens, credentials, applicant information or other sensitive data.

# Actor input Schema

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

1-20 known global Lever board slugs, not URLs. Demo default is Lever’s published demonstration board.

## `maxResults` (type: `integer`):

Maximum matching jobs saved across boards.

## `pageSize` (type: `integer`):

Bounded public API page size.

## `maxPages` (type: `integer`):

At most 20 API pages per board; filtered-out jobs still consume this bound.

## `salaryOnly` (type: `boolean`):

Exclude postings without a numeric salary minimum.

## `minSalary` (type: `number`):

0 disables. Positive values match only the exact selected currency and pay interval; no currency conversion or annualization.

## `salaryCurrency` (type: `string`):

Uppercase three-letter currency, used only when minimum salary is positive.

## `salaryInterval` (type: `string`):

Exact API interval used only when minimum salary is positive.

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

Keep workplaceType=remote, not hybrid or unspecified.

## Actor input object example

```json
{
  "boards": [
    "leverdemo"
  ],
  "maxResults": 100,
  "pageSize": 100,
  "maxPages": 20,
  "salaryOnly": false,
  "minSalary": 0,
  "salaryCurrency": "USD",
  "salaryInterval": "per-year-salary",
  "remoteOnly": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

Successful extracted rows

## `records` (type: `string`):

STATE and SUMMARY

# 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 = {
    "boards": [
        "leverdemo"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed.fouaad82/lever-salary-jobs").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 = { "boards": ["leverdemo"] }

# Run the Actor and wait for it to finish
run = client.actor("ahmed.fouaad82/lever-salary-jobs").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 '{
  "boards": [
    "leverdemo"
  ]
}' |
apify call ahmed.fouaad82/lever-salary-jobs --silent --output-dataset

```

## MCP server setup

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

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/DJGO3BaJbBjJf2OBT/builds/dEvDxGRYTeEA3fYdb/openapi.json
