Lever Job Board Scraper — Open Roles & Hiring Signals avatar

Lever Job Board Scraper — Open Roles & Hiring Signals

Pricing

$2.00 / 1,000 job postings

Go to Apify Store
Lever Job Board Scraper — Open Roles & Hiring Signals

Lever Job Board Scraper — Open Roles & Hiring Signals

Search open jobs across 2,300+ companies hiring on Lever by job title, location, department, remote and date — no slugs needed, EU-hosted sites included. Or pass companies. Live data: salary where published, full description, apply URL.

Pricing

$2.00 / 1,000 job postings

Rating

0.0

(0)

Developer

Berkan Kaplan

Berkan Kaplan

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 hours ago

Last modified

Share

Lever Job Board Scraper — Company Hiring Signals 🚀

foXLabs hiring series: Greenhouse · Ashby · Workday · SmartRecruiters · Personio · Teamtailor · Workable · BambooHR · All platforms in one search →

🎉 Search open jobs across 2,300+ companies that hire on Lever — by job title, location, department, remote and posting date — without knowing a single company slug. Or point it at the companies you track. No login, no API key, one row per open role, with salary ranges where published. Built for sales & competitive-intelligence teams scoring hiring intent, recruiters, and job-data pipelines.

🔍 What is the Lever Job Board Scraper — and when should you use it?

Lever powers the careers pages of thousands of tech companies, but it has no job search across companies: every company's jobs sit on its own jobs.lever.co/<company> site. This actor does the searching for you. It carries an index of 2,358 Lever job sites (discovered from the Internet Archive and Common Crawl web archives; 2,358 had open job sites in our last full check, October 2026), reads them live during your run, and keeps the jobs whose title matches your keywords and filters — with department, team, all locations, workplace type, commitment, salary range where published, posted date and the full description. EU-hosted Lever sites (jobs.eu.lever.co) are covered too.

Already know your target companies? Add their slug (palantir) or job-site URL and get every open role.

Use it when you need: companies hiring for a function right now, with pay bands; a feed of new roles for a job title; every open role at a target company; or a read on a competitor's hiring plans — from Lever's public postings API, no key.

Use something else when: the companies you care about don't run on Lever. Every actor in the foXLabs hiring series emits the same core schema, so their outputs concatenate into one hiring-intent table: Greenhouse · Ashby · Workday · SmartRecruiters · Personio · Teamtailor · Workable · BambooHR.

Need one search across every platform? Job Postings Database keeps a daily-refreshed index of 440,000+ open roles from ~33,000 Greenhouse, Lever, Ashby, SmartRecruiters, BambooHR, Personio and Teamtailor boards and answers a single query across all of them in seconds — every delivered role is re-checked live on its own board before it reaches you.

🤖 Use with AI agents

Already on the Apify MCP server? Ask for this Actor by name: foxlabs/lever-job-board-scraper.

Your agent can pay for its own runs. This Actor is pay-per-event with agentic payments, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — no Apify account or API token of its own. Billing is per delivered role, never for errors.

Otherwise paste this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

I want to find open jobs at companies that hire on Lever using the Apify Actor `foxlabs/lever-job-board-scraper`.
Input: `searchQueries` is a list of job-title keywords (every word must appear in the title; "*" = every job).
Optional filters: `location` (e.g. "London"; US jobs written "Austin, TX" count as "United States"), `department`,
`remoteOnly`, `employmentType` (e.g. "Full Time"), `postedWithinDays` ("1" | "7" | "30" | "90").
`queries` optionally adds companies (slugs like "palantir" or job-site URLs, EU-hosted ones too).
`maxResultsPerQuery` caps jobs per keyword or company (default 200).
Start with: {"searchQueries":["account executive"],"location":"United States","maxResultsPerQuery":50}
Ask me which roles and region I care about, run the Actor, then summarise the hiring companies and pay ranges as a table.

The machine-readable API, MCP config and OpenAPI definition live at apify.com/foxlabs/lever-job-board-scraper.md.

📋 Overview

Everything you need to turn Lever's scattered job sites into one searchable hiring dataset — role details, pay ranges and hiring signals — in one actor, with no login, cookies or API key.

