Greenhouse Jobs Scraper & API (+ Lever, Ashby, Workable) avatar

Greenhouse Jobs Scraper & API (+ Lever, Ashby, Workable)

Pricing

$1.50 / 1,000 job results

Go to Apify Store
Greenhouse Jobs Scraper & API (+ Lever, Ashby, Workable)

Greenhouse Jobs Scraper & API (+ Lever, Ashby, Workable)

Greenhouse jobs from any company's Greenhouse job board, plus Lever, Ashby, Workable and SmartRecruiters. Output: normalized job listings with location, remote flag, department, salary and apply link. $1.50 per 1,000 jobs. Keyword, location and remote filters, new-job monitoring.

Pricing

$1.50 / 1,000 job results

Rating

0.0

(0)

Developer

Winters Works

Winters Works

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 hours ago

Last modified

Share

Greenhouse Jobs Scraper & API (+ Lever, Ashby, Workable, SmartRecruiters)

Greenhouse jobs, pay per result: $1.50 per 1,000 jobs. Try it on the Apify Free plan: the $5 monthly credit covers about 3,000 jobs.

Pull live Greenhouse jobs from any company's careers page into one clean, flat dataset, plus Lever, Ashby, Workable and SmartRecruiters. Give it company names or careers-page URLs and it returns normalized jobs from Greenhouse, Lever, Ashby, Workable and SmartRecruiters, with keyword, location, remote, department and date filters, salary data where the company publishes it, and a new-jobs-only monitoring mode for scheduled runs.

Keywords: Greenhouse jobs API, Lever jobs API, Ashby job scraper, Workable jobs, SmartRecruiters jobs, company careers page scraper, job listings API, new job alerts, hiring signals.

It uses only the official public job-board APIs that these applicant tracking systems (ATS) publish for embedding careers pages. No login, no proxies, no HTML scraping, no browser. That makes it fast, stable and very cheap.

What you can do with it

  • Job aggregators and job boards: build a feed of direct-from-employer listings with consistent fields across five ATS platforms.
  • Recruiters and sourcers: watch target companies for new roles in a department or location.
  • Sales and market intelligence: hiring is a buying signal. Track which companies are hiring for security, data, DevRel or RevOps roles and reach out while the budget is fresh.
  • Job seekers: monitor the companies you care about and get only the new postings each day.
  • Researchers and analysts: measure hiring trends, pay transparency, remote share and headcount growth by company.

Supported ATS

ATSCareers URL looks likeNotes
Greenhouseboards.greenhouse.io/stripe, job-boards.greenhouse.io/stripePay ranges when published
Leverjobs.lever.co/spotify (also EU)Salary range and workplace type when published
Ashbyjobs.ashbyhq.com/rampCompensation summary and salary range
Workableapply.workable.com/huggingfacePublic widget API
SmartRecruitersjobs.smartrecruiters.com/BoschGroupPublic postings API

Pass a URL and the ATS is detected automatically. Pass a bare slug (like stripe) and the Actor tries every supported ATS and returns whichever has jobs. To force one, write lever:spotify.

Input

FieldDescription
companiesCareers URLs or slugs. Default: stripe, spotify, ramp
keywordWords that must all appear in title, department, team or description
locationText the location must contain, e.g. London
remoteOnlyOnly remote jobs
departmentText the department or team must contain
postedWithinDaysOnly jobs first posted in the last N days
includeDescriptionAdd descriptionText (HTML converted to plain text)
maxResults / maxPerCompanyCaps (newest first). 0 = unlimited
onlyNewReturn only jobs not seen in earlier runs
stateStoreNameNamed key-value store holding seen job IDs

Example, remote data jobs posted this week:

{
"companies": ["https://boards.greenhouse.io/stripe", "ramp", "lever:spotify"],
"keyword": "data engineer",
"remoteOnly": true,
"postedWithinDays": 7,
"maxPerCompany": 0,
"maxResults": 0
}

Output

One flat record per job:

{
"ats": "ashby",
"company": "ramp",
"jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"title": "Security Engineer, Cloud",
"department": "Engineering",
"team": "Backend",
"location": "New York, NY (HQ); Remote (Canada); Remote (US)",
"remote": true,
"employmentType": "FullTime",
"compensation": "$211.4K - $290.6K",
"compensationMin": 211400,
"compensationMax": 290600,
"compensationCurrency": "USD",
"compensationInterval": "year",
"postedAt": "2026-04-07T17:12:35.753Z",
"updatedAt": null,
"applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-.../application",
"scrapedAt": "2026-10-10T12:00:00.000Z"
}

Export as JSON, CSV, Excel or HTML, or read it through the Apify API. Not every ATS provides every field; missing values are null. updatedAt is available on Greenhouse only. The remote flag uses the ATS's own flag where available, otherwise the location and title text.

Scheduling and monitoring for new jobs

  1. Set onlyNew: true and a stateStoreName such as my-fintech-watchlist.
  2. Create a Schedule in Apify (daily or hourly).
  3. Connect a webhook, Zapier, Make or n8n integration to the run's dataset.

