# Greenhouse Jobs Scraper (`piotrv1001/greenhouse-jobs-scraper`) Actor

Scrape every open job from any company's Greenhouse job board: title, department, office locations, remote or hybrid, posting and update dates, salary range, requisition ID and the full job description in HTML and text. Many companies per run, keyword, location and date filters. Export JSON or CSV.

- **URL**: https://apify.com/piotrv1001/greenhouse-jobs-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 🚀 Greenhouse Jobs Scraper: Every Job from Any Greenhouse Job Board

Get every open job from any company's **Greenhouse job board** as clean JSON, CSV or Excel: **title, department, office locations, remote or hybrid, posting and update dates, salary range, requisition ID and the full job description** in HTML and plain text. The **Greenhouse Jobs Scraper** reads `job-boards.greenhouse.io` and `boards.greenhouse.io` boards for as many companies as you like in one run. Use it as a Greenhouse jobs API for job boards, recruiting tools, hiring-signal and salary data.

### 🎯 Use Cases

- **Job board aggregation**: pull Greenhouse jobs from hundreds of tech companies into your own job site or newsletter, with full descriptions.
- **Salary data**: most US Greenhouse boards publish a pay range; `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryPeriod` come parsed and ready to chart.
- **Hiring signals for sales**: see which companies are hiring for which teams and locations, and when each job was first published.
- **Recruiting and sourcing**: watch competitors' Greenhouse careers pages for new roles every day.
- **Market research**: count open roles by department, office and remote policy across a list of companies.

### ✨ Features

- **Whole board at once**: every open job of a company, not just the first page.
- **Salary range**: parsed from the board's pay-range block or from the description when the company states one.
- **Full description**: HTML as published, plus clean text with line breaks.
- **Structured extras**: departments and offices with IDs, the board's custom fields (`metadata`), internal job ID, language and application deadline.
- **Any input format**: a board token (`figma`), a board link (`job-boards.greenhouse.io/figma`, `boards.greenhouse.io/figma`, embed links) or a careers page that embeds a Greenhouse board.
- **Same columns as our other job board scrapers**: Greenhouse, Workday, Lever, Ashby and SmartRecruiters rows share one format, so you can merge them into one table.
- **No duplicates**: a company entered twice is scraped once, and every job is saved once.

### 🛠️ How It Works

1. **Paste companies**: Board tokens (`figma`), board links (`https://job-boards.greenhouse.io/figma`) or a careers page that embeds a Greenhouse board, one per line.
2. **Add filters** if you want: keyword, location, remote only, posted within N days.
3. **Run the scraper** and download the table, or pull it through the API.

### ⚙️ Input

| Field | What it does |
| --- | --- |
| **Companies** | Board tokens (`figma`), board links (`https://job-boards.greenhouse.io/figma`) or a careers page that embeds a Greenhouse board, one per line. |
| **Keyword** | Only jobs whose title, department or team contains this text. |
| **Location** | Only jobs whose location contains this text (city, country or "Remote"). |
| **Remote jobs only** | Only fully remote jobs. |
| **Posted within (days)** | Only jobs posted in the last N days. |
| **Max jobs per company** | Stop after this many jobs for each company. Default 50. |

```json
{
    "companies": [
        "figma",
        "https://job-boards.greenhouse.io/airbnb",
        "stripe"
    ],
    "keyword": "engineer",
    "location": "United States",
    "postedWithinDays": 30,
    "maxItems": 200
}
```

### 💰 Pricing

Pay only for the jobs you get. No monthly rental.

| Event | Price | What you get |
| --- | --- | --- |
| **Job** | $0.0015 per job ($1.50 per 1,000) | One job with all fields below, including the full description |
| **Actor start** | $0.00005 per run | Charged once when the run starts. |

Examples: 50 jobs = $0.075 · 1,000 jobs = $1.50 · 10,000 jobs = $15. Jobs removed by your filters are not charged.

### 📊 Sample Output Data

```json
{
    "id": "8231416",
    "ats": "greenhouse",
    "jobId": "8231416",
    "requisitionId": "ONE",
    "title": "Associate Principal, Procurement Innovation Supplier Programs",
    "company": "Airbnb",
    "companySlug": "airbnb",
    "url": "https://careers.airbnb.com/positions/8231416?gh_jid=8231416",
    "applyUrl": "https://careers.airbnb.com/positions/8231416?gh_jid=8231416",
    "department": "Financial Planning and Analysis",
    "team": null,
    "location": "United States",
    "locations": [
        "United States"
    ],
    "country": null,
    "workplaceType": "remote",
    "isRemote": true,
    "employmentType": null,
    "postedAt": "2026-09-24T22:17:39.000Z",
    "updatedAt": "2026-09-30T00:00:54.000Z",
    "salaryMin": 102000,
    "salaryMax": 120000,
    "salaryCurrency": "USD",
    "salaryPeriod": "year",
    "salaryText": "$102,000—$120,000 USD",
    "descriptionText": "Airbnb was born in 2007 when two hosts welcomed three guests to their San Francisco home, and has since grown to over 5 million hosts who have welcomed over 2…",
    "descriptionHtml": "<div class=\"content-intro\"><p>…",
    "extras": {
        "internalJobId": 3562002,
        "offices": [
            {
                "id": 63868,
                "name": "United States",
                "location": null
            }
        ],
        "departments": [
            {
                "id": 76,
                "name": "Financial Planning and Analysis"
            }
        ],
        "metadata": {
            "Is this job part of ACC?": false,
            "Workplace Type": "Remote"
        },
        "language": "en",
        "applicationDeadline": null
    },
    "scrapedAt": "2026-10-26T15:26:26.051Z"
}
```

