# Lever Jobs API & Scraper – Salaries, New-Job Alerts (`signalscope-data/lever-jobs-scraper`) Actor

Live jobs from any Lever board, or 26 curated companies by industry (fintech, Europe, health), with parsed salaries. New-jobs-only alerts: pay only for unseen jobs. $1.50/1,000 jobs. Not affiliated with Lever.

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

## Pricing

from $1.50 / 1,000 job results

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 API & Scraper – Salaries, New-Job Alerts

Get **every open job from any Lever job board** in one run — clean JSON with title, department, location, remote flag, employment type, **structured salary**, posting date and job URL. Paste board URLs or just company names. Companies such as Spotify, Palantir and Zoox publish their jobs on Lever boards.

No board names at hand? Pick a **company preset** — 26 curated companies that hire on Lever, grouped by industry and checked live — and filter by keyword and location.

Turn on **"Only new jobs since last run"** and schedule it daily: you get a **new-jobs alert feed** and you **only pay for jobs you haven't seen before**.

*Independent tool, not affiliated with or endorsed by Lever.*

### Why this Lever scraper

- 📋 **The whole board, live** — reads Lever's public Postings API (`api.lever.co/v0/postings/...`, and `api.eu.lever.co` for EU boards) at run time, so you get the jobs that are online *right now* for the companies **you** choose, not a stale database snapshot.
- 🆕 **New-jobs-only mode** — remembers what it already returned (per alert name) and outputs only new postings. Perfect for daily alerts, sales triggers and job-board feeds.
- 💰 **Structured salaries** — `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`. Turn on **Only jobs with salary** to keep just the roles that publish pay.
- 🧩 Structured pay ranges from Lever's own `salaryRange` field
- 🧩 `workplaceType` (on-site / hybrid / remote), `applyUrl`, all locations of multi-location jobs
- 🧩 EU boards (`jobs.eu.lever.co`) supported
- 📊 **Company hiring signals** — `outputLevel: "companies"` gives **one row per company**: open jobs, new jobs in the last 7 / 30 / 90 days, function & seniority mix, remote share, salary transparency, and new / closed jobs since your last run.
- 🗂️ **Company presets** — 26 curated Lever employers in 6 industry lists (`fintech`, `saas`, `consumer`, `hardware`, `health`, `europe`), verified against the live API. Search a whole sector without collecting board names first.
- 🎯 **Filters** — title keywords, excluded words, departments, locations, remote only, posted within N days, max jobs per board.
- 🤝 **Polite and compliant** — reads robots.txt before anything else and obeys it (Lever's robots.txt allows everything with `Crawl-delay: 1`; the Actor makes at most 1 request per second to all lever.co hosts together); at most 1 request per second; identifies itself with a clear User-Agent. Public job postings only, no login, no personal data.
- ⚡ **Fast and cheap** — no browser, no proxy. A typical board takes 1–3 seconds.

### Use cases

- **Sales prospecting / hiring signals** — a company hiring "Data Engineer" or "Head of Security" is a buying signal. Monitor target accounts daily.
- **Job boards & newsletters** — feed a niche board (remote, AI, fintech, climate…) from hundreds of Lever boards.
- **Recruiters & agencies** — see new roles the day they go live.
- **Sector job search** — e.g. every remote engineering role at Fintech companies on Lever, from a preset, in one run.
- **Market and salary research** — headcount growth by department and location, published pay ranges.

### Input

Board names or URLs — any of these work:

- `https://jobs.lever.co/spotify`
- `https://jobs.lever.co/spotify/<job-id>`
- `https://jobs.eu.lever.co/<company>` (EU boards)
- `https://api.lever.co/v0/postings/spotify`
- Plain company name or domain: `spotify`, `spotify.com` (tried as the board name; if it isn't found, paste the board URL)

Daily alert for engineering jobs in two cities:

```json
{
  "companies": [
    "spotify",
    "https://jobs.lever.co/zoox"
  ],
  "keywords": [
    "engineer"
  ],
  "locations": [
    "Remote",
    "New York"
  ],
  "onlyNewJobs": true,
  "stateKey": "lever-daily"
}
```

A whole industry from a company preset (no board names needed), new jobs only:

```json
{
  "companyPresets": [
    "fintech"
  ],
  "keywords": [
    "engineer"
  ],
  "remoteOnly": true,
  "onlyNewJobs": true,
  "stateKey": "fintech-remote-eng"
}
```

Hiring signals, one row per company (schedule weekly, same `stateKey` each time):

```json
{
  "companies": [
    "spotify",
    "https://jobs.lever.co/zoox"
  ],
  "outputLevel": "companies",
  "stateKey": "target-accounts"
}
```

#### Company presets

Curated lists of companies whose jobs are on Lever, checked against the live Lever API on 2026-10-08 (boards with no open job, or belonging to a different company than the name suggests, were left out). Every job row and company row from a preset carries `presets` (the lists it came from). If a company later leaves Lever, the run skips it with a note in the log and lists it under `notFound` in SUMMARY.

| Preset | Companies | Boards | Examples |
|---|---|---|---|
| `fintech` | Fintech & crypto — payments, banking, crypto, spend management, payroll | 7 | anchorage, binance, crypto, immutable, nium, offchainlabs, … |
| `saas` | B2B SaaS — sales, marketing, support, collaboration and HR software | 3 | palantir, outreach, pigment |
| `consumer` | Consumer & marketplaces — consumer apps, social, marketplaces, gaming | 3 | spotify, brilliant, gopuff |
| `hardware` | Robotics, autonomy & space — self-driving, robotics, defense tech, aerospace | 3 | shieldai, zoox, hermeus |
| `health` | Health & biotech — digital health, insurance, biotech | 3 | lyrahealth, ro, includedhealth |
| `europe` | European tech — European scale-ups: fintech, SaaS, marketplaces | 7 | blablacar, contentsquare, malt, moonpig, pipedrive, qonto, … |

### Output

One item per job (real example from a test run; `description` omitted). `salary` is Lever's own pay text (empty when the ATS has no salary field); `salaryMin` / `salaryMax` / `salaryCurrency` / `salaryPeriod` are always filled when a range is published — from the structured field or parsed from the description.

```json
{
  "id": "29d141cb-1289-4954-8fe6-d9e6053cbf8c",
  "title": "Engineering Manager, Robot Data Visualization",
  "company": "Zoox",
  "department": "Software / Software Systems",
  "location": "Foster City, CA",
  "remote": false,
  "workplaceType": "hybrid",
  "employmentType": "Full-time",
  "salary": "250000-309000 USD per-year-salary",
  "postedAt": "2026-10-06T23:55:49.382Z",
  "updatedAt": null,
  "url": "https://jobs.lever.co/zoox/29d141cb-1289-4954-8fe6-d9e6053cbf8c",
  "applyUrl": "https://jobs.lever.co/zoox/29d141cb-1289-4954-8fe6-d9e6053cbf8c/apply",
  "salaryMin": 250000,
  "salaryMax": 309000,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "ats": "lever",
  "atsSlug": "zoox",
  "input": "https://jobs.lever.co/zoox",
  "scrapedAt": "2026-10-07T09:25:09.012Z"
}
```

Every run also writes a `SUMMARY` record: boards found, jobs per board, `notFound`, `wrongAts` (URLs of other ATSs), `robotsBlocked`, and `stoppedEarly` if the run hit its timeout.

Export as JSON, CSV or Excel, or send results to Google Sheets, Slack, Zapier, Make or a webhook with Apify integrations.

### Pricing

**$1.50 per 1,000 jobs**, pay per result, no subscription. The first run returns (and charges) every open job on your boards; after that, new-jobs-only mode charges only for jobs you haven't seen. The monthly free credit of Apify's free plan covers your first runs.

Company hiring-signals rows (`outputLevel: "companies"`): **$0.01 per company**; job rows are not charged in that mode.

### FAQ

**How do I find a company's Lever board?** Open any job on the company's careers page; if the address contains `jobs.lever.co`, paste it. Many companies show Lever jobs on their own domain — open a job and look for the apply link.

**Can I search all companies on Lever?** Lever has no public list of every board. Use the company presets (26 curated employers) and add any other board by name or URL in `companies`; both can be combined in one run.

**The company isn't found.** The board name can differ from the brand (e.g. `teampicnic`). Paste a job URL from the careers page. If the company uses a different ATS, try the [Company Jobs Scraper](https://apify.com/signalscope-data/ats-jobs-scraper) — it auto-detects 15 ATSs.

**I pasted a Greenhouse / Ashby / Workable / Workday URL here.** The Actor skips it and tells you which of our Actors handles it (see `wrongAts` in SUMMARY).

**How does "only new jobs" work?** Job IDs already returned are stored in a key-value store owned by this Actor, under your alert name (`stateKey`). The next run with the same name outputs only jobs that were not there before. Use a different name per alert.

**How are salaries detected?** The structured pay range from Lever is used when the job has one; otherwise the first pay range in the description is parsed (currency symbol or code required, so years such as 2010-2020 are ignored; funding amounts like $20-30 million are skipped). Jobs without a published range have `null`.

**Is this legal?** The Actor reads only public job postings that companies publish through Lever's public job-board interface, follows robots.txt and rate limits, and collects no personal data. It does not log in or bypass any protection.

**Can I use it as an API?** Yes — call the Actor through the Apify API (`run-sync-get-dataset-items`) from your code, Make, Zapier, n8n or an AI agent via the Apify MCP server.

### More tools from the same developer

- [Greenhouse Jobs API & Scraper](https://apify.com/signalscope-data/greenhouse-jobs-scraper) — every job from any Greenhouse board, salaries, new-jobs-only alerts.
- [Ashby Jobs API & Scraper](https://apify.com/signalscope-data/ashby-jobs-scraper) — every job from any Ashby board, salaries, new-jobs-only alerts.
- [Workable Jobs API & Scraper](https://apify.com/signalscope-data/workable-jobs-scraper) — every job from any Workable board, salaries, new-jobs-only alerts.
- [Workday Jobs Scraper](https://apify.com/signalscope-data/workday-jobs-scraper) — any Workday employer by company name (NVIDIA, Salesforce, Adobe…), department filter.
- [Company Jobs Scraper (15 ATS, auto-detect)](https://apify.com/signalscope-data/ats-jobs-scraper) — type a company name; detects Workday, Greenhouse, Lever, Ashby, Oracle, SuccessFactors, Rippling & more.
- [Hacker News "Who is Hiring" Parser](https://apify.com/signalscope-data/hn-hiring-parser) — monthly HN hiring threads as structured jobs.

# Actor input Schema

## `companies` (type: `array`):

Lever board names or URLs, e.g. "spotify" or https://jobs.lever.co/spotify. A company name or domain ("Stripe", "stripe.com") is tried as the board name. URLs of other ATSs are skipped with a pointer to the matching Actor.

## `companyPresets` (type: `array`):

Don't know board names? Pick one or more curated lists of companies that hire on Lever (checked live on 2026-10-08) and combine them with keyword / location filters, e.g. every remote engineering job at AI startups. Added to the boards above; duplicates are removed.

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

Keep only jobs whose title contains ANY of these words (case-insensitive). Empty = all jobs.

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

Drop jobs whose title contains any of these words (e.g. "intern", "senior").

## `departments` (type: `array`):

Keep only jobs whose department/team contains any of these words (e.g. "Engineering", "Sales"). Jobs without a department are excluded when set.

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

Keep only jobs whose location contains ANY of these strings (e.g. "London", "Germany", "Remote").

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

Keep only jobs marked remote (or with "remote" in the location).

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

Keep only jobs published in the last N days. 0 = no limit.

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

Keep only jobs that publish a pay range (structured ATS field or a range detected in the description, e.g. "$150,000 - $200,000").

## `onlyNewJobs` (type: `boolean`):

Remember jobs already returned and output only new ones. Schedule it daily for a new-jobs alert feed — you only pay for new jobs.

## `stateKey` (type: `string`):

Used with "Only new jobs" and the companies output level. Use a different name for each separate alert or schedule.

## `includeDescription` (type: `boolean`):

Add the plain-text job description to each result.

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

Newest jobs first. 0 = unlimited.

## `outputLevel` (type: `string`):

"companies" = one row per board instead of job rows: open jobs, new jobs in the last 7/30/90 days, function / seniority / department / location mix, remote share, salary transparency and median pay, plus new/closed jobs since the previous run with the same monitor name.

## Actor input object example

```json
{
  "companies": [
    "spotify",
    "https://jobs.lever.co/zoox"
  ],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "onlyWithSalary": false,
  "onlyNewJobs": false,
  "stateKey": "default",
  "includeDescription": false,
  "maxJobsPerCompany": 0,
  "outputLevel": "jobs"
}
```

# 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 = {
    "companies": [
        "spotify",
        "https://jobs.lever.co/zoox"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("signalscope-data/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 = { "companies": [
        "spotify",
        "https://jobs.lever.co/zoox",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("signalscope-data/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 '{
  "companies": [
    "spotify",
    "https://jobs.lever.co/zoox"
  ]
}' |
apify call signalscope-data/lever-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,signalscope-data/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/o47NNYlRRce1SIY6Y/builds/dFfK8HKpuoA9urmFG/openapi.json
