Lever Postings API — Tech Jobs, Salaries & ATS Data avatar

Lever Postings API — Tech Jobs, Salaries & ATS Data

Pricing

from $2.00 / 1,000 results

Go to Apify Store
Lever Postings API — Tech Jobs, Salaries & ATS Data

Lever Postings API — Tech Jobs, Salaries & ATS Data

Unofficial Lever Postings API in one Apify actor. Scrape jobs and structured salary data from any Lever-powered career page — Netflix, Spotify, Shopify, Mixpanel, Lyra Health & 5,000+ more. Pure HTTP, no auth, structured workplaceType, global + EU instances.

Pricing

from $2.00 / 1,000 results

Rating

0.0

(0)

Developer

Logiover

Logiover

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

19 hours ago

Last modified

Share

Lever Postings API — Apify Actor

Unofficial Lever Postings API in one actor. Scrape jobs, structured content blocks, and real salary data from any company on Lever — Netflix, Spotify, Shopify, Mixpanel, Lyra Health, KKR, Eventbrite, Reddit and thousands more.

Pure HTTP. No authentication. No headless browser. Sub-second responses per board. Supports both global (api.lever.co) and EU (api.eu.lever.co) Lever instances. Server-side filtering forwarded to Lever's native API for fastest possible results.


Why this actor

Lever's Postings API is public but raw — you need to know the endpoints, handle two regional instances, normalize a confusing mix of text vs title, categories.team vs top-level fields, deal with optional salaryRange objects, and apply client-side post-filters Lever's server doesn't support (workplaceType, country, salary thresholds).

This actor does all of that. You get structured, normalized, downstream-ready records for any Lever board. One input, hundreds of jobs.

What makes Lever data special

Compared to other ATS platforms, Lever ships uniquely valuable structured fields:

FieldWhy it matters
salaryRangeStructured {currency, interval, min, max} — not buried in description HTML like Greenhouse. Filter, sort, model on it.
workplaceTypeExplicit remote, hybrid, on-site, or unspecified. Remote-job pipelines love this.
lists[]Structured Qualifications, Responsibilities, etc. as separate {text, content} blocks. No regex needed to parse requirements.
countryISO 3166-1 alpha-2. Easy multi-country slicing.
categories.allLocationsArray of all eligible locations for multi-city postings.

How it compares

This actor (Lever)Generic web scrapersOther Apify Lever actors
Public Lever API✅ Direct❌ HTML parsingSome
Server-side filtering✅ team/dept/location/commitment/levelLimited
EU instance support✅ Toggle in inputRare
Salary parsing✅ Structured object❌ Regex from textLimited
Structured lists[]✅ Preserved❌ FlattenedLimited
Multi-site batch✅ ConcurrentManual loopsSometimes
Workplace type filter
No-auth, no-proxyOften proxied
Maintenance burden✅ Stable public APIHigh (DOM changes)Varies

Modes

jobs — list mode (default)

Fetch all currently-published postings from one or more Lever sites in parallel.

{
"mode": "jobs",
"sites": ["leverdemo", "lever"],
"instance": "global",
"concurrency": 5
}

Returns one record per posting, fully normalized. With multiple sites, requests run in parallel up to your concurrency setting (default 5, max 20).

jobDetail — deep detail mode

Fetch specific postings by UUID. Useful when you already have job IDs from elsewhere (your CRM, a database, the jobs mode output) and want fresh data.

{
"mode": "jobDetail",
"sites": ["leverdemo"],
"jobIds": [
"33538a2f-d27d-4a96-8f05-fa4b0e4d940e",
"5ac21346-8e0c-4494-8e7a-3eb92ff77902"
]
}

Output is identical in shape to jobs mode — same normalization, same fields.


Filtering: server-side vs client-side

Server-side (fast — Lever does the work)

Lever supports native filtering on team, department, location, commitment, level. Set any of these in the input and they're forwarded as query parameters. Multiple values are OR'ed; different filters are AND'ed. Filters are case-sensitive (Lever's rule).

{
"mode": "jobs",
"sites": ["leverdemo"],
"team": ["Engineering", "Product"],
"commitment": ["Full Time"]
}

This calls Lever as: ?team=Engineering&team=Product&commitment=Full%20Time&mode=json — only matching postings are downloaded.

Client-side (after fetch — workplace, country, salary, title)

Lever doesn't support filtering on these, so the actor does it after the fetch:

FilterEffect
filterTitleKeywordsKeep postings whose title contains any of these (case-insensitive)
filterWorkplaceTypesKeep only chosen workplace types (remote, hybrid, on-site, unspecified)
filterCountriesKeep only matching ISO country codes
filterSalaryMinKeep only postings with disclosed salaryMin >= threshold
{
"mode": "jobs",
"sites": ["leverdemo"],
"filterTitleKeywords": ["engineer", "developer"],
"filterWorkplaceTypes": ["remote", "hybrid"],
"filterCountries": ["US", "CA"],
"filterSalaryMin": 120000
}

