How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
leverdemoin Lever boards or job URLs. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Lever job scraper for current published jobs from the public Lever boards you provide. Add a board slug, board URL, or one exact job URL. Get one row per unique job, ready for recruiting market research or job listings export.
Who uses it
Recruiting researchers
Study hiring by team or place at known companies.
Job aggregators
Export company jobs into your own job feed.
Data teams
Save public job text for your own pipeline.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Unique job result | $0.0003 | One unique useful job row saved to the default Dataset. |
| Start fee | $0.002 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
Examples
- One job: about $0.0023.
- 1,000 jobs: about $0.30.
- Every day 100 jobs, for 30 days: about $0.96 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 16,000 jobs.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Do I need a Lever account or API key?
No. The tool reads public published postings through the Lever Postings API.
Can I search jobs across every Lever company?
No. You must give known boards. There is no company search.
Can I get one single job?
Yes. Paste the exact job URL. You get that job if it is still public.
Does a second run show only new jobs?
No. Each run returns the current jobs. Compare IDs in your own system.
Can I get EU jobs or one job URL?
Yes. Use an EU hosted board/job URL for EU mode. An exact posting URL returns that job if it remains public.
Does a repeat run return only new jobs?
No. It returns a fresh snapshot. Duplicate jobs are removed within a run, not across runs.
Can descriptions or locations be missing?
Yes. The source controls those fields. Check nulls, empty arrays and includeContent; do not treat missing fields as guessed values.
Details
Step by step on Apify
- Open the Input tab.
- Keep the filled
targetsexample,leverdemo, or enter your public Lever board URL. - Keep Include descriptions and lists on for the full content.
- Click Start.
- Open the default Dataset. Check
sourceJobId,title,hostedUrlanddescriptionTextin the first row. - Open Key-value store → RUN_SUMMARY to check the target status and counts.
Use cases
| Task | Input | Key fields | Next step |
|---|---|---|---|
| Export company job listings | Board slugs in targets | sourceJobId, title, hostedUrl, applyUrl | Export Dataset as JSON or CSV |
| Study hiring by team or place | filters.teams, filters.locationIncludes | team, department, locations, commitment | Group rows in your own sheet |
| Save public job content | includeContent: true | descriptionHtml, descriptionText, lists | Use the content in your own pipeline |
| Recheck a known posting | Exact job URL in targets | Stable id, observedAt, source fields | Compare snapshots in your own system |
Tips for better results
- The slug is the name in jobs.lever.co/name. Use an EU link for EU boards.
- Turn on continue after error when you check many boards in one run.
- Store job IDs yourself to spot new jobs. Each run is a fresh snapshot.
Recent updates
Version 0.1.12 · 17 September 2026
- Verified the owner-published public Store page, public Actor state, current
latestbuild, price, copy, existing icon and exact source parity. - Ran one bounded public default canary on
ZEZrMcrKQuvEHs6iA: 11 Dataset rows, 11 settled events, and$0.0035969828223089374total spend. - Reconciled Dataset,
RUN_SUMMARY,Run.output, charged events and Git/GitHub state; no release defect was found.
- Verified the owner-published public Store page, public Actor state, current
Update
- Added safer handling for a failed charge call so already accepted rows are flushed before the run reports a technical outcome.
- Added deterministic checks for redirects, oversized responses, repeated pages, aborts and charge failures.
- Aligned the public name and description with the
Lever job scrapersearch phrase and kept the customer README focused on use and limits.
Update · 9 October 2026
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"id": "lever:global:leverdemo:ad208490-4052-4f91-a57e-433f2d1e484b",
"sourceJobId": "ad208490-4052-4f91-a57e-433f2d1e484b",
"boardSlug": "leverdemo",
"title": "Customer Success Manager",
"location": "Atlanta, Georgia",
"locations": [
"Atlanta, Georgia"
],
"department": "Customer Success",
"team": "Customer Success Team",
"commitment": "Regular Full Time (Salary)",
"workplaceType": "hybrid",
"hostedUrl": "https://jobs.lever.co/leverdemo/ad208490-4052-4f91-a57e-433f2d1e484b",
"applyUrl": "https://jobs.lever.co/leverdemo/ad208490-4052-4f91-a57e-433f2d1e484b/apply"
}Use it from code
Actor ID: cliqtomedia/lever-jobs-scraper. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/lever-jobs-scraper").call(run_input={
"targets": [
"leverdemo"
],
"includeContent": True
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~lever-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"targets": ["leverdemo"], "includeContent": true}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/lever-jobs-scraper")
result = tool.invoke({"run_input": {"targets": ["leverdemo"], "includeContent": True}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (31)
| Field | Type | Meaning |
|---|---|---|
id | string | Stable ID: lever:{region}:{board}:{postingId}. |
source | string | The public source name. |
idRuleVersion | string | Version of the stable identifier rule. |
region | string | Global or EU public Lever instance. |
boardSlug | string | Normalized public Lever site slug. |
boardUrl | string | Canonical public hosted board URL. |
sourceJobId | string | Upstream Lever posting ID. |
title | string | Published job title. |
location | string | Primary source location, when present. |
locations | array | Source location values. |
department | string | Source department, when present. |
team | string | Source team, when present. |
commitment | string | Source commitment, when present. |
country | string | Source ISO-2 country, when present. |
workplaceType | string | Source workplace type or unspecified. |
openingHtml | string | Source opening HTML when content is included. |
openingText | string | Plain opening text when content is included. |
descriptionHtml | string | Source combined description HTML. |
descriptionText | string | Plain combined description. |
descriptionBodyHtml | string | Source body HTML. |
descriptionBodyText | string | Plain body text. |
lists | array | Source list sections with title, HTML and text. |
additionalHtml | string | Source additional HTML. |
additionalText | string | Plain additional text. |
salaryRange | object | Source salary range when provided. |
salaryDescriptionHtml | string | Source salary note HTML. |
salaryDescriptionText | string | Plain salary note. |
hostedUrl | string | Canonical public job page. |
applyUrl | string | Source application URL; never submitted by the Actor. |
createdAt | string | Source creation time in ISO format. |
observedAt | string | Time this Actor observed the row. |
Input settings (7)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Lever boards or job URLs required | targets | array | ["leverdemo"] |
| Include descriptions and lists | includeContent | boolean | true |
| Filters | filters | object | |
| Maximum jobs per target | maxJobsPerTarget | integer | 0 |
| Maximum total jobs | maxTotalJobs | integer | 5000 |
| Source page size | pageSize | integer | 0 |
| Continue after a target error | continueOnError | boolean | true |
Use cases with this tool
Each guide shows all the steps and the other tools.
