Greenhouse Jobs Scraper & API — Salaries + New-Job Alerts avatar

Greenhouse Jobs Scraper & API — Salaries + New-Job Alerts

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Greenhouse Jobs Scraper & API — Salaries + New-Job Alerts

Greenhouse Jobs Scraper & API — Salaries + New-Job Alerts

Get every open job from any Greenhouse board: title, location, department, description and salary ranges. Paste board tokens, URLs or company names/websites (auto-detected) or pick a built-in company list. Filter by keyword, location, remote or date; track new, updated and removed jobs. No login.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

Erwinbooze Ricardo

Erwinbooze Ricardo

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Security

Limited permissions

Share

Greenhouse Jobs Scraper is a Greenhouse jobs scraper and Greenhouse job board API: it extracts every open job from any careers page hosted on Greenhouse (boards.greenhouse.io and job-boards.greenhouse.io), such as Airbnb, Stripe, Discord, Figma or Coinbase. It reads Greenhouse's official public Job Board API - no login, no proxy, no browser. Paste Greenhouse board tokens, careers URLs, or just company names and websites (auto-detected), filter by keyword, location, remote and date, and get salary ranges plus new / updated / removed job alerts for scheduled monitoring.

Each job includes title, location, remote flag, departments, offices, publish and update dates, the full description (text or HTML) and structured salary ranges (min, max, currency, period) from Greenhouse pay-transparency data. When a company publishes no structured pay, the salary is parsed from the job text (e.g. "The annual base salary range for this role is $196,000 to $245,000", "£60k–£75k per annum").

What can you use it for?

  • Job boards and aggregators: feed fresh Greenhouse jobs into your site or newsletter.
  • Recruiting and sales intelligence (lead generation): see which companies are hiring, for which teams and where.
  • Salary benchmarking: collect published pay ranges by role, location and company.
  • Hiring alerts: schedule a daily run with change detection and get only new, changed and removed jobs - in Slack, email or any webhook.
  • AI agents and LLM pipelines: call it through the Apify MCP server and get clean JSON with plain-text descriptions.

Features

  • Flexible input: Greenhouse board tokens (airbnb), board and job URLs, or company names / websites with automatic board detection (careers-page links first, then name guesses). If a company is not on Greenhouse but is on another supported ATS, RUN_SUMMARY tells you where.
  • Built-in company lists (companyLists): curated lists such as AI companies, fintech or developer tools, each entry verified to have open jobs on 2026-10-30. Run with zero typing.
  • Many companies in one run, with deduplication: the same board entered twice (token + URL) is scraped once, and duplicate job IDs are dropped. Optional dedupeSimilar also drops identical reposts.
  • Filters: keywords (title or description), locations, departments, remote only, posted within the last N days.
  • Salary ranges with currency and pay period; text parsing as fallback.
  • Change detection: changeType new / updated / removed, changedFields, firstSeenAt, stored in a named key-value store between runs. Or the simpler onlyNewJobs mode.
  • Robust: one wrong or deleted board does not fail the run; each board's status is in RUN_SUMMARY. Respects your maximum cost per run.

Quick start

Paste any of these into the input (JSON tab):

{
"companies": [
"airbnb",
"https://job-boards.greenhouse.io/stripe"
],
"remoteOnly": true,
"maxJobs": 50
}

Company names and websites work too:

{
"companies": [
"stripe.com",
"Discord"
],
"keywords": [
"engineer"
],
"locations": [
"United States",
"Remote"
],
"postedWithinDays": 14
}

A curated list, no typing:

{
"companyLists": [
"fintech"
],
"keywords": [
"engineer"
],
"maxJobs": 100
}

Input

FieldDescription
companiesGreenhouse board tokens, board/job URLs, or company names/websites. Optional if companyLists is set.
companyListsBuilt-in curated company lists (only entries on Greenhouse are used).
autoDetectFind the Greenhouse board for names/websites (default on).
keywords / searchInDescriptionKeep jobs whose title (or description) contains any keyword.
locations / departmentsKeep jobs whose location / department contains any of these strings.
remoteOnly / postedWithinDaysRemote only; published in the last N days (0 = all).
includeDescription / includeDescriptionHtmlDescription as plain text and/or HTML.
includeSalarySalary fields.
changeDetection, changeStoreName, includeUnchanged, includeRemoved, skipFirstRunOutputNew / updated / removed tracking between runs.
onlyNewJobs / monitoringStoreNameSimple mode: only job IDs not seen before.
dedupeSimilarDrop identical reposts (same title, location and description).
maxJobsPerCompany / maxJobsResult limits (0 = no limit).

Output

Each dataset item is one job:

{
"jobId": "8334926",
"title": "Backend Engineer, Profile & Community",
"companyName": "Airbnb",
"boardToken": "airbnb",
"url": "https://careers.airbnb.com/positions/8334926?gh_jid=8334926",
"location": "United States",
"isRemote": true,
"workplaceType": "Remote",
"departments": ["Software Engineering"],
"offices": ["United States"],
"firstPublished": "2026-10-29T15:24:15-04:00",
"updatedAt": "2026-10-29T15:24:15-04:00",
"requisitionId": "ONE",
"salaryMin": 162000,
"salaryMax": 186000,
"salaryCurrency": "USD",
"salaryPeriod": "YEAR",
"salarySource": "pay_transparency",
"salaryRanges": [{ "min": 162000, "max": 186000, "currency": "USD", "title": "Pay Range" }],
"metadata": [{ "name": "Workplace Type", "value": "Remote" }],
"descriptionText": "Airbnb was born in 2007 when two hosts welcomed three guests...",
"scrapedAt": "2026-10-30T06:13:45.639Z"
}