Pagination — Lever native

Lever uses offset pagination via skip and limit. The actor exposes both:

{
"mode": "jobs",
"sites": ["bigemployer"],
"skip": 100,
"limit": 50
}

For most use cases you don't need pagination — Lever returns all published postings by default. Use maxResultsPerSite if you want a hard local cap.


Who this is for

🎯 Recruitment intelligence / talent acquisition

Build a real-time pipeline of every job a target company is hiring for. Lever's structured salary data lets you benchmark compensation per role/level/region without manual parsing.

📊 HR tech & ATS market analytics

Track which companies are using Lever, hiring velocity, role mix, remote/hybrid split, salary disclosure trends. Compare against Greenhouse, Workday, Ashby.

🤖 AI agents and LLM context

Lever's plaintext fields (*Plain variants) are LLM-ready — no HTML cleanup required. Structured lists[] already separates Qualifications from Duties for clean RAG ingestion.

💼 Job boards & aggregators

Ingest from any Lever-powered career page into your job feed with one input. Multi-site batching and EU instance support cover global employers.

🏢 Competitive sales intelligence

Headcount growth, new team formation, geographic expansion, comp shifts — all visible from public postings. Lever's createdAt field gives you precise hiring velocity.


A non-exhaustive snapshot of well-known Lever-powered career pages (verify the exact site name before scraping):

Tech: Netflix, Spotify, Shopify, Mixpanel, Segment, Quora, Twitch (historic), Lyft, Discord, KKR, Lattice

Consumer / digital health: Lyra Health, LifeStance Health, Vohra Physicians

Fintech / banking: SEB (EU instance), Outgo

Education / EdTech: Top Hat (mentioned in their own postings)