| Field | What it is |
| --- | --- |
| `id`, `jobId`, `requisitionId` | Unique row ID, the job's own ID and the company's requisition/reference number |
| `title`, `company`, `companySlug` | Job title, company name and the board you entered |
| `url`, `applyUrl` | Job page and application link |
| `department`, `team` | As published by the company |
| `location`, `locations`, `country` | All job locations (joined and as a list) and the country |
| `workplaceType`, `isRemote` | `remote`, `hybrid` or `onsite`, and a remote flag |
| `employmentType` | Full-time, part-time, contract, internship… |
| `postedAt`, `updatedAt` | ISO dates |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryText` | Pay range when the company publishes one |
| `descriptionText`, `descriptionHtml` | Full job description |
| `extras` | Fields only this job board has (see below) |

`salaryMin`/`salaryMax` are filled when the company publishes a pay range (66 of 100 jobs in a Figma + Airbnb sample). `extras.metadata` holds the custom fields a company shows on its board, such as "Workplace Type".

### 🔁 Schedule and Integrate

Run it **once a day** with the same companies and **Posted within (days)** = 1 to get only new jobs. Set it up in Apify **Schedules**. Send the results to **Google Sheets**, **Zapier**, **Make**, **n8n**, Slack or a webhook with Apify **integrations**.

### 🤖 Use with AI Agents (MCP)

This Actor works as a tool in Claude, ChatGPT, Cursor and other MCP clients through the Apify MCP server (`https://mcp.apify.com`). An agent can call it with:

```json
{"companies":["figma","stripe"],"keyword":"product manager"}
```

### ❓ FAQ

**Is there a Greenhouse jobs API?** Greenhouse publishes job boards, not a bulk data feed. This Actor works like a Greenhouse job board API: give it board tokens and get every job as structured JSON, with no Greenhouse account or key.

**How do I find a company's Greenhouse board token?** Open the company's careers page and click a job. If the link goes to `job-boards.greenhouse.io/<token>/jobs/…` or carries `gh_jid=`, the company uses Greenhouse and `<token>` is what you paste. You can also paste the board link itself.

**Does it include salary?** Yes, when the company publishes one. Pay-range blocks and sentences like "The base salary range is $X - $Y" are parsed into `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryPeriod`. `salaryText` keeps the original wording.

**How fresh is the data?** Each run reads the live board, so you get the jobs that are open right now. Schedule a daily run to catch new postings.

**Why is `employmentType` empty for some companies?** Greenhouse has no standard employment-type field. It's filled only when the company adds one as a custom field.

**Do I need an account or login?** No. Only public job postings are collected.

### 🔗 Related Scrapers

- [Workday Jobs Scraper](https://apify.com/piotrv1001/workday-jobs-scraper): jobs from any myworkdayjobs.com career site, even with thousands of openings.
- [Lever Jobs Scraper](https://apify.com/piotrv1001/lever-jobs-scraper): every job on any jobs.lever.co board.
- [Ashby Jobs Scraper](https://apify.com/piotrv1001/ashby-jobs-scraper): every job on any Ashby board, with compensation tiers.
- [SmartRecruiters Jobs Scraper](https://apify.com/piotrv1001/smartrecruiters-jobs-scraper): jobs from any company hiring on SmartRecruiters.
- [Workable Jobs Scraper](https://apify.com/piotrv1001/workable-jobs-scraper): search jobs across every employer on Workable.
- [Company Career Page Scraper](https://apify.com/piotrv1001/company-career-page-scraper): start from a company website and find its jobs on any ATS.

# Actor input Schema

## `companies` (type: `array`):

Greenhouse board tokens (e.g. figma), board links (job-boards.greenhouse.io/figma) or a company careers page that embeds a Greenhouse board, one per line.

## `keyword` (type: `string`):

Only jobs whose title, department or team contains this text, e.g. "engineer" or "sales". Leave empty for all jobs.

## `location` (type: `string`):

Only jobs whose location contains this text, e.g. "London", "Germany" or "Remote".

## `remoteOnly` (type: `boolean`):

Only fully remote jobs.

## `postedWithinDays` (type: `integer`):

Only jobs posted in the last N days, e.g. 7. Leave empty for all.

## `maxItems` (type: `integer`):

Stop after this many jobs for each company.

## Actor input object example

```json
{
  "companies": [
    "figma",
    "airbnb"
  ],
  "remoteOnly": false,
  "maxItems": 50
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "companies": [
        "figma",
        "airbnb"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/greenhouse-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "companies": [
        "figma",
        "airbnb",
    ],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/greenhouse-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companies": [
    "figma",
    "airbnb"
  ],
  "maxItems": 50
}' |
apify call piotrv1001/greenhouse-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,piotrv1001/greenhouse-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/3Rs5kiPB5ZwXDtptO/builds/hkWSEmgLJCgmGM6dh/openapi.json
