Lever Jobs API - Search 224 Boards, No Company List
Pricing
from $2.00 / 1,000 job records
Lever Jobs API - Search 224 Boards, No Company List
Query an index of 224 verified Lever boards — 5,945 open roles — with no company handles of your own. Filter by title, location, remote and posting date, or name your own boards. Clean JSON per job, deduped so scheduled runs return only new roles.
Pricing
from $2.00 / 1,000 job records
Rating
0.0
(0)
Developer
K O
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Lever Jobs Scraper — Remote, Hybrid or Onsite, Not Just a Boolean
The only one of our ATS board scrapers that keeps Lever's real three-way workplace type — remote, hybrid, or onsite — instead of collapsing it to a single true/false flag, plus a separate country field. Query any company's public Lever board and get one normalized JSON record per posting.
Pain points
- Lever's postings API is public but per-company — you need each company's handle and have to hit boards one at a time.
- Most job scrapers reduce "how remote is this role" to a boolean. Lever's own data actually distinguishes remote / hybrid / onsite, and that distinction gets lost the moment you keep only the boolean.
- A posting can carry more than one location tag; keeping only the "primary" one drops the rest.
- Watching a list of companies for genuinely new roles means storing what you already pulled and diffing every run yourself.
What we solve
- Full workplace-type fidelity.
workplaceTypekeeps Lever's raw remote/hybrid/onsite value;remoteis a convenience boolean derived from it — you get the quick filter and the real distinction. - Every tagged location.
allLocationsreturns the complete location array Lever attaches to a posting, alongside the single primarylocation. - A dedicated country field, separate from the free-text location string.
- Multi-board in one run. Pass a list of
companies; a handle that fails or was renamed is skipped with a logged warning, not a fatal error — the rest of your list still comes back. - Dedup built in.
onlyNewSinceLastRun(default on) persists the last 20,000 posting ids seen, so a recurring schedule only bills for postings that are genuinely new.
Who uses it
Recruiters and sourcers, job-board and ATS aggregators, sales teams tracking a target account's hiring, labor-market analysts, and anyone building a "new roles at companies I follow" alert.
Company bundles - no company list needed
You do not need to know a single board slug to run this. Pick a bundle in presetLists, hit Start, and you get live postings straight away.
| Bundle | Lever boards | What it covers |
|---|---|---|
fintech | 6 | Payments, banking, lending, crypto and financial infrastructure. |
remote-first | 6 | Companies that hire remote-first or distributed by default. |
Every slug in a bundle was checked against its live board on 2026-08-24 - a 200 response with at least one open role. Each bundle file carries its own verifiedAt date, and any board that stops answering is reported in the run's FAILED_TARGETS record instead of silently shrinking your results.
Bundles merge with anything you list yourself and are deduped, so you can start from a bundle and add your own companies to it.
Search every board we know - no company list at all
Turn on Search every board we know and you do not supply companies, slugs or bundles. The run queries our index of 224 verified lever boards - 5,945 open roles at the last check on 2026-08-24 - and applies your title, location and remote filters across all of them.
Ask it things a company list cannot answer:
- every remote senior backend role posted this week
- everything matching "machine learning" across every board in the index
- new postings only, across the whole index, on a daily schedule
| ATS | Boards |
|---|---|
| lever | 224 |
Every board in the index answered its ATS with at least one open role when the index was built. Boards are fetched most-active first and capped by Maximum boards to search (default 200), because each board is one request. The index is rebuilt on a refresh sweep; a board that stops answering three sweeps running is retired from it, and anything that fails during your run is reported in FAILED_TARGETS rather than silently shrinking your results.
Input
| Field | What it does |
|---|---|
searchIndex | No company list at all. Query every board in the shipped index and apply your filters across all of them. See the section above. |
maxBoards | Only used with searchIndex. Each board is one request, so this caps run length. Boards are searched most-active first. |
presetLists | Start here if you have no company list. One or more verified company bundles; every board in them was checked against the live API. Merges with anything you list yourself, deduped. |
companies | One or more Lever company handles — the slug in jobs.lever.co/<handle> (e.g. ro). |
maxPerCompany | Stop after this many jobs from each board, so one large employer cannot fill the whole result. Recommended with bundles. Empty = no cap. |
titleIncludes | Keep only jobs whose title contains one of these keywords (case-insensitive). Empty = all. Applied before billing. |
locationIncludes | Keep only jobs whose location contains one of these keywords. Empty = all. Applied before billing. |
remoteOnly | Keep only remote-flagged roles (or locations mentioning remote). Applied before billing. |
postedWithinDays | Keep only postings published in the last N days — 7 gives you this week's roles. Postings on boards that publish no date are left out, because they cannot be shown to be recent. Applied before billing. |
includeDescription | Include each posting's plain-text description. Off by default for lean records. |
includeSalary | Read pay out of the posting body into the salary fields. On by default; costs no extra requests, and does not add the body to the record. |
onlyNewSinceLastRun | Recommended for schedules — skips jobs already returned by a previous run, so you're only charged for genuinely new postings. Default true. |
maxItems | Stop after this many normalized records. |
syncEnabled | Optional, off by default. Also send each new job straight to a connected app — see Sync below. |
syncDestination, syncWriteTool, syncFieldMap, syncExtraArgs | Only used when syncEnabled is on. |
Output
| Field | Description |
|---|---|
jobId | Lever's posting id (UUID). |
company | The Lever handle you queried. |
title | Job title. |
location | Primary posting location. |
allLocations | Array — every location tag Lever attaches to this posting. |
department | Team/department, from Lever's category tags. |
employmentType | Commitment type (e.g. Full-time). |
remote | Boolean, derived from workplaceType === 'remote'. |
workplaceType | Lever's raw three-way value: remote, hybrid, or onsite. |
country | ISO-style country, when Lever provides one. |
postedAt | Posting creation date (ISO), converted from Lever's epoch milliseconds. |
url | Public posting URL. |
applyUrl | Direct apply-form URL. |
description | Plain-text description, only when includeDescription is on; otherwise null. |
source | Always "Lever". |
salaryMin / salaryMax | Pay range as plain numbers, so you can sort and filter on it. null when the posting does not state pay — never a guess. |
salaryCurrency | ISO code (USD, EUR, GBP, …) where the posting makes it clear. |
salaryInterval | YEAR, MONTH, WEEK, DAY or HOUR. |
salaryText | The pay exactly as the posting worded it, kept so you can audit the parse. |
salarySource | ats when the board published structured pay, ats-summary or description when it was read out of the posting text. null when no pay was found. |
cityDerived / regionDerived / countryDerived / countryCodeDerived | The location string split into parts, so "Austin, TX" is filterable by state and country instead of by substring. |
locationType | REMOTE, HYBRID or ONSITE. |
seniorityLevel | INTERN, JUNIOR, SENIOR, STAFF, PRINCIPAL, MANAGER, DIRECTOR, VP or EXECUTIVE, read from the title. null when the title carries no signal. |
employmentTypeNormalized | FULL_TIME, PART_TIME, CONTRACT, INTERN, APPRENTICESHIP or VOLUNTEER — one enum across every ATS, so records are comparable. |
daysSincePosted | Whole days since the posting went live, precomputed. |
organizationUrl | The public careers board this posting came from. |
Pay coverage. Lever publishes no structured pay field, so salaryMin/salaryMax are read out of the posting body. Measured 08/2026: 39 of 51 postings on one board, 28 of 96 on another. Coverage depends on how the employer writes its postings.
This is a real record, captured live from the ro board on 08/21/2026 — not a placeholder:
{"presetLists": ["fintech"],"jobId": "f25a6c49-5ed4-4aa0-a5bb-b30e9790f90c","company": "ro","title": "Compounding Pharmacy Technician - Romeoville, IL","location": "Romeoville, IL","allLocations": ["Romeoville, IL"],"department": "Pharmacy","employmentType": "Full-time","remote": false,"workplaceType": "onsite","country": "US","postedAt": "2025-06-17T00:24:42.479Z","url": "https://jobs.lever.co/ro/f25a6c49-5ed4-4aa0-a5bb-b30e9790f90c","applyUrl": "https://jobs.lever.co/ro/f25a6c49-5ed4-4aa0-a5bb-b30e9790f90c/apply","description": null,"source": "Lever","salaryMin": 23,"salaryMax": 27,"salaryCurrency": "USD","salaryInterval": "HOUR","salaryText": "$23 to $27,","salarySource": "description","cityDerived": "Romeoville","regionDerived": "IL","countryDerived": "United States","countryCodeDerived": "US","locationType": "ONSITE","seniorityLevel": null,"employmentTypeNormalized": "FULL_TIME","daysSincePosted": 430,"organizationUrl": "https://jobs.lever.co/ro"}
Which actor do I want?
- Tracking Lever boards specifically, and want the remote/hybrid/onsite distinction or every location tag? You're in the right place.
- Tracking companies across Lever and Greenhouse, Ashby, SmartRecruiters, Recruitee or Workable in one feed? Use Job Postings Aggregator — one schema, one dedup layer, across all six ATS platforms. Its unified schema keeps a plain
remoteboolean but dropsworkplaceType,allLocationsandcountry— pull from here directly if you need those. - Need a different single board? Greenhouse Jobs Scraper (multi-department/office tagging) · Ashby Jobs Scraper (published salary) · Workable Jobs Scraper (description, requirements and benefits, split out)
Sync to your CRM, Notion, HubSpot, Airtable or Supabase (optional)
Turn on syncEnabled to also send each new job straight to a connected
app — free, with no extra charge. Connect the app under Integrations in
Apify Console, pick it as syncDestination, and set syncWriteTool to the
name of the tool that creates one record there (run the
dataset-sync-connector
Actor in list-tools mode against the same connector if you don't know the
name). A sync failure is logged as a warning and never blocks the dataset —
your jobs always land here first regardless of what the destination does.
Pricing (Pay-Per-Event)
query— charged once per run for the board poll, regardless of how many companies you list.job-record— charged per normalized job pushed (after dedup). This is the primary event.apify-actor-start(Apify-managed) — covers baseline compute per run.- Sync to a connected app (optional) — free. No event is charged for records sent to a destination; it's an added convenience on top of the dataset you already paid for.
A daily monitor of a handful of companies returns a few new roles for pennies; a full-board pull of a large employer is a larger one-time run you control with maxItems.
Source & reliability
Data comes from Lever's public api.lever.co/v0/postings service. No API key, no proxy needed. A handle that 404s or fails is skipped with a logged warning — it doesn't fail the rest of your run. Run npm test for the offline self-test covering the normalizer and its edge cases.
FAQ
How am I charged?
A flat query event once per run, plus one job-record event per normalized job actually pushed to the dataset. With onlyNewSinceLastRun on (the default), a posting already returned in a previous run (tracked by id, for the most recent 20,000 seen) is skipped and not re-charged.
Where does the data come from?
Lever's public postings API (api.lever.co/v0/postings) — the same data Lever's own hosted job boards are built from. No API key or proxy required.
How fresh is it?
Live at request time — there's no bundled or cached dataset behind this actor, it calls Lever directly on every run. Schedule it (daily or weekly) to keep catching new postings; onlyNewSinceLastRun means a recurring schedule only bills for roles you haven't seen yet.
Which actor do I want?
See Which actor do I want? above — short version: single Lever boards with workplace-type detail, stay here; multiple ATS platforms in one feed, use jobs-aggregator.
SEO keywords: Lever jobs scraper, Lever postings API, job posting scraper, ATS scraper, new jobs feed, hiring signals, recruiting data API, job board aggregator