Vexaloom Labs

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.

FieldTypeRequiredDescription
modestringrequiredFetch every open posting from one or more boards, or fetch specific postings by ID or URL.
companySlugsarrayoptionalCompany 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".
companySlugstringoptionalCompany slug, board URL, API URL or posting URL used with postingIds (mode=getJob).
Show all input fields
FieldTypeRequiredDescription
modestringrequiredFetch every open posting from one or more boards, or fetch specific postings by ID or URL.
companySlugsarrayoptionalCompany 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".
companySlugstringoptionalCompany slug, board URL, API URL or posting URL used with postingIds (mode=getJob).
postingIdsarrayoptionalPosting UUIDs or posting/apply URLs (mode=getJob).
boardRegionstringoptionalUse auto to try the global board first and fall back to the EU board when global returns 404 or no postings.
teamstringoptionalKeep postings whose team contains this text (case-insensitive).
departmentstringoptionalKeep postings whose department contains this text (case-insensitive).
locationstringoptionalKeep postings whose primary location or any additional location contains this text (case-insensitive), e.g. "London" or "Remote".
commitmentstringoptionalKeep postings whose commitment or normalized employment type matches this text, e.g. "Full-time", "Contract", "Internship".
workplaceTypestringoptionalKeep postings with this exact workplace arrangement.
remoteOnlybooleanoptionalKeep only postings marked remote or with a remote location.
countrystringoptionalKeep postings for one ISO 3166-1 alpha-2 country code, e.g. "US", "DE" or "IN".
titleKeywordsarrayoptionalKeep postings whose title contains every word in this list, in any order.
excludeTitleKeywordsarrayoptionalDrop postings whose title contains any word in this list.
postedAfterstringoptionalKeep postings created on or after this date (YYYY-MM-DD).
hasSalaryOnlybooleanoptionalKeep only postings with a structured salary range published by Lever.
salaryMinintegeroptionalKeep postings whose structured salary range starts at or above this value (same currency and interval as the posting).
maxItemsintegeroptionalMaximum number of posting records to emit.
maxItemsPerCompanyintegeroptionalMaximum records per company board; 0 means no per-company limit.
includeDescriptionbooleanoptionalInclude full and section descriptions plus requirement lists.
includeHtmlbooleanoptionalAdd the original HTML for descriptions, additional text and list content.
onlyNewSinceLastRunbooleanoptionalEmit 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.

FieldTypeRequiredDescription
jobsstringoptionalDataset 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.co URL, api.lever.co URL 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 UUID
  • title — job title
  • companySlug — board slug from Lever
  • companyName — display name derived from the slug (a readable guess; Lever's API does not publish the official company name)
  • boardRegion — global or eu
  • boardUrl — the company's Lever board URL for that region
  • categories — nested commitment, location, team and department
  • commitment, department, team, location — the same values as top-level fields
  • locations[] — every location on the posting; falls back to the primary location
  • workplaceType — remote, hybrid, onsite or unspecified
  • isRemote — true when the posting is remote or has a remote location
  • country — ISO 3166-1 alpha-2 country code
  • employmentType — normalized from the raw commitment: full-time, part-time, contract, internship, temporary or other
  • salaryRange — structured min, max, currency and interval when published
  • salaryMin, salaryMax, salaryCurrency, salaryInterval, salaryText — flattened salary values and a readable range such as USD 75,000–85,000 per year
  • salaryDescriptionPlain — salary text when the employer wrote one but did not publish a structured range
  • descriptionPlain — combined plain-text description
  • openingPlain, descriptionBodyPlain, additionalPlain — separate description sections
  • additional — closing or benefits text (same as additionalPlain)
  • lists[] — requirement/responsibility groups as {text, content}
  • descriptionHtml, additionalHtml, lists[].contentHtml — original HTML when includeHtml is enabled
  • applyUrl, hostedUrl, sourceUrl — application link and public posting links
  • createdAt — ISO 8601 UTC posting timestamp
  • recordType: "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.

Open the step-by-step Python guide →

Source build Fyyah1xlgAHrHhYo1. Documentation is regenerated from the default published build; private drafts are not included.