# Lever Job Scraper — EU Companies | Salary, No Proxy (`bovi/lever-job-scraper-eu`) Actor

Scrape job postings from Lever-powered career pages at EU-headquartered companies (Personio, Contentful, Gorillas, and more). Returns title, location, remote\_type, seniority, salary, department, employment\_type, apply URL, and parse\_confidence. Official Lever API — no proxy.

- **URL**: https://apify.com/bovi/lever-job-scraper-eu.md
- **Developed by:** [Vitalii Bondarev](https://apify.com/bovi) (community)
- **Categories:** Jobs, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 lever job scraper — eu companies | salary, no proxies

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 Job Scraper — Clean Schema + Seniority + Remote Type

For talent intelligence and job aggregation teams that scrape Personio, Contentful, Gorillas, 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** — Personio, Gorillas, Contentful, 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": ["personio", "contentful", "gorillas"],
  "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/personio` → slug is `personio`.

### Output schema

```json
{
  "company":          "personio",
  "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/personio/abc123",
  "apply_url":        "https://jobs.lever.co/personio/abc123/apply",
  "posted_at":        "2024-01-15T08:30:00+00:00",
  "job_id":           "abc123",
  "global_id":        "lever:personio: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-eu |
|---|---|---|---|
| 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-eu
```

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

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

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

```

## MCP server setup

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

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/kxegxeiPzhc7a76sW/builds/e0XLc7P54alhgVb1E/openapi.json
