Lever Job Board Scraper — Open Roles & Hiring Signals
Pricing
$2.00 / 1,000 job postings
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 hours ago
Last modified
Categories
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.cocompanies 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)
- Type your job titles — one per line (
account executive,software engineer), or*for every job. - Narrow it down (optional) — location, department, remote only, commitment, posting date; or add specific companies in
queries. - 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}
| Field | Type | Description |
|---|---|---|
searchQueries | array | Job-title keywords, one per line. Every word must appear in the title (engineer also matches engineering). * = every job matching the filters. |
location | string | Text the location(s) must contain, e.g. London, Germany, United States (US jobs written City, ST count as United States). |
department | string | Text the department or team must contain, e.g. Sales, Engineering. |
remoteOnly | boolean | Keep only remote jobs. |
employmentType | string | Text the commitment must contain, e.g. Full Time, Contract, Intern. |
postedWithinDays | string | any, 1, 7, 30 or 90. |
queries | array | Optional Lever slugs (palantir) or job-site URLs (https://jobs.eu.lever.co/… works). Search filters do not apply to them. |
maxResultsPerQuery | integer | Caps jobs per keyword or company (default 200). |
maxConcurrency | integer | How many companies from queries to fetch at once. |
scanConcurrency | integer | How many job sites a keyword search reads at once (default 8). |
includeRaw | boolean | Attach the source's untouched record under raw (companies in queries). |
requestDelayMs | integer | Politeness delay between requests. |
proxyConfiguration | object | Optional. |
📤 Output
One row per open role, saved to the dataset.
| Field | Description |
|---|---|
companyName | Company name |
companyBoard | Company slug — join key across runs |
jobId | Lever posting ID |
jobTitle | Role title |
department / team | Department (Lever category) / team |
location / allLocations | Primary location / all posting locations |
isRemote / workplaceType | Remote flag / on-site, remote or hybrid |
employmentType | Commitment (full-time, contract…) |
salary | Salary range where published |
postedAt | Posted date (ISO) |
description | Full description, HTML stripped |
applyUrl / sourceUrl | Apply 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 ApifyClientclient = 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:
| Event | Price | When |
|---|---|---|
| Job posting | $0.002 | per delivered role |
| Keyword search | $0.02 | from 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>orjobs.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.
⚖️ Is it legal to scrape this data?
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
- 🌐 Website: data.foxlabs.com.tr
- 📧 Email: info@foxlabs.com.tr
- 🐛 Issues: open a ticket in the Actor's Issues tab
- 🧰 More clean B2B data actors: Fox Labs on Apify
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), withlocation,department,remoteOnly,employmentTypeandpostedWithinDaysfilters. 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
queriesfinds 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 raisedTypeError: 'Run' object is not subscriptable— after the run itself had finished. The example now readsrun.default_dataset_id; with client version 1 or 2, keeprun['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.
postedAtwas always empty (Lever'screatedAtis 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;departmentandsalaryremain and fill where the company publishes them.
0.1
- Initial release.