# Lever Job Postings Scraper - Jobs From Any Lever Board (`ninhothedev/lever-jobs-scraper`) Actor

$0.5/1K 🔥 Lever job board scraper! All postings from any company with teams, locations & salary ranges. No key. JSON, CSV, Excel or API in seconds. Power job aggregators & recruiting ⚡

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

## Pricing

from $0.50 / 1,000 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Lever Job Postings Scraper 🧲

**Scrape every open job from any company's Lever job board — no API key, no login, no cookies.**

This is the **dedicated Lever board reader**. My catalogue already covers Greenhouse, Ashby, SmartRecruiters, BambooHR, Workable and Workday — Lever was the missing one, and this actor fills that gap. It talks directly to Lever's free public postings endpoint (`api.lever.co/v0/postings/{company}`), so you get the *same data the company's own careers page renders*, in clean structured rows.

Point it at one slug or a hundred. Every posting comes back with title, department, team, location(s), workplace type, commitment, salary range (when the company publishes one), the full job description, and the apply link.

***

### ✨ What you get

- **All open roles per company** — the complete board, not just page one. Pagination is handled for you.
- **Full descriptions** — plain-text job description plus a compact `sections` array (Requirements, What You'll Do, Benefits…) with HTML already stripped.
- **Salary data where it exists** — `salary_min`, `salary_max`, `salary_currency`, `salary_interval` straight from Lever's structured `salaryRange`.
- **Remote detection** — `is_remote` combines Lever's `workplaceType` with location/title heuristics, so "Remote - US" roles are caught even when the flag is missing.
- **Multi-location awareness** — `all_locations` keeps every city a role is open in, not just the primary one.
- **Server-side friendly filters** — filter by title substring, location substring, or remote-only, without post-processing.
- **Never dies on a bad slug** — a company that isn't on Lever (HTTP 404) or has zero openings (empty array) is logged and skipped. The run only fails if *every* slug came back empty.

### 💸 Pricing

Roughly **$0.50 per 1,000 jobs**. The Lever API is free and fast, so runs are cheap and finish in seconds — a 500-job run typically costs a few cents of compute. No proxy required.

### 🎯 Use cases

- **Job boards & aggregators** — power a niche board with fresh, structured listings from hundreds of Lever companies. `job_id` is stable, so dedupe and diffing are trivial.
- **Recruiting intel** — watch which teams a competitor is staffing up, which departments are growing, and how fast roles turn over.
- **Salary benchmarking** — build compensation datasets from the pay ranges companies publish directly, grouped by title, level, country and interval.
- **Hiring-signal prospecting** — a company hiring 12 sales reps or its first DevOps engineer is a buying signal. Turn `department` + `created_at` into a lead list for recruiting agencies, HR-tech and dev-tool vendors.

### 🔎 How to find a company's Lever slug

The slug is the single path segment in the board URL:

```
https://jobs.lever.co/spotify          -> slug: spotify
https://jobs.lever.co/shieldai/abc-123 -> slug: shieldai
```

Three quick ways to find it:

1. **Open the company's careers page.** If the "Apply" or job links point to `jobs.lever.co/<something>`, that `<something>` is the slug.
2. **Google it**: `site:jobs.lever.co "Company Name"`.
3. **Just try it.** Slugs are almost always the lowercase company name with no spaces (`shieldai`, `matchgroup`, `swordhealth`). This actor skips misses safely, so you can throw a list of guesses at it and keep whatever sticks.

If a slug returns nothing, the company either has no open roles right now or uses a different ATS — try one of the related actors below.

### ⚙️ Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `mode` | select | `companies` | Currently one mode: read all postings from each listed board. |
| `companySlugs` | array | `["spotify","palantir","shieldai"]` | Lever slugs (or full board URLs — they get parsed). |
| `titleFilter` | string | – | Case-insensitive substring the title must contain, e.g. `engineer`. |
| `locationFilter` | string | – | Case-insensitive substring matched against location, all locations and country. |
| `remoteOnly` | boolean | `false` | Keep only remote roles. |
| `maxItemsPerCompany` | integer | `200` | Cap per single board. |
| `maxItems` | integer | `500` | Cap for the whole run (max 5000). |

```json
{
  "mode": "companies",
  "companySlugs": ["spotify", "palantir", "shieldai"],
  "titleFilter": "engineer",
  "remoteOnly": false,
  "maxItemsPerCompany": 200,
  "maxItems": 500
}
```

### 📤 Output

One dataset item per job:

```json
{
  "company": "shieldai",
  "job_id": "41468aca-c1c2-4a7b-aec8-f499e64b6d1e",
  "title": "Aerostructures Design Engineer II (R4953)",
  "department": "X-BAT Division",
  "team": "X-BAT Engineering - Aerostructures",
  "location": "United States",
  "all_locations": ["United States", "San Diego, California", "Dallas, Texas"],
  "commitment": "Full Time Employee",
  "workplace_type": "onsite",
  "is_remote": false,
  "country": "US",
  "created_at": "2026-05-27T22:22:10.389000Z",
  "description": "Founded in 2015, Shield AI is a venture-backed defense-tech company...",
  "sections": [
    { "title": "What you'll do:", "text": "Design and develop structural components..." },
    { "title": "Required qualifications:", "text": "Bachelor's or Master's degree in..." }
  ],
  "tags": [],
  "salary_min": 88075,
  "salary_max": 132113,
  "salary_currency": "USD",
  "salary_interval": "per-year-salary",
  "apply_url": "https://jobs.lever.co/shieldai/41468aca-c1c2-4a7b-aec8-f499e64b6d1e/apply",
  "url": "https://jobs.lever.co/shieldai/41468aca-c1c2-4a7b-aec8-f499e64b6d1e",
  "source": "lever",
  "scraped_at": "2026-07-28T09:12:44Z"
}
```

Export as JSON, CSV, Excel, XML or HTML, or pull it through the Apify API. All fields are nullable — Lever boards vary, and `salaryRange` and `tags` in particular are only populated by some companies.

### 🔗 Related actors

Different company, different ATS. Cover the rest of the market with:

- [Greenhouse Jobs Scraper](https://apify.com/ninhothedev/greenhouse-jobs-scraper)
- [Ashby Jobs Scraper](https://apify.com/ninhothedev/ashby-jobs-scraper)
- [Workable Jobs Scraper](https://apify.com/ninhothedev/workable-jobs-scraper)
- [ATS Jobs Scraper](https://apify.com/ninhothedev/ats-jobs-scraper) — multi-ATS in one run

### ❓ FAQ

**Do I need a Lever account or API key?** No. The postings endpoint is public and free.

**Why did a company return zero jobs?** Either the board is genuinely empty, or that slug isn't on Lever. Both are logged as warnings and skipped — check `https://jobs.lever.co/<slug>` in a browser to confirm.

**Why is `salary_min` null?** Lever only returns `salaryRange` when the company fills it in. Roughly half of US boards do; most EU boards don't.

**Is scraping this legal?** These are public job listings published deliberately for candidates to find. No personal data and no login are involved. As always, use the data in line with your local regulations.

**How fresh is the data?** Live — every run hits Lever directly, so you see the board exactly as it is at that moment.

***

*Job data, structured. Built for teams that need hiring signals before everyone else has them.*

# Actor input Schema

## `mode` (type: `string`):

What to scrape. 'companies' reads every open posting from each Lever company board you list in 'Company slugs'. This is currently the only mode.

## `companySlugs` (type: `array`):

Lever board slugs to scrape. The slug is the part after jobs.lever.co/ on a company career page - for example https://jobs.lever.co/spotify -> 'spotify'. You can also paste the full board URL and it will be parsed. Slugs that are not on Lever are logged and skipped, never fatal.

## `titleFilter` (type: `string`):

Optional case-insensitive substring that the job title must contain, e.g. 'engineer' or 'sales'. Leave empty to keep every title.

## `locationFilter` (type: `string`):

Optional case-insensitive substring matched against the job location, all locations and country code, e.g. 'london', 'new york' or 'US'. Leave empty to keep every location.

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

Keep only roles flagged remote by Lever (workplaceType = remote) or whose location/title mentions 'remote'.

## `maxItemsPerCompany` (type: `integer`):

Upper limit of postings fetched from each single company board before moving on to the next slug. Useful when one company has thousands of openings.

## `maxItems` (type: `integer`):

Hard stop for the whole run across all company slugs. Keeps runs cheap and predictable.

## Actor input object example

```json
{
  "mode": "companies",
  "companySlugs": [
    "spotify",
    "palantir",
    "shieldai"
  ],
  "remoteOnly": false,
  "maxItemsPerCompany": 200,
  "maxItems": 500
}
```

# 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 = {
    "companySlugs": [
        "spotify",
        "palantir",
        "shieldai"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ninhothedev/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 = { "companySlugs": [
        "spotify",
        "palantir",
        "shieldai",
    ] }

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

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

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

```

## CLI example

```bash
echo '{
  "companySlugs": [
    "spotify",
    "palantir",
    "shieldai"
  ]
}' |
apify call ninhothedev/lever-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=ninhothedev/lever-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/fQG69hdon0VbAuNvv/builds/O88AlED0v5va7GDLB/openapi.json