Why teams pick this actor:

  • 🔎 No slugs needed — search 2,300+ live Lever job sites by job title; the companies come to you.
  • 💸 Salary ranges where published — about four in ten matched US roles carry one.
  • 🇪🇺 EU-hosted sites too — jobs.eu.lever.co companies are read from Lever's EU API.
  • ⚡ Live, not a stale dump — every site is read during your run.
  • 🎛️ Filters that matter — location (with US state codes understood), department, remote only, commitment, posting date.
  • 🔗 Same schema across the series — join with the sibling ATS actors on companyName / companyBoard.
  • 💰 Pay only for results — per-role pricing; a job found twice is charged once; empty searches and failed lookups are never billed.
  • 🤖 Agent-ready — MCP + x402 agentic payments.

🎬 Quick Start

curl -X POST "https://api.apify.com/v2/acts/foxlabs~lever-job-board-scraper/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchQueries":["account executive"],"location":"United States","maxResultsPerQuery":50}'

🚀 Getting Started (3 steps)

  1. Type your job titles — one per line (account executive, software engineer), or * for every job.
  2. Narrow it down (optional) — location, department, remote only, commitment, posting date; or add specific companies in queries.
  3. Run and export — a clean dataset as JSON, CSV or Excel.

📥 Input

{
"searchQueries": ["account executive", "solutions engineer"],
"location": "United States",
"remoteOnly": false,
"postedWithinDays": "30",
"queries": ["palantir"],
"maxResultsPerQuery": 200
}
FieldTypeDescription
searchQueriesarrayJob-title keywords, one per line. Every word must appear in the title (engineer also matches engineering). * = every job matching the filters.
locationstringText the location(s) must contain, e.g. London, Germany, United States (US jobs written City, ST count as United States).
departmentstringText the department or team must contain, e.g. Sales, Engineering.
remoteOnlybooleanKeep only remote jobs.
employmentTypestringText the commitment must contain, e.g. Full Time, Contract, Intern.
postedWithinDaysstringany, 1, 7, 30 or 90.
queriesarrayOptional Lever slugs (palantir) or job-site URLs (https://jobs.eu.lever.co/… works). Search filters do not apply to them.
maxResultsPerQueryintegerCaps jobs per keyword or company (default 200).
maxConcurrencyintegerHow many companies from queries to fetch at once.
scanConcurrencyintegerHow many job sites a keyword search reads at once (default 8).
includeRawbooleanAttach the source's untouched record under raw (companies in queries).
requestDelayMsintegerPoliteness delay between requests.
proxyConfigurationobjectOptional.

📤 Output

One row per open role, saved to the dataset.

FieldDescription
companyNameCompany name
companyBoardCompany slug — join key across runs
jobIdLever posting ID
jobTitleRole title
department / teamDepartment (Lever category) / team
location / allLocationsPrimary location / all posting locations
isRemote / workplaceTypeRemote flag / on-site, remote or hybrid
employmentTypeCommitment (full-time, contract…)
salarySalary range where published
postedAtPosted date (ISO)
descriptionFull description, HTML stripped
applyUrl / sourceUrlApply link / public posting URL

Every row also carries query, scrapedAt, and — when a search finds nothing or a lookup fails — an error.

{
"query": "account executive",
"companyName": "Coalfire",
"companyBoard": "coalfire",
"jobTitle": "Account Executive - AI, Cloud and Compliance Advisory (Google SecOps and Wiz Sales)",
"department": "Corporate",
"team": "Sales",
"location": "United States",
"workplaceType": "remote",
"isRemote": true,
"employmentType": "Regular Full Time",
"salary": "USD 88000–150000 per year-salary",
"postedAt": "2026-07-28",
"description": "About Coalfire\n\nCoalfire is on a mission to make the world a safer place by solving our cl…",
"applyUrl": "https://jobs.lever.co/coalfire/e0327f75-306c-40f8-877a-40c347ca477e/apply"
}

💼 Use cases

1. Hiring-intent lead lists Input: searchQueries: ["account executive", "sales development"], postedWithinDays: "30", weekly. Output: companies hiring sales, with pay bands. Use: rank accounts by hiring focus.

2. Comp benchmarking Input: a role (searchQueries: ["product designer"]), a region. Output: roles with published salary ranges. Use: map pay bands across tech companies.

3. Competitor headcount tracking Input: the competitor's slug in queries, weekly. Output: the full role list over time. Use: spot expansion and hiring freezes early.

4. Recruiter sourcing Input: searchQueries: ["software engineer"], remoteOnly: true. Output: roles + apply links. Use: sourcing pipeline in minutes.

🔗 Integration

JavaScript / Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('foxlabs/lever-job-board-scraper').call({ searchQueries: ['account executive'], location: 'United States', maxResultsPerQuery: 50 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);

Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('foxlabs/lever-job-board-scraper').call(run_input={'searchQueries': ['account executive'], 'location': 'United States', 'maxResultsPerQuery': 50})
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item)

Written for apify-client 3 for Python, where call() returns a run object; with version 1 or 2 it returns a dict — write run['defaultDatasetId'] there.

Automation (n8n / Zapier / Make): schedule or webhook → HTTP request to the actor API → handle the JSON dataset → push to a sheet, CRM or dashboard.

📊 Pricing

Pay-per-event:

EventPriceWhen
Job posting$0.002per delivered role
Keyword search$0.02from October 29, 2026: once per search line that delivers at least one job (a search reads every site in the index)

A job found twice is charged once; a search line that finds nothing, jobs that don't match your filters, and failed lookups are never billed. Sites you list in queries pay only per role. Example: one keyword returning 50 jobs costs $0.02 + 50 × $0.002 = $0.12. View current pricing.

❓ FAQ

Do I need an account, login or API key? No. This reads Lever's public postings API (US and EU) — no key.

Do I need to know company slugs? No. Search by job title; every row tells you the company and its slug.

Which companies does the search cover? Lever job sites found in the Internet Archive and Common Crawl web archives — 2,358 slugs, of which 2,358 had an open job site in our last full check (October 2026). A company that isn't in the index can still be read by adding its slug to queries.

How long does a search take? A broad search stops as soon as it has your cap; a search for a rare title reads every site (about 6–7 minutes).

How current is the data? Every run reads the job sites live, so results are as fresh as the sites themselves.

Can I export to CSV / Excel / JSON? Yes — directly from the Apify dataset.

What happens on a bad input or a search with no matches? You get a row with your query and an error — nothing is silently dropped, and you're not charged.

Is scraping this legal? It reads a public job feed the company publishes for syndication — job data, not personal data. See below.

🐛 Troubleshooting

  • Fewer rows than expected — title matching is strict (every word must appear in the title); try fewer or shorter keywords, or loosen the filters.
  • "Lever has no public postings site …" — take the slug from the job-site URL (jobs.lever.co/<slug> or jobs.eu.lever.co/<slug>), or pass the URL itself.
  • An error row — the slug is wrong or the site is private.

⚠️ Trademark

Independent, third-party tool. Not affiliated with, endorsed by or connected to Lever (Employ Inc.). "Lever" and related marks belong to their owners and are used here for identification only.

This actor reads only publicly published job-posting data — no private or personal user data. Your results can still contain personal data (e.g. a name in a description); personal data is protected by the GDPR and similar laws, so only process it with a legitimate basis. See Apify's blog post on the legality of web scraping.

🤝 Support & contact

Changelog

Index refresh — 2026-10-14

  • Company index refreshed from the latest public web-archive snapshots: 573 new boards added, 2,139 that no longer exist removed (checked live on 2026-10-14); the index now holds 2,358 boards, 2,358 of them answering.

0.5.0 — 2026-10-14 — keyword search across Lever (no slug needed) + EU-hosted sites

  • New: searchQueries — search open jobs by title across 3,924 indexed Lever job sites (1,785 live), with location, department, remoteOnly, employmentType and postedWithinDays filters. Sites are read live.
  • Fix: EU-hosted Lever sites (jobs.eu.lever.co) now work; a bare slug that the US API does not know is tried on the EU API.
  • A job is delivered and charged once per run, whether a search or a company in queries finds it.
  • Restart-safe: a run that Apify moves to another server resumes without writing or charging a row twice.
  • queries (slugs / job-site URLs) works as before; it is now optional.

0.4.4 — 2026-10-08 — README: the Python example works with the current Apify client

  • The README's Python example read the results with run['defaultDatasetId']. With the current Apify client for Python (version 3) call() returns a run object, not a dict, and that line raised TypeError: 'Run' object is not subscriptable — after the run itself had finished. The example now reads run.default_dataset_id; with client version 1 or 2, keep run['defaultDatasetId']. Checked with apify-client 3.2.1, 2.5.1 and 1.12.2.
  • No code, output field or pricing change.

0.3

  • Standby mode: also runs as a real-time API — GET /search?query=<query> returns open roles as JSON, billed per role. See the Standby tab.

0.2

  • Posting dates fixed. postedAt was always empty (Lever's createdAt is an epoch-millisecond value the date parser didn't handle); it now resolves to a real date.
  • Every column carries real data. Fields Lever never provides (city, countryName, seniority, updatedAt) are no longer emitted; department and salary remain and fill where the company publishes them.

0.1

  • Initial release.