Lever Jobs API: Postings from Any Lever Board (Global + EU)
Pricing
from $1.50 / 1,000 job postings
Lever Jobs API: Postings from Any Lever Board (Global + EU)
Lever jobs API: every posting on any Lever board, global (jobs.lever.co) and EU (jobs.eu.lever.co), with full description and salary range when published. Bulk board URLs or slugs; keyword, location, team, commitment, remote and date filters.
Pricing
from $1.50 / 1,000 job postings
Rating
0.0
(0)
Developer
Ailu Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Lever Jobs API: every posting from any Lever job board, global (jobs.lever.co) and EU (jobs.eu.lever.co), with description and salary
Palantir, Spotify, OLX, Siteimprove and many other companies publish their openings on Lever at jobs.lever.co/<slug> or, for EU-hosted accounts, jobs.eu.lever.co/<slug>. This Actor reads Lever's public postings API on both instances and returns every open posting as a clean row: title, team, department, commitment, all locations, country, workplace type, creation date, the full description (plain text and HTML) and the salary when the company publishes it, either Lever's structured salary range or, as a fallback, a pay range written in the posting text (salarySource tells you which). A bare slug is tried on the global instance first and then on the EU instance, so EU boards that look "dead" on api.lever.co are found automatically. No API key, bulk board input, and $1.50 per 1,000 postings versus $2.00–$3.00 for the most-used Lever Actors in the Store.
Use cases
- Job aggregation: pull postings from many Lever boards (US and EU) into one job board or newsletter.
- Salary research: published ranges by team, commitment and country.
- Hiring signals: watch which teams and countries a target company is expanding.
- Candidate alerts: daily run with
postedWithinDays: 1,teamandremoteOnly. - AI matching: plain-text descriptions ready for embeddings.
Input
| Field | Default | Meaning |
|---|---|---|
boards | ["palantir", "spotify"] | Lever board URLs (jobs.lever.co/<slug>, jobs.eu.lever.co/<slug>, posting URLs), lever-eu:<slug>, or bare slugs. |
keywords | – | Keep postings whose title or description contains any of these words. |
locations | – | Keep postings whose location or country code contains any of these strings. |
team | – | Keep postings whose team or department contains any of these strings. |
commitment | – | Keep postings whose commitment contains any of these strings (e.g. Full-time, Intern). |
remoteOnly | false | Only remote postings. |
postedWithinDays | 0 | Only postings created in the last N days (0 = off). |
maxItems | 200 | Cap on returned postings for the whole run. |
{ "boards": ["https://jobs.lever.co/spotify", "https://jobs.eu.lever.co/siteimprove", "olx"], "team": ["Engineering"], "commitment": ["Full-time", "Permanent"], "postedWithinDays": 30, "maxItems": 500 }
Output
| Field | Type | Meaning |
|---|---|---|
id, sourceId, source | string | lever:<slug>:<postingId>, the posting UUID, lever or lever-eu. |
company, companySlug | string | Company name from the board page and the board slug. |
title, team, department, commitment, level | string | Posting title and Lever categories. |
locations, country | string[], string | All locations and ISO country code. |
isRemote, workplaceType, employmentType | boolean, string, string | remote/hybrid/onsite; employmentType mirrors commitment. |
salaryMin, salaryMax, salaryCurrency, salaryInterval, salaryRaw | number, number, string, string, string | Published salary; null when none. |
salarySource, salaryDescription | string | salaryRange or description; Lever's salary note. |
postedAt | ISO 8601 | Posting creation time (UTC). |
url, applyUrl | string | Posting and application page. The Actor never applies. |
descriptionText, descriptionHtml | string | Full description: intro, requirement lists and closing text. |
fetchedAt | ISO 8601 | Run time. |
{"id": "lever:siteimprove:0e1585af-dc06-4cc7-93a9-cae389ace737", "sourceId": "0e1585af-dc06-4cc7-93a9-cae389ace737", "source": "lever-eu","companySlug": "siteimprove", "company": "Siteimprove", "title": "Account Executive (DACH) - German Speaking","department": "GTM", "team": "Enterprise Sales", "commitment": "Full-Time", "level": null, "locations": ["Germany"], "country": "DE","isRemote": true, "workplaceType": "remote", "employmentType": "Full-Time", "postedAt": "2026-05-20T15:22:03.742Z", "updatedAt": null,"url": "https://jobs.eu.lever.co/siteimprove/0e1585af-dc06-4cc7-93a9-cae389ace737", "applyUrl": "https://jobs.eu.lever.co/siteimprove/0e1585af-dc06-4cc7-93a9-cae389ace737/apply","salaryMin": 76200, "salaryMax": 95250, "salaryCurrency": "EUR", "salaryInterval": "year", "salaryRaw": "EUR 76,200–95,250 per year", "salarySource": "salaryRange","salaryDescription": "The base salary for this role will fall within the posted range …","descriptionText": "Siteimprove is a global leader in digital accessibility, content optimization, …", "descriptionHtml": "<div>\n<p>Siteimprove is a global leader …", "fetchedAt": "2026-11-04T11:40:04.984Z"}
How it works and limits
- Per board:
GET api.lever.co/v0/postings/<slug>?mode=json(orapi.eu.lever.cofor EU accounts) returns all postings with descriptions in one response, plus one request to the public board page for the company display name. Requests are spaced 300 ms per host and retried on 429/5xx. Large boards answer slowly (Palantir, 300+ postings and about 6 MB, takes roughly 5 seconds). - Salary: Lever's structured
salaryRangeis used when present (Siteimprove: 11 of 12 postings on 2026-11-04). Otherwise the Actor looks for a currency range next to words such as "salary", "base" or "pay" in the posting text (Palantir: 203 of 307, Spotify: 21 of 84). A bare$is read as USD only for US postings. Postings without either staynull. - Lever's public API has no "updated" timestamp;
postedAtis the posting creation time. - Boards are read in the order given; once
maxItemsis reached the remaining boards are skipped and listed in the run summary (OUTPUTrecord). - Not covered: internal/confidential postings, application forms, candidate data.
Pricing
Pay per result: $1.50 per 1,000 rows (job event). Platform usage is billed separately by Apify. Removed/free rows are not charged.
Legal
Not affiliated with Lever (Employ Inc.) or the employers. Uses the public Lever Postings API only. Data licence/terms: https://github.com/lever/postings-api. Job content belongs to the employers who published it.
FAQ
How do I know if a board is on the EU instance? You do not need to: pass the slug and the Actor tries both. URLs starting with jobs.eu.lever.co go straight to the EU API.
Why is salary sometimes taken from the description? Many companies (for example Palantir and Spotify) write the pay range in the posting text instead of Lever's salary field. salarySource: "description" marks those rows and salaryRaw shows the sentence it came from.
Can I get only new postings? Use postedWithinDays: 1 on a daily schedule, or the Job Change Tracker Actor for new/updated/removed detection.
Does it include closed postings? No. Lever's public API only lists currently open postings.