With change detection on, items also have changeType, changedFields and firstSeenAt (removed jobs come as separate changeType: "removed" items). New fields are only added, never renamed, so existing integrations keep working.

You can download results as JSON, CSV, Excel, XML or HTML, or fetch them through the Apify API.

Job alerts and change detection (new / updated / removed)

Turn on changeDetection and schedule the Actor (for example daily in Schedules in Apify Console). Every run is compared with the previous run that used the same companies and filters:

  • changeType: "new" - the job appeared since the last run.
  • changeType: "updated" - the title, location, department, employment type, salary or description changed; changedFields lists which.
  • changeType: "removed" - the job was open last time and is gone now (filled or closed). The item has jobId, title, url, location, firstSeenAt and removedAt.
  • Unchanged jobs are skipped unless you turn on includeUnchanged. Every output job also gets firstSeenAt.

The snapshot lives in a named key-value store (changeStoreName, default greenhouse-jobs-changes), so it survives between runs. Use a different store name per monitor. Turn on skipFirstRunOutput to save the baseline silently on the first run. Change counts per company appear in RUN_SUMMARY. If a result limit (maxJobsPerCompany / maxJobs) cuts the output, the jobs that were not output stay pending and come out as new on the next run, so nothing is missed.

{ "companies": ["airbnb"], "changeDetection": true, "skipFirstRunOutput": true, "changeStoreName": "my-hiring-monitor" }

Prefer something simpler? onlyNewJobs outputs only job IDs not seen before (no updated/removed tracking).

Send changes to Slack, email or a webhook

  • Slack / email: in the Actor's Integrations tab, add the Slack or email integration and trigger it on Run succeeded. Because change-detection runs output only changes, the message is your alert.
  • Webhook (your own endpoint, Zapier "Catch Hook", n8n "Webhook" node, Make "Custom webhook"): add an HTTP webhook for the event ACTOR.RUN.SUCCEEDED. The default payload contains resource.defaultDatasetId; fetch the changes from https://api.apify.com/v2/datasets/<defaultDatasetId>/items?clean=true (add &token=... or an Authorization: Bearer header) and filter by changeType.

Use with AI agents (MCP)

This Actor can be called by AI agents through the Apify MCP server. It runs with limited permissions and pay-per-event pricing, so agents only pay for the results they get. To give Claude, Cursor, VS Code or any MCP client a dedicated tool for it, add this server URL:

https://mcp.apify.com?tools=wowlab/greenhouse-jobs-scraper

The agent can then call it with plain inputs such as {"companies": ["stripe.com"], "keywords": ["engineer"], "maxJobs": 20}. Every input field has a description written for agents, and results come back as clean JSON with plain-text descriptions, ready for RAG, classification or summaries. Set maxJobs (and a max total charge in the call options) to keep agent spend predictable.

Integrations: Make, n8n, Zapier, Google Sheets

  • Make: use the Apify app's Run an Actor module with wowlab/greenhouse-jobs-scraper, then Get Dataset Items.
  • n8n: use the Apify node (Run Actor + Get dataset items), or an HTTP Request node calling POST https://api.apify.com/v2/acts/wowlab~greenhouse-jobs-scraper/run-sync-get-dataset-items.
  • Zapier: use the Apify app (Run Actor action, or Finished Actor Run trigger + Fetch Dataset Items).
  • Google Sheets, Airtable, Slack, email: connect them in the Actor's Integrations tab, or export the dataset as CSV/Excel/JSON.
  • API: POST https://api.apify.com/v2/acts/wowlab~greenhouse-jobs-scraper/run-sync-get-dataset-items with the input as JSON body returns the jobs directly.

Pricing

Pay per result: $1.50 per 1,000 jobs ($0.0015 per job) plus a tiny start fee ($0.00005 per run per GB of memory; the default is 256 MB). No subscription. The Pricing tab shows the current price. Example: 500 jobs cost about $0.75. With change detection, only changed jobs (and removed-job records) are output and charged, so daily monitoring stays cheap. Set maxJobs or a maximum cost per run to cap spend.

How do I find a company's Greenhouse board token?

Open the company's careers page and click a job. If the URL contains greenhouse.io/<token> or gh_jid=, the company uses Greenhouse, and <token> is usually the company name in lowercase (airbnb, stripe, discord). You can paste the full URL, or just the company name or website and let auto-detection find it.

This Actor reads only the public job postings that companies publish on purpose through Greenhouse's official public Job Board API. It collects no personal data and needs no login. You are responsible for how you use the data, so check the terms of the sites you rely on.

FAQ

Why are some salary fields empty? Not every company publishes pay ranges. When none is published or found in the text, the salary fields are null.

A board returns "not found". The board token is wrong, or the company has left Greenhouse. RUN_SUMMARY says so, and if the company has a board on another supported ATS it names it (foundOnOtherAts).

Other ATS platforms? See our Lever Jobs Scraper and Ashby Jobs Scraper, which use the same input and similar output.