Greenhouse & Lever Job Postings API: New & Closed
Pricing
from $1.20 / 1,000 job rows
Greenhouse & Lever Job Postings API: New & Closed
Live job postings from the official Greenhouse and Lever job-board APIs. Filter by title, location, country, remote, seniority and posted date. Delta mode flags new and closed jobs; closed rows are free. Every company gets a status row, so you never get a silent zero. From $1.20 per 1,000 jobs.
Pricing
from $1.20 / 1,000 job rows
Rating
0.0
(0)
Developer
Marcus
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Security
Limited permissionsShare
What is Greenhouse & Lever Job Postings API: New & Closed?
Greenhouse & Lever Job Postings API reads live job postings from the companies you name that hire with Greenhouse or Lever, through the two official public job-board APIs, and returns each published job that passes your filters, up to maxItems. Use it as a Greenhouse job scraper or a Lever job board API: give it board slugs or board links and get clean job data as JSON, CSV or Excel. The data is public job posts read from each employer's own Greenhouse or Lever job board. Filter by title, location, country, remote and seniority, and switch on deltaMode to get jobs not delivered to you yet plus free closed rows for delivered jobs that left the board. Every company gets a status row, so a typo never looks like zero jobs. No logins, no proxies, no personal data. This Actor is not endorsed by Greenhouse or Lever.
- Live, not a stale index. Each run reads each company's Greenhouse or Lever board at run time, so every row reflects the board as it stood during that run.
- New and closed jobs. Turn on
deltaModeand each run returns jobs this input has not delivered yet, up tomaxItems, plus free closed rows for delivered jobs that have left their board. - Honest status rows. Every company you ask for gets a row in the
hiring_signalsdataset:ok,empty,not_found,unsupported_ats,error,duplicate,invalid_inputorskipped, with open-role counts by function, country and department.
What data do you get?
One row per open job, built from a fixed list of fields. No raw Greenhouse or Lever object is copied through (Greenhouse metadata, requisition IDs, internal IDs, data-compliance and education fields are dropped), and no person's name, email or phone number is output.
| Field | What it holds |
|---|---|
jobId | Stable ID ats:companySlug:postingId, for deduping across runs |
ats, source | greenhouse or lever, and the source label Greenhouse job board or Lever job board |
companySlug, companyName | The board slug and the company name |
title, department, team, function | Job title, the board's own department and team, and a function class (Engineering, Data & AI, Sales and so on) |
locationText, locations, country | Location text from the board, all listed locations, and one ISO country code: Lever's country field first, else the first location that names a country, a US state, a Canadian province or a major city the Actor knows (such as London or Bengaluru). Null when none does |
remote, workplaceType | true, false, or null when the board does not say, plus remote, hybrid or on-site when the board says |
seniority, seniorityInferred | intern, entry, mid, senior, lead or executive, read from the title |
employmentType | Full-time, Part-time, Contract or Intern when the board gives it |
compensation | Pay range (min, max, currency, interval) from Lever's salary field or read from the job text. Greenhouse sends job text only when includeDescription is on, so Greenhouse rows have no pay unless it is on and the text states pay |
postedAt, postedAtSource, daysSincePosted, updatedAt | The board's own dates: Lever createdAt; Greenhouse first_published, or updated_at when a job has no first_published (postedAtSource names which) |
jobUrl, applyUrl, boardUrl | Links back to the job page on the employer's own board (on every row), the apply page and the board |
jobUrlSource | original when jobUrl is the link the board gave for the job; reconstructed when it was rebuilt from the board and job id (only closed Greenhouse rows saved before 30 Oct 2026) |
description | Full job text, only when includeDescription is on, with contact details removed |
changeType, firstSeenAt, lastSeenAt, closedDetectedAt | Only in delta mode: changeType is new or closed; lastSeenAt and closedDetectedAt appear on closed rows only |
fetchedAt | When the row was read |
Example row (real output, 29 Oct 2026):
{"jobId": "greenhouse:stripe:8172487","ats": "greenhouse","source": "Greenhouse job board","companySlug": "stripe","companyName": "Stripe","title": "Abuse Investigator","department": null,"team": null,"function": "Security","locationText": "Dublin","locations": ["Dublin"],"country": "IE","remote": false,"workplaceType": "onsite","seniority": "mid","seniorityInferred": true,"employmentType": null,"compensation": null,"postedAt": "2026-09-03T17:30:34.000Z","postedAtSource": "first_published","updatedAt": "2026-10-29T14:42:09.000Z","daysSincePosted": 56,"applyUrl": "https://stripe.com/jobs/search?gh_jid=8172487","jobUrl": "https://stripe.com/jobs/search?gh_jid=8172487","jobUrlSource": "original","boardUrl": "https://job-boards.greenhouse.io/stripe","atsJobId": "8172487","companyInput": "greenhouse:stripe","fetchedAt": "2026-10-29T22:04:14.020Z"}
How to scrape Greenhouse and Lever jobs
Easiest way to try it: press Start with the prefilled companies (greenhouse:stripe, lever:spotify and lever:palantir). You get up to 100 job rows plus one free status row per company.
- Add board slugs (
spotify,greenhouse:stripe) or board links (https://job-boards.greenhouse.io/stripe,https://jobs.lever.co/spotify) to Companies, or pick a Preset company list (Lever boards) and clear the Companies box. - Set any filters you want, and
maxItemsto cap how many job rows you pay for. - Click Start, then download the dataset as JSON, CSV, Excel or through the Apify API.
Only the boards you name are fetched. A bare slug is checked once on Greenhouse, and on Lever exactly as typed (US, then EU): an unknown slug takes up to 3 requests (1 Greenhouse, 2 Lever). Slugs are never guessed on either platform: type them as they appear in the board link. A company name or domain on its own is not looked up and gets a not_found status row ("board not found, check the slug"). Company websites are never fetched: only the Greenhouse and Lever job board APIs are asked.
From an AI agent: the Actor works through Apify MCP. Every input has a plain description written so an agent can fill it in without guessing.
Job filters
All filters are input fields in this Actor's schema:
titleKeywordsandexcludeTitleKeywords: keep or drop jobs by words in the title. Turn onkeywordsInDescriptionto also match the description (for Greenhouse boards this needsincludeDescription, because Greenhouse sends job text only then).locations: free-text location match, for example London or EMEA.countries: ISO codes such asUSorGB. A job listed in several places is kept if any of its locations matches.remote: include, only or exclude remote jobs. Hybrid counts as not remote.seniority: intern, entry, mid, senior, lead, executive.postedAfter: a date (2026-10-01) or a window (24h,7d,2w).functionsandemploymentTypes: keep only some job functions or contract types.maxJobsPerCompany: cap the rows from any one company.
Filter proof. Every filter has a known true and a known false case in the unit tests (test 48, "filters: every filter has a known true and a known false case"), and each run's RUN_SUMMARY lists filterCounts: for each filter you set, how many jobs it checked, kept and dropped.
Presets
Three ready lists of Lever companies, each slug checked live on 29 Oct 2026. There are no Greenhouse presets: name Greenhouse boards yourself.
ai-data: 8 AI, data and autonomy companiesfintech: 12 fintech companiessoftware: 12 software and SaaS companies
How much does it cost to get job postings?
You pay per job row returned. Status rows and closed-job rows are free.
| Apify plan | Price per 1,000 job rows |
|---|---|
| Free | $1.50 |
| Bronze | $1.50 |
| Silver | $1.35 |
| Gold and above | $1.20 |
Example: 10,000 job rows cost $15.00 on the Free plan, $15.00 on Bronze, $13.50 on Silver and $12.00 on Gold and above. Apify's standard Actor start event also applies. maxItems and your run's maximum cost both stop the run before you go over budget, and includeDescription does not change the price.
Is it free to try?
Yes. Apify's Free plan includes $5 of monthly platform usage, which covers about 3,300 job rows at $1.50 per 1,000. Status rows and closed-job rows are always free.
New and closed jobs (delta mode)
Turn on deltaMode and the Actor keeps a baseline for each input (or each stateKey) and records which jobs it has delivered:
- Matching jobs not delivered yet come back with
changeType: "new"and are charged as normal job rows, up tomaxItemsa run. Jobs over the cap stay waiting and come back on later runs; if more thanmaxItemsjobs open between runs, the extra wait for later runs. - A delivered job that has left its board comes back once with
changeType: "closed"andclosedDetectedAt. These rows are free and do not count towardsmaxItems. A job that closes before it was ever delivered gets no closed row. Lever closed rows are checked against your current filters, apart from the date filter, so a job matched only by its description text gets no closed row. - The first run has no baseline: it saves one and delivers matching open jobs, marked new, capped at
maxItems. - Set
stateKey(for examplemy-watchlist) to keep the same baseline when you change filters.
Safety rules: if a board fails to load, its baseline is kept, so a network error never looks like mass closures. If any board that had jobs suddenly shows 0, the Actor waits for a second run in a row to confirm before reporting closures.
Input and output examples
Input:
{"companies": ["spotify", "https://jobs.lever.co/palantir", "greenhouse:stripe", "https://job-boards.greenhouse.io/airbnb"],"titleKeywords": ["engineer", "data"],"countries": ["US", "GB"],"postedAfter": "30d","deltaMode": true,"stateKey": "my-watchlist","maxItems": 500}
Output: job rows in the default dataset, and one status and hiring-signal row per company in the hiring_signals dataset. A run summary is saved in the key-value store as RUN_SUMMARY. The run never stops silently: when maxItems, your run's maximum cost or a stopped host ends it early, RUN_SUMMARY says so in stopReason (maxItems, chargeLimit or hostStopped) and stopMessage, with rowsSkipped (matching jobs not delivered) and companiesNotScanned, and the same message is written to the run log.
Is it legal?
The data is public job posts read from each employer's own Greenhouse job board or Lever job board, through the two official public APIs. This Actor is not endorsed by Greenhouse or Lever, and Greenhouse does not endorse this Actor.
- Greenhouse: only GET requests to the public Greenhouse Job Board API (
boards-api.greenhouse.io/v1/boards/{slug}/jobs), one request per board per run, with job text only when you turn onincludeDescription. It never calls embed pages, application forms or question sets, and never logs in. - Lever: only Lever's official public postings API (api.lever.co, and api.eu.lever.co for EU boards). Lever's own documentation says published postings "are publicly viewable" and "may be scraped by third parties".
- Polite by design: at most 1 request per second to each host, an honest User-Agent naming this Actor and its Store page, no proxies and no IP or header cycling. On a 429 or 5xx the host is paused with exponential back-off; after 3 failures in a row, or any 403 from Greenhouse, the Actor stops calling that host for the rest of the run.
- Only the boards you name: no crawl of all boards, no slug discovery, and no stored job text. Delta mode keeps one record per job to spot changes: ID, title, posted date, job link and first-seen time on Greenhouse, plus department, team, location, country, function, seniority and type fields on Lever.
- No personal data: output is built from job fields only, and emails, phone numbers and named recruiter contact lines are removed from descriptions.
- Removal: any company, Greenhouse or Lever can ask for removal through the Issues tab on this Actor's Apify Store page, and the slug is blocked within 2 working days.
- No AI training: the output may not be resold or used as an AI-training dataset, and we sell none ourselves. We publish no bulk dump. Lever's job site also signals "ai-train=no".
This is not legal advice.
How it compares
| This Actor | A database-style job API | |
|---|---|---|
| Freshness | Read live from Greenhouse or Lever at run time | As fresh as the last crawl |
| Closed jobs | Free closed rows in delta mode for jobs you were sent | Depends on the provider's crawl schedule |
| Missing companies | Status row says why | Depends on the provider |
| Coverage | Any company you name with a public Greenhouse or Lever board | Whatever the database has indexed |
Integrations
Run it from the Apify API, a schedule, Make, n8n, Zapier or any Apify integration, or from an AI agent through Apify MCP. A daily schedule with deltaMode on returns, each day, jobs not delivered yet (up to maxItems) and free closed rows for delivered jobs that left their board.
FAQ
Is it legal?
It reads only the official public job-board APIs: Greenhouse's Job Board API (GET requests for published jobs, no login) and Lever's postings API, which Lever documents as open to third parties. It sends at most 1 request per second to each host and one Greenhouse request per board per run, and stops a host after 3 failures in a row or any block. It outputs no names, emails or phone numbers; recruiter contact lines are stripped from descriptions. Companies can ask to be removed. Not legal advice.
Does it cover Ashby, Workday or other ATS?
No. It reads Greenhouse and Lever only. Ashby boards return a status row "unsupported_ats", and links to other careers sites such as Workday return "not_found". Nothing is fetched for them and nothing is charged.
Is it made or endorsed by Greenhouse or Lever?
No. It is an independent Actor that reads their public job-board APIs. Greenhouse does not endorse this Actor.
How do I find a company's board slug?
It is the word after job-boards.greenhouse.io/ or jobs.lever.co/ in the careers link. Type it exactly; the Actor does not guess slugs on Greenhouse or Lever, and a company name or domain on its own returns "not_found" (board not found, check the slug).
Why are some Greenhouse rows missing a description or salary?
Greenhouse only sends job text when includeDescription is on, so description keywords and salary read from the text need includeDescription for Greenhouse boards.
What does it cost?
See the price table. Status rows and closed-job rows are free. Apify's Free plan includes $5 of monthly platform usage, which covers about 3,300 job rows at $1.50 per 1,000.
Can I use it from an AI agent?
Yes, through the Apify MCP server or the Apify API. Every input has a plain description written so an agent can fill it in without guessing, and every company gets a status row the agent can read.
Can I use the data to train AI models?
No. The output may not be resold or used as an AI-training dataset, and we publish no bulk dump. Lever's job site also signals "ai-train=no" (https://jobs.lever.co/robots.txt, 29 Oct).
How do I ask for a company to be removed?
Open an issue on this Actor's Issues tab on the Apify Store page with the company and board link. The slug is blocked within 2 working days.
Support
Found a bug or a board that does not load? Open an issue on the Issues tab and include the company slug. We aim to reply to issues within 2 working days. If this Actor saves you time, please leave a review.