The first run returns all matching jobs and records their IDs. Later runs return only postings that are new, so you pay only for new jobs. Use a different stateStoreName for each separate watchlist.

Pricing

EventPricePer 1,000
job-result (one job returned)$0.0015$1.50

Examples: 1,000 jobs = $1.50, 10,000 jobs = $15, 100,000 jobs = $150.

You're never charged for failed or empty lookups, and the run's status message tells you why any input came back short (capped by maxPerCompany/maxResults, board not found, or a board with 0 open jobs).

Filters are applied first, and in onlyNew mode only new jobs count. The Apify Free plan's monthly credit covers thousands of jobs. Set a maximum cost per run and the Actor stops cleanly when it is reached.

Integrations and AI agents (MCP)

Scheduling and webhooks

Run the Actor on an Apify Schedule, for example once a day with your list of target companies, and add a webhook or an email notification for when the run finishes. Set postedWithinDays (say 1 or 7) to pull only recent postings, or use onlyNew with a stateStoreName to get just the jobs you haven't seen before.

Apify platform integrations

These are features of the Apify platform and work with any Actor, this one included: Make, n8n, Zapier, Google Sheets export, Slack notifications, the Apify API, and the official JavaScript and Python clients. Anything that can call the Apify API or receive a webhook (Clay, Airtable, your own backend) can start a run and read the dataset.

MCP for AI agents

Apify's hosted MCP server can expose this Actor as a tool your AI assistant calls directly:

https://mcp.apify.com?actors=wintersworks/ats-job-board-feeds

Example config for Claude Desktop, Cursor or Claude Code (an MCP server entry that takes a URL and headers):

{
"mcpServers": {
"ats-job-board-feeds": {
"url": "https://mcp.apify.com?actors=wintersworks/ats-job-board-feeds",
"headers": {
"Authorization": "Bearer YOUR_APIFY_TOKEN"
}
}
}
}

Then ask things like:

  • "List remote engineering roles posted in the last 7 days at stripe and figma (Greenhouse)."
  • "Which of ramp, spotify and huggingface posted data jobs this week, and which show a salary range?"
  • "Check lever:spotify and the Ashby board for ramp for new security roles in London, and give me the apply links."

Code examples

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("wintersworks/ats-job-board-feeds").call(run_input={
"companies": ["stripe", "ramp", "lever:spotify"],
"keyword": "data engineer",
"remoteOnly": True,
"postedWithinDays": 7,
"maxResults": 100,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
print(job["company"], job["title"], job["applyUrl"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('wintersworks/ats-job-board-feeds').call({
companies: ['stripe', 'ramp', 'lever:spotify'],
department: 'Engineering',
onlyNew: true,
stateStoreName: 'my-watchlist',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, 'new jobs');

FAQ

Is this legal and allowed? It reads only the public job-board endpoints that Greenhouse, Lever, Ashby, Workable and SmartRecruiters offer for embedding careers pages. It does not log in or bypass anything. Job postings are published by the employers. You are responsible for how you use the data, including applicable privacy and marketing laws.

How do I find a company's slug? Open its careers page and look at the apply URL, e.g. jobs.lever.co/spotify means slug spotify. Or paste the careers URL directly.

A company returned nothing. It may use a different ATS (Workday, iCIMS and others are not supported), its slug may differ from its name, or it may have no open roles. Many companies embed a Greenhouse or Ashby board inside their own domain; use the underlying board URL or ats:slug.

Can I get all jobs from an ATS? No. There is no public index of every company; you supply the companies.

Does it work for large employers? Yes. Pagination is handled for SmartRecruiters; tens of thousands of jobs can be fetched with maxResults: 0. Descriptions on SmartRecruiters need one extra request per job, so they are slower.

Are salaries included? When the employer publishes them (common in the US due to pay-transparency laws), they appear in the compensation* fields.

Built by Winters Works. Questions or a missing ATS? open an issue on the Actor page.

Yes, in the sense that it only reads public or official data: the public job-board endpoints of Greenhouse, Lever, Ashby, Workable and SmartRecruiters. It does not log in, bypass paywalls or access private data. You remain responsible for how you use the results, including privacy, copyright and marketing laws. Not affiliated with or endorsed by the data sources.

Quick start and cost

Run it with the prefilled input to see sample output in seconds; the default run costs only a few cents at most. Then adjust the input and schedule it.

Use from code and AI agents

Call it from any language with the Apify API, or let an AI agent find and run it through the Apify MCP server.

from apify_client import ApifyClient
run = ApifyClient("<YOUR_APIFY_TOKEN>").actor("wintersworks/ats-job-board-feeds").call(run_input={"companies": ["stripe", "spotify"], "keyword": "engineer"})
items = ApifyClient("<YOUR_APIFY_TOKEN>").dataset(run["defaultDatasetId"]).list_items().items

Results land in the run's dataset (JSON, CSV, Excel). Set a maximum charge per run in the run options to cap spend.

About

Built and maintained by Winters Works. Questions or feature requests: open an issue on the Actor page or email wintersworks.shop@gmail.com.

More from Winters Works