Consulting / services: CI&T, KPMG (example listed in Lever's docs)

Job aggregators powered by Lever: Jobgether

💡 Tip: To find a company's Lever site name, open their career page. If the URL is https://jobs.lever.co/SITENAME, that's your input. EU customers will have https://jobs.eu.lever.co/SITENAME — set instance to eu.


Recipes

Recipe 1 — Daily remote-job feed across multiple employers

{
"mode": "jobs",
"sites": ["lyrahealth", "mixpanel", "segment", "quora"],
"filterWorkplaceTypes": ["remote", "hybrid"],
"concurrency": 4
}

Schedule daily, push to your downstream warehouse.

Recipe 2 — Engineering roles >= $150K in the US

{
"mode": "jobs",
"sites": ["netflix-jobs", "shopify"],
"team": ["Engineering"],
"filterCountries": ["US"],
"filterSalaryMin": 150000
}

Server-side team filter + client-side country and salary filters.

Recipe 3 — Refresh tracked job UUIDs

{
"mode": "jobDetail",
"sites": ["leverdemo"],
"jobIds": ["33538a2f-d27d-4a96-8f05-fa4b0e4d940e", "1897fca1-502e-4511-b279-de479e99fbea"]
}

Detect when a posting is removed (returns 404, the actor logs it and continues) — feeds into a "job closed" signal.

Recipe 4 — EU-only employer

{
"mode": "jobs",
"sites": ["seb"],
"instance": "eu",
"concurrency": 1
}

The instance toggle swaps the base URL to api.eu.lever.co — same schema.

Recipe 5 — Cap output for testing

{
"mode": "jobs",
"sites": ["bigemployer"],
"limit": 10,
"maxResultsPerSite": 5
}

limit is Lever's native server-side cap; maxResultsPerSite is the actor's hard local cap after filtering.


Output format

Each posting is a flat, normalized record. Sample (truncated):

{
"_mode": "jobs",
"site": "leverdemo",
"instance": "global",
"id": "33538a2f-d27d-4a96-8f05-fa4b0e4d940e",
"title": "Senior Software Engineer",
"team": "Engineering",
"department": "Product",
"location": "San Francisco, CA",
"allLocations": ["San Francisco, CA", "Remote - US"],
"commitment": "Full Time",
"level": "Senior",
"country": "US",
"workplaceType": "hybrid",
"createdAt": 1553186035299,
"createdAtIso": "2026-03-21T15:13:55.299Z",
"hostedUrl": "https://jobs.lever.co/leverdemo/33538a2f-...",
"applyUrl": "https://jobs.lever.co/leverdemo/33538a2f-.../apply",
"opening": "<div>Welcome to our team...</div>",
"openingPlain": "Welcome to our team...",
"description": "<div>...</div>",
"descriptionPlain": "About us...",
"descriptionBody": "<div>Main role description...</div>",
"descriptionBodyPlain": "Main role description...",
"additional": "<div>EEO statement...</div>",
"additionalPlain": "EEO statement...",
"fullDescription": "<div>...</div><h3>Qualifications</h3><ul>...</ul>",
"fullDescriptionPlain": "About us... Main role... Qualifications: ...",
"lists": [
{
"text": "Qualifications",
"content": "<li>Bachelor's degree in CS or equivalent</li><li>5+ years of backend experience</li>"
},
{
"text": "Responsibilities",
"content": "<li>Design and ship distributed systems</li><li>Mentor junior engineers</li>"
}
],
"salaryRange": {
"currency": "USD",
"interval": "per-year-salary",
"min": 150000,
"max": 220000
},
"salaryMin": 150000,
"salaryMax": 220000,
"salaryCurrency": "USD",
"salaryInterval": "per-year-salary",
"salaryDescription": "<p>Plus equity and a sign-on bonus.</p>",
"salaryDescriptionPlain": "Plus equity and a sign-on bonus.",
"scrapedAt": "2026-05-13T12:26:29.650Z"
}

Note: Many fields are optional in Lever's schema. salaryRange, workplaceType, country, categories.commitment, categories.location, and categories.department may all be absent depending on how the employer configured their postings. The actor returns null (or an empty array for allLocations / lists) when a field is missing.


Performance & quotas

SetupTime
1 small site (~20 postings)< 1 second
1 medium site (~200 postings)1-2 seconds
10 sites in parallel2-5 seconds
50 sites in parallel (concurrency=10)15-30 seconds

Lever's GET endpoints have no documented rate limit and have proven generous in practice. The actor uses linear backoff on transient errors and 5× backoff on the rare 429 (just in case). Concurrency is capped at 20.


FAQ

Q: Do I need a Lever API key?

No. The Postings API (this actor) is fully public and works without any credentials. Lever has a separate Data API (/v1/) for authenticated CRM-style access — that one is out of scope for this actor.

Q: Are confidential or internal postings exposed?

No. Only postings in the published state are visible via this API — exactly the same postings a candidate would see on the company's Lever-hosted career page. Internal, confidential, draft, and closed postings are completely hidden.

Q: How fresh is the data?

Real-time. Each actor run hits Lever's API directly, no caching layer.

Q: A site returns 404 — what does that mean?

Either the site name is misspelled, or the company is on the other instance (try toggling instance to eu). EU customers (especially European employers) are commonly on api.eu.lever.co instead of the global instance.

Q: How do I find a company's Lever site name?

Visit their career page. The URL https://jobs.lever.co/SITENAME or https://jobs.eu.lever.co/SITENAME reveals it. The site name is case-sensitive.

Q: What's the difference between description and descriptionBody?

  • description = opening + body (combined)
  • descriptionBody = body only, without the intro paragraph
  • opening = just the intro paragraph (often the company boilerplate)
  • additional = closing content (EEO statement, equal opportunity disclaimers)
  • fullDescription = the actor's convenience concatenation of all sections + structured lists

Each has a *Plain text-only variant.

Q: Why are the HTML fields not entity-encoded?

Lever returns content already HTML-decoded — <div> is <div>, not &lt;div&gt;. This is a Lever-specific behavior and differs from Greenhouse. No decoding needed on your end.

Q: Can I filter by salary or workplace type on the server?

No. Lever's server-side filters are only team, department, location, commitment, level. Workplace type, country, and salary filters are client-side (the actor applies them after fetching).

Q: How is commitment different from workplaceType?

  • commitment = employment type (Full Time, Part Time, Internship, Contract) — set by the employer
  • workplaceType = work environment (on-site, remote, hybrid, unspecified) — Lever's enum

Q: How is the actor priced?

Pay per result. See the Pricing tab on this actor's Apify Store page for current rates per mode.

Q: Does this actor support the XML or HTML modes?

No — JSON only. XML and HTML output modes are designed for embedding on a company's own career page and aren't useful for data pipelines.


This actor is part of a family of ATS scrapers covering modern tech employers:

💡 Tip: Combine Lever + Greenhouse coverage to capture ~70% of the modern tech employer hiring graph.


Changelog

1.0 — Initial release

  • 2 modes: jobs, jobDetail
  • Global + EU instance support
  • All 5 server-side filters (team, department, location, commitment, level)
  • 4 client-side filters (titleKeywords, workplaceTypes, countries, salaryMin)
  • Lever-native skip, limit, group pass-through
  • Flat normalized output with structured lists[], salary, and full content
  • Concurrent multi-site fetching (up to 20 parallel)
  • 404-aware retry with 5× backoff on 429

Support

Issues, edge cases, or feature requests? Use the Apify actor page's Issues tab. Pull requests welcome via GitHub if the source repository is opened.