Lever Postings API — Tech Jobs, Salaries & ATS Data
Pricing
from $2.00 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 hours ago
Last modified
Categories
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:
| Field | Why it matters |
|---|---|
salaryRange | Structured {currency, interval, min, max} — not buried in description HTML like Greenhouse. Filter, sort, model on it. |
workplaceType | Explicit 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. |
country | ISO 3166-1 alpha-2. Easy multi-country slicing. |
categories.allLocations | Array of all eligible locations for multi-city postings. |
How it compares
| This actor (Lever) | Generic web scrapers | Other Apify Lever actors | |
|---|---|---|---|
| Public Lever API | ✅ Direct | ❌ HTML parsing | Some |
| Server-side filtering | ✅ team/dept/location/commitment/level | ❌ | Limited |
| EU instance support | ✅ Toggle in input | ❌ | Rare |
| Salary parsing | ✅ Structured object | ❌ Regex from text | Limited |
Structured lists[] | ✅ Preserved | ❌ Flattened | Limited |
| Multi-site batch | ✅ Concurrent | Manual loops | Sometimes |
| Workplace type filter | ✅ | ❌ | ❌ |
| No-auth, no-proxy | ✅ | Often proxied | ✅ |
| Maintenance burden | ✅ Stable public API | High (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:
| Filter | Effect |
|---|---|
filterTitleKeywords | Keep postings whose title contains any of these (case-insensitive) |
filterWorkplaceTypes | Keep only chosen workplace types (remote, hybrid, on-site, unspecified) |
filterCountries | Keep only matching ISO country codes |
filterSalaryMin | Keep 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.
Popular companies on Lever
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 havehttps://jobs.eu.lever.co/SITENAME— set instance toeu.
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, andcategories.departmentmay all be absent depending on how the employer configured their postings. The actor returnsnull(or an empty array forallLocations/lists) when a field is missing.
Performance & quotas
| Setup | Time |
|---|---|
| 1 small site (~20 postings) | < 1 second |
| 1 medium site (~200 postings) | 1-2 seconds |
| 10 sites in parallel | 2-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 paragraphopening= 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 <div>. 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 employerworkplaceType= 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.
Related actors — the Tech Career Pages portfolio
This actor is part of a family of ATS scrapers covering modern tech employers:
- Welcome to the Jungle Jobs — European tech ecosystem, Algolia-powered
- Greenhouse Job Board API — Stripe, Airbnb, Anthropic, Mistral AI, Doctolib
- Lever Postings API (this actor) — Netflix, Spotify, Shopify, Mixpanel
- More platforms coming soon
💡 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,grouppass-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.