# Lever Job Scraper — Spotify, GitHub & 5,000+ Companies (`bovi/lever-job-scraper`) Actor

Scrape job postings from any Lever-powered career page. Returns title, location, remote\_type, seniority, salary, department, team, employment\_type, descriptions, apply URL, and parse\_confidence. Official Lever API — no proxy, no bans. Pay per result.

- **URL**: https://apify.com/bovi/lever-job-scraper.md
- **Developed by:** [Vitalii Bondarev](https://apify.com/bovi) (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 $1.45 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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 Scraper — Clean Schema + Seniority + Remote Type

For talent intelligence and job aggregation teams that scrape Spotify, GitHub, Netflix, Lyft, Figma — and need all office locations per posting, not just the primary.

**Pay per result — $1.50 / 1,000 jobs.** No API key. No proxy. Official Lever API — no bans.

Extract job postings from any **Lever-powered career page** — Spotify, Netflix, GitHub, Lyft, Figma, Brex, and 5,000+ more companies. Uses Lever's official public API: zero auth, zero proxy cost, zero bans.

### What makes this scraper better?

Most Lever scrapers return raw API fields with minimal processing. This one adds:

| Edge | What it means |
|---|---|
| **Canonical seniority** | Inferred from title: `executive / vp / director / manager / principal / staff / lead / senior / intern / entry / mid` |
| **Canonical remote\_type** | `remote / hybrid / onsite` — from `workplaceType` first, location text fallback |
| **Full merged descriptions** | All Lever sub-sections merged: intro + body + bullet lists + additional info |
| **Salary extraction** | Parsed from `salaryDescription` when the company populates it |
| **allLocations** | Multi-location postings include all posting locations, not just the primary |
| **parse\_confidence** | Machine-readable quality score per record (0.0–1.0) + warnings list |
| **global\_id** | `lever:<company>:<job_id>` — stable deduplication key across runs |
| **Clean, flat schema** | Predictable column set every run — no surprise null keys |

### Input

```json
{
  "companies": ["spotify", "github", "netflix"],
  "titleKeyword": "engineer",
  "locationKeyword": "New York",
  "remoteOnly": false,
  "includeDescriptions": true,
  "maxJobsPerCompany": 50,
  "maxTotalJobs": 0
}
```

**How to find a company slug:** Go to `jobs.lever.co/<slug>` — the slug is the part after `lever.co/`. Example: `jobs.lever.co/spotify` → slug is `spotify`.

### Output schema

```json
{
  "company":          "spotify",
  "title":            "Senior Software Engineer",
  "location":         "New York, NY",
  "all_locations":    "New York, NY, San Francisco, CA",
  "remote_type":      "hybrid",
  "seniority":        "senior",
  "department":       "Engineering",
  "team":             "Platform",
  "employment_type":  "Full-time",
  "salary":           "$150,000 – $200,000 USD",
  "url":              "https://jobs.lever.co/spotify/abc123",
  "apply_url":        "https://jobs.lever.co/spotify/abc123/apply",
  "posted_at":        "2024-01-15T08:30:00+00:00",
  "job_id":           "abc123",
  "global_id":        "lever:spotify:abc123",
  "description_text": "We are looking for…",
  "description_html": "<p>We are looking for…</p>",
  "parse_confidence": 1.0,
  "warnings":         []
}
```

### Use cases

- **AI job-matching pipelines** — clean, flat schema feeds LLMs and vector DBs
- **Talent intelligence** — track competitor hiring signals in real time
- **Job aggregator sites** — populate boards with fresh postings
- **Recruitment research** — analyze tech hiring trends, seniority distributions
- **Sales prospecting** — identify companies actively hiring in specific roles

### Pricing

Pay-per-result PPE model: **$1.50 / 1,000 jobs** ($0.0015 per record).

**Worked example:** 5 companies × 50 jobs = 250 results = **$0.38**. 20 companies × 100 jobs = 2,000 results = **$3.00**.

### FAQ

**Do I need an API key or proxy?**
No. Lever's public API (`api.lever.co/v0/postings/<slug>`) is open — no auth, no proxy cost, no bans.

**What output formats are available?**
JSON, JSONL, CSV, and Excel via the Apify dataset export, plus the Apify REST API.

**Can I schedule daily runs?**
Yes — use Apify Scheduler. Each run returns the current open jobs; use `global_id` (`lever:<company>:<job_id>`) as a stable key for deduplication.

**What if a company returns 0 jobs or the slug is wrong?**
The actor logs a warning, records the slug in `failedDetails`, and continues with the remaining companies — no crash, no broken run.

### Integrations

Built for talent-intelligence and job-aggregation teams tracking open roles with seniority, remote type, and salary across Lever boards — the JSON/dataset output drops into the tools you already run, no glue code:

- **n8n / Make / Zapier** — trigger a run or pipe every new dataset item into 500+ apps (Google Sheets, Airtable, Slack, HubSpot, your database) with no code: [n8n](https://docs.apify.com/platform/integrations/n8n), [Make](https://docs.apify.com/platform/integrations/make), [Zapier](https://docs.apify.com/platform/integrations/zapier).
- **Webhooks** — fire your own endpoint the moment a run finishes, to push results straight into your pipeline ([docs](https://docs.apify.com/platform/integrations/webhooks)).
- **MCP server** — expose this actor as a tool to Claude, Cursor, or any [MCP client](https://mcp.apify.com) so an AI agent can pull this data mid-conversation ([guide](https://blog.apify.com/how-to-use-mcp/)).
- **API & SDKs** — fetch the dataset as JSON, CSV, or Excel through the Apify REST API or the Python / JS SDKs.

See all [Apify integrations](https://apify.com/integrations).

### Is it legal?

Yes. We query Lever's official public API (`api.lever.co/v0/postings/<slug>?mode=json`), which is publicly accessible without authentication. No personal data beyond what companies choose to publish publicly.

### Competitor comparison

| Feature | This actor | satish5813/lever-jobs-scraper | bytepulselabs/lever-job-scraper |
|---|---|---|---|
| Seniority field | ✅ (11 levels) | ❌ | ❌ |
| Canonical remote\_type | ✅ | ✅ raw field | partial |
| Merged descriptions (all sections) | ✅ | partial | partial |
| parse\_confidence per record | ✅ | ❌ | ❌ |
| `all_locations` (multi-location postings) | ✅ | ❌ | ❌ |
| global\_id for deduplication | ✅ | ❌ | ❌ |
| Title keyword filter | ✅ | ✅ | ❌ |
| Location keyword filter | ✅ | ✅ | ❌ |
| Remote-only filter | ✅ | ❌ | ❌ |
| `maxTotalJobs` cap (billing safety) | ✅ | ❌ | ❌ |
| Official API (no DOM scraping) | ✅ | ✅ | ✅ |
| Price | $1.50/1k | varies | varies |

`all_locations` is unique to this actor in the cluster: multi-location Lever postings include every office, not just the primary posting location. Essential for global talent intelligence.

`parse_confidence` (0.0–1.0) and `warnings` in every record — deductions for missing job\_id (0.50), title (0.30), url (0.10), location (0.05), posted\_at (0.05), description (0.05).

### Use with AI agents (MCP)

This actor is MCP-compatible. Use it as a data source in n8n, Make, or any LLM agent pipeline.

```
https://mcp.apify.com/?tools=bovi/lever-job-scraper
```

The flat schema with `global_id` (`lever:<company>:<job_id>`) and `all_locations` is designed for LLM pipelines, vector databases, and n8n/Make job-matching workflows. Need to cover Greenhouse, Ashby, Recruitee, SmartRecruiters and Personio too? Use the flagship [Multi-ATS Job Scraper](https://apify.com/bovi/greenhouse-lever-ashby-job-scraper) — all 6 ATS in one unified schema.

### More scrapers from our toolkit

Building a data pipeline? These actors pair well with this one — each runs on your own Apify account with the same pay-per-result pricing, no subscription:

- [Naukri Jobs Scraper](https://apify.com/bovi/naukri-jobs-scraper)
- [Seek Jobs Scraper](https://apify.com/bovi/seek-jobs-scraper)
- [Stepstone Jobs Scraper](https://apify.com/bovi/stepstone-jobs-scraper)
- [Workable Job Scraper](https://apify.com/bovi/workable-job-scraper)
- [Xing Jobs Scraper](https://apify.com/bovi/xing-jobs-scraper)
- [Ashby Job Scraper](https://apify.com/bovi/ashby-job-scraper)

Chain any of them together from the **Integrations** tab (the *Run succeeded* trigger) to build a multi-step workflow — one actor's output feeds the next.

# Actor input Schema

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

List of Lever company slugs. Each slug is the part after jobs.lever.co/ in the URL. Example: for jobs.lever.co/spotify the slug is 'spotify'.

## `titleKeyword` (type: `string`):

Case-insensitive substring to filter job titles. Example: 'engineer' returns only jobs whose title contains 'engineer'. Leave blank to return all jobs.

## `locationKeyword` (type: `string`):

Case-insensitive substring to filter job locations. Example: 'New York' or 'Remote'. Leave blank to return all locations.

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

If enabled, only jobs with remote\_type='remote' are returned.

## `includeDescriptions` (type: `boolean`):

If enabled, description\_text and description\_html fields are populated. Slightly larger output but valuable for AI pipelines and keyword matching.

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

Maximum number of jobs to return per company slug. 0 = no limit.

## `maxTotalJobs` (type: `integer`):

Maximum total jobs across all companies. 0 = no limit.

## Actor input object example

```json
{
  "companies": [
    "spotify",
    "github",
    "netflix"
  ],
  "remoteOnly": false,
  "includeDescriptions": true,
  "maxJobsPerCompany": 50,
  "maxTotalJobs": 0
}
```

# Actor output Schema

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

Dataset containing Lever Job Scraper records (company, title, location, remote\_type, seniority, department, employment\_type, salary, url, posted\_at, parse\_confidence).

# 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",
        "github",
        "netflix"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("bovi/lever-job-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",
        "github",
        "netflix",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("bovi/lever-job-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",
    "github",
    "netflix"
  ]
}' |
apify call bovi/lever-job-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bovi/lever-job-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/t1Mhyg7FNe9eXOVpA/builds/rfl4xjGJgsb0PwTEc/openapi.json
