Lever Job Board Postings by Company Slug
Pull open job postings from one or more Lever.co company boards, or fetch specific postings by ID, with location, team, salary range, requirements, and apply links, filterable by team, location, and commitment type.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | Fetch every open posting from one or more boards, or fetch specific postings by ID or URL. |
companySlugs | array | optional | Company slugs, board URLs, API URLs or posting URLs. Examples: "wealthfront", "https://jobs.lever.co/wealthfront", "https://jobs.eu.lever.co/olx", "https://api.lever.co/v0/postings/wealthfront". |
companySlug | string | optional | Company slug, board URL, API URL or posting URL used with postingIds (mode=getJob). |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | Fetch every open posting from one or more boards, or fetch specific postings by ID or URL. |
companySlugs | array | optional | Company slugs, board URLs, API URLs or posting URLs. Examples: "wealthfront", "https://jobs.lever.co/wealthfront", "https://jobs.eu.lever.co/olx", "https://api.lever.co/v0/postings/wealthfront". |
companySlug | string | optional | Company slug, board URL, API URL or posting URL used with postingIds (mode=getJob). |
postingIds | array | optional | Posting UUIDs or posting/apply URLs (mode=getJob). |
boardRegion | string | optional | Use auto to try the global board first and fall back to the EU board when global returns 404 or no postings. |
team | string | optional | Keep postings whose team contains this text (case-insensitive). |
department | string | optional | Keep postings whose department contains this text (case-insensitive). |
location | string | optional | Keep postings whose primary location or any additional location contains this text (case-insensitive), e.g. "London" or "Remote". |
commitment | string | optional | Keep postings whose commitment or normalized employment type matches this text, e.g. "Full-time", "Contract", "Internship". |
workplaceType | string | optional | Keep postings with this exact workplace arrangement. |
remoteOnly | boolean | optional | Keep only postings marked remote or with a remote location. |
country | string | optional | Keep postings for one ISO 3166-1 alpha-2 country code, e.g. "US", "DE" or "IN". |
titleKeywords | array | optional | Keep postings whose title contains every word in this list, in any order. |
excludeTitleKeywords | array | optional | Drop postings whose title contains any word in this list. |
postedAfter | string | optional | Keep postings created on or after this date (YYYY-MM-DD). |
hasSalaryOnly | boolean | optional | Keep only postings with a structured salary range published by Lever. |
salaryMin | integer | optional | Keep postings whose structured salary range starts at or above this value (same currency and interval as the posting). |
maxItems | integer | optional | Maximum number of posting records to emit. |
maxItemsPerCompany | integer | optional | Maximum records per company board; 0 means no per-company limit. |
includeDescription | boolean | optional | Include full and section descriptions plus requirement lists. |
includeHtml | boolean | optional | Add the original HTML for descriptions, additional text and list content. |
onlyNewSinceLastRun | boolean | optional | Emit only postings not seen by an earlier run with the same query shape. The first run returns everything. |
Download the published input schema
View complete JSON
{
"description": "Collect open postings from Lever job boards by company slug, board URL, API URL or posting URL. Global and EU boards are supported; all filters run on the complete board data.",
"properties": {
"boardRegion": {
"default": "auto",
"description": "Use auto to try the global board first and fall back to the EU board when global returns 404 or no postings.",
"editor": "select",
"enum": [
"auto",
"global",
"eu"
],
"enumTitles": [
"Auto-detect",
"Global (api.lever.co)",
"EU (api.eu.lever.co)"
],
"prefill": "auto",
"title": "Lever region",
"type": "string"
},
"commitment": {
"description": "Keep postings whose commitment or normalized employment type matches this text, e.g. \"Full-time\", \"Contract\", \"Internship\".",
"editor": "textfield",
"title": "Commitment",
"type": "string"
},
"companySlug": {
"description": "Company slug, board URL, API URL or posting URL used with postingIds (mode=getJob).",
"editor": "textfield",
"title": "Company (mode=getJob)",
"type": "string"
},
"companySlugs": {
"description": "Company slugs, board URLs, API URLs or posting URLs. Examples: \"wealthfront\", \"https://jobs.lever.co/wealthfront\", \"https://jobs.eu.lever.co/olx\", \"https://api.lever.co/v0/postings/wealthfront\".",
"editor": "stringList",
"prefill": [
"wealthfront"
],
"title": "Companies (mode=getJobs)",
"type": "array"
},
"country": {
"description": "Keep postings for one ISO 3166-1 alpha-2 country code, e.g. \"US\", \"DE\" or \"IN\".",
"editor": "textfield",
"title": "Country",
"type": "string"
},
"department": {
"description": "Keep postings whose department contains this text (case-insensitive).",
"editor": "textfield",
"title": "Department",
"type": "string"
},
"excludeTitleKeywords": {
"description": "Drop postings whose title contains any word in this list.",
"editor": "stringList",
"title": "Title must not include",
"type": "array"
},
"hasSalaryOnly": {
"default": false,
"description": "Keep only postings with a structured salary range published by Lever.",
"prefill": false,
"title": "Has salary only",
"type": "boolean"
},
"includeDescription": {
"default": true,
"description": "Include full and section descriptions plus requirement lists.",
"prefill": true,
"title": "Include descriptions",
"type": "boolean"
},
"includeHtml": {
"default": false,
"description": "Add the original HTML for descriptions, additional text and list content.",
"prefill": false,
"title": "Include HTML",
"type": "boolean"
},
"location": {
"description": "Keep postings whose primary location or any additional location contains this text (case-insensitive), e.g. \"London\" or \"Remote\".",
"editor": "textfield",
"title": "Location",
"type": "string"
},
"maxItems": {
"default": 500,
"description": "Maximum number of posting records to emit.",
"maximum": 10000,
"minimum": 1,
"prefill": 3,
"title": "Max items",
"type": "integer"
},
"maxItemsPerCompany": {
"default": 0,
"description": "Maximum records per company board; 0 means no per-company limit.",
"maximum": 10000,
"minimum": 0,
"prefill": 0,
"title": "Max items per company",
"type": "integer"
},
"mode": {
"default": "getJobs",
"description": "Fetch every open posting from one or more boards, or fetch specific postings by ID or URL.",
"editor": "select",
"enum": [
"getJobs",
"getJob"
],
"enumTitles": [
"Get all postings from boards or URLs",
"Get specific postings by ID or URL"
],
"prefill": "getJobs",
"title": "Mode",
"type": "string"
},
"onlyNewSinceLastRun": {
"default": false,
"description": "Emit only postings not seen by an earlier run with the same query shape. The first run returns everything.",
"prefill": false,
"title": "Only new since last run",
"type": "boolean"
},
"postedAfter": {
"description": "Keep postings created on or after this date (YYYY-MM-DD).",
"editor": "textfield",
"title": "Posted after",
"type": "string"
},
"postingIds": {
"description": "Posting UUIDs or posting/apply URLs (mode=getJob).",
"editor": "stringList",
"title": "Posting IDs (mode=getJob)",
"type": "array"
},
"remoteOnly": {
"default": false,
"description": "Keep only postings marked remote or with a remote location.",
"prefill": false,
"title": "Remote only",
"type": "boolean"
},
"salaryMin": {
"description": "Keep postings whose structured salary range starts at or above this value (same currency and interval as the posting).",
"maximum": 100000000,
"minimum": 0,
"title": "Minimum salary",
"type": "integer"
},
"team": {
"description": "Keep postings whose team contains this text (case-insensitive).",
"editor": "textfield",
"title": "Team",
"type": "string"
},
"titleKeywords": {
"description": "Keep postings whose title contains every word in this list, in any order.",
"editor": "stringList",
"title": "Title must include",
"type": "array"
},
"workplaceType": {
"default": "",
"description": "Keep postings with this exact workplace arrangement.",
"editor": "select",
"enum": [
"",
"remote",
"hybrid",
"onsite",
"unspecified"
],
"enumTitles": [
"All workplaces",
"Remote",
"Hybrid",
"On-site",
"Unspecified"
],
"prefill": "",
"title": "Workplace type",
"type": "string"
}
},
"required": [
"mode"
],
"schemaVersion": 1,
"title": "Lever Jobs Scraper Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
jobs | string | optional | Dataset containing all scraped Lever job postings. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "Open postings from global and EU Lever boards — title, company, locations, workplace type, country, employment type, salary, full descriptions and apply links.",
"properties": {
"jobs": {
"description": "Dataset containing all scraped Lever job postings.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "Lever job postings",
"type": "string"
}
},
"title": "Lever Job Board Scraper Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"overview": {
"display": {
"component": "table",
"properties": {}
},
"title": "Jobs",
"transformation": {
"fields": [
"title",
"companySlug",
"location",
"workplaceType",
"employmentType",
"salaryText",
"createdAt",
"hostedUrl"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
Lever Job Board Scraper — Global & EU Boards
Lever hosts the public job boards used by thousands of companies, from early-stage startups to public technology firms. This actor reads those boards directly and returns open roles with their full description, location list, workplace type, country, employment type, salary data when the employer publishes it, and direct apply link. It accepts bare company slugs as well as board, API and posting URLs, and finds EU-only boards automatically.
What this actor does
- Reads global and EU Lever boards from a company slug,
jobs.lever.coURL,api.lever.coURL or a single posting URL - Auto-detects the EU instance when the global board is missing or empty
- Filters every posting client-side by team, department, location, commitment, workplace type, remote-only, country, title words, posting date and salary
- Returns the complete posting, including all locations, workplace type, country, normalized employment type, salary range and readable salary text, description sections and requirement lists
- Supports monitoring with an only-new-since-last-run option that skips postings seen by a previous run
- Never emits empty fields — a field is present only when Lever published a real value
Output per posting
id— Lever posting UUIDtitle— job titlecompanySlug— board slug from LevercompanyName— display name derived from the slug (a readable guess; Lever's API does not publish the official company name)boardRegion—globaloreuboardUrl— the company's Lever board URL for that regioncategories— nestedcommitment,location,teamanddepartmentcommitment,department,team,location— the same values as top-level fieldslocations[]— every location on the posting; falls back to the primary locationworkplaceType—remote,hybrid,onsiteorunspecifiedisRemote— true when the posting is remote or has a remote locationcountry— ISO 3166-1 alpha-2 country codeemploymentType— normalized from the raw commitment:full-time,part-time,contract,internship,temporaryorothersalaryRange— structuredmin,max,currencyandintervalwhen publishedsalaryMin,salaryMax,salaryCurrency,salaryInterval,salaryText— flattened salary values and a readable range such asUSD 75,000–85,000 per yearsalaryDescriptionPlain— salary text when the employer wrote one but did not publish a structured rangedescriptionPlain— combined plain-text descriptionopeningPlain,descriptionBodyPlain,additionalPlain— separate description sectionsadditional— closing or benefits text (same asadditionalPlain)lists[]— requirement/responsibility groups as{text, content}descriptionHtml,additionalHtml,lists[].contentHtml— original HTML whenincludeHtmlis enabledapplyUrl,hostedUrl,sourceUrl— application link and public posting linkscreatedAt— ISO 8601 UTC posting timestamprecordType: "job",scrapedAt
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode |
string | getJobs |
getJobs for whole boards, or getJob for specific postings |
companySlugs |
array | – | Slugs, board URLs, API URLs or posting URLs (mode=getJobs) |
companySlug |
string | – | Company slug, board URL or posting URL (mode=getJob) |
postingIds |
array | – | Posting UUIDs or posting/apply URLs (mode=getJob) |
boardRegion |
string | auto |
auto, global or eu; auto falls back to EU on an empty or missing global board |
team |
string | – | Team contains this text |
department |
string | – | Department contains this text |
location |
string | – | Any location on the posting contains this text |
commitment |
string | – | Commitment text or normalized employment type matches |
workplaceType |
string | – | remote, hybrid, onsite or unspecified |
remoteOnly |
boolean | false |
Keep remote postings only |
country |
string | – | ISO alpha-2 code, e.g. US or DE |
titleKeywords |
array | – | Every word must appear in the title |
excludeTitleKeywords |
array | – | Drop titles containing any of these words |
postedAfter |
string | – | Keep postings created on or after YYYY-MM-DD |
hasSalaryOnly |
boolean | false |
Keep postings with a structured salary range |
salaryMin |
integer | – | Minimum structured salary value |
maxItems |
integer | 500 |
Global record cap (1–10,000) |
maxItemsPerCompany |
integer | 0 |
Per-board cap; 0 means no limit |
includeDescription |
boolean | true |
Include description text and lists |
includeHtml |
boolean | false |
Include original HTML fields |
onlyNewSinceLastRun |
boolean | false |
Emit only postings unseen by a previous matching run |
Examples
Every open role from several companies
{
"mode": "getJobs",
"companySlugs": ["wealthfront", "cologix", "runlaminar"],
"maxItems": 500
}
Board and posting URLs, including an EU-only company
{
"mode": "getJobs",
"companySlugs": [
"https://jobs.lever.co/gohighlevel",
"https://jobs.eu.lever.co/olx",
"https://jobs.lever.co/wealthfront/78d6f6d5-2c6b-4f7f-9f0e-000000000000"
]
}
Remote engineering roles posted this year
{
"mode": "getJobs",
"companySlugs": ["agile-defense", "contentsquare"],
"team": "Engineering",
"remoteOnly": true,
"titleKeywords": ["engineer"],
"postedAfter": "2026-01-01",
"hasSalaryOnly": true
}
Look up specific postings by URL
{
"mode": "getJob",
"companySlug": "wealthfront",
"postingIds": [
"https://jobs.lever.co/wealthfront/78d6f6d5-2c6b-4f7f-9f0e-000000000000",
"https://jobs.lever.co/wealthfront/78d6f6d5-2c6b-4f7f-9f0e-111111111111/apply"
]
}
Use cases
- Job aggregation — feed a niche job board with complete postings from selected Lever employers
- Competitive hiring intelligence — see which teams and locations a competitor is growing
- Recruiting outreach — export remote engineering roles with published salary ranges
- Market research — compare workplace arrangements, countries and salary ranges across companies
- Scheduled monitoring — run daily with only-new mode to capture fresh postings for alerts
FAQ
Do I need a Lever account, API key or cookies?
No. Lever's public postings API is open, and this actor reads only public board data.
Do I need to configure a proxy?
No. The actor connects to Lever directly and needs no proxy setup.
How do I find a company's Lever slug?
Open the company's careers page. If it is hosted by Lever, the URL looks like https://jobs.lever.co/company-slug; the slug is the last path segment. The actor also accepts the whole URL.
Why do some postings have no salary fields?
Lever only returns salary data when the employer chooses to publish it, either as a structured range or as salary text. The actor never estimates or fabricates a range, so salary fields are simply absent on postings without published pay.
What is the difference between commitment and employmentType?
commitment is the employer's raw text, which can vary (Full-Time, Full time, EE Full-Time, Contract). employmentType is a normalized value for filtering and analysis while the raw value is kept for traceability.
Why is companyName sometimes not the official brand name?
Lever's API does not return a display name, so the actor derives one from the company slug. Treat it as a readable label rather than an authoritative company name.
How does auto region detection work?
The actor queries the global Lever host first. If the board is missing there, or returns no postings but the company uses Lever's EU host, the actor retries on api.eu.lever.co and labels those records boardRegion: "eu". An EU board URL goes straight to the EU host.
Can I search every Lever company at once?
No. Lever has no public cross-company search endpoint; boards are read per company. Add as many company slugs or URLs as you need to one run.
Does the actor report closed jobs?
No. Lever only exposes currently published postings, so a posting disappears when it is closed and there is no closed-job or update timestamp. Only-new monitoring reports postings that were not seen on an earlier run.
Is this actor affiliated with Lever?
No. It is an independent third-party actor that reads Lever's public job board data and is not endorsed by or affiliated with Lever Inc.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build Fyyah1xlgAHrHhYo1. Documentation is regenerated from the default published build; private drafts are not included.