# Greenhouse Job Scraper (`vortex_data/greenhouse`) Actor

💰$1/1K result💰 Extract live Greenhouse job postings from company career pages. Get clean, structured job data with titles, locations, departments, requirements, benefits, compensation, application questions, and direct posting links.

- **URL**: https://apify.com/vortex\_data/greenhouse.md
- **Developed by:** [VortexData](https://apify.com/vortex_data) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 4 total users, 0 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 results

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Greenhouse Job Scraper

Scrape live Greenhouse job boards and export clean, structured job data.

This Actor is built for teams that need current Greenhouse postings for job boards, recruiting tools, hiring intelligence, AI agents, and market research. Add one or more company career URLs, choose optional filters, and get normalized jobs with descriptions, requirements, benefits, compensation signals, application details, and clean source fields.

### Highlights

- Scrapes live Greenhouse job boards directly from public company career pages.
- Accepts common Greenhouse job board and embedded career page URLs.
- Fetches job details, including application questions and pay transparency fields when available.
- Filters jobs by title, location, department, organization, description, remote status, workplace type, employment type, seniority, and posting date.
- Extracts structured requirements, responsibilities, benefits, skills, compensation, application details, and source fields.
- Uses clear canonical fields without duplicate URL/date/description columns or raw Greenhouse object noise.
- Provides direct links to view jobs, download CSV, and inspect run totals.

### Quick Start

Use this minimal input to scrape all current jobs from a Greenhouse board:

```json
{
  "urls": [
    {
      "url": "https://job-boards.greenhouse.io/webflow"
    }
  ]
}
```

Use filters to collect a focused feed:

```json
{
  "urls": [
    {
      "url": "https://job-boards.greenhouse.io/webflow"
    }
  ],
  "titleSearch": ["Software Engineer"],
  "locationSearch": ["Remote"],
  "workplaceTypes": ["remote", "hybrid"],
  "experienceLevels": ["senior"],
  "postedAfter": "7 days ago",
  "maxItems": 100
}
```

### Input

The input contains only scraping and filtering options.

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `urls` | array | required | Greenhouse job board URLs to scrape. |
| `includeQuestions` | boolean | `true` | Include application questions when available. |
| `includePayTransparency` | boolean | `true` | Include Greenhouse pay transparency fields when available. |
| `descriptionType` | string | `both` | Keep `both`, `text`, or `html` descriptions. |
| `titleSearch` / `titleExclusionSearch` | array | none | Include or exclude jobs by title. Supports prefix matching with `:*`, for example `Soft:*`. |
| `locationSearch` / `locationExclusionSearch` | array | none | Include or exclude jobs by normalized location text. |
| `departmentSearch` / `departmentExclusionSearch` | array | none | Include or exclude jobs by department. |
| `organizationSearch` / `organizationExclusionSearch` | array | none | Include or exclude jobs by derived organization name. |
| `descriptionSearch` / `descriptionExclusionSearch` | array | none | Include or exclude jobs by plain-text description. |
| `remoteOnly` | boolean | `false` | Keep only jobs inferred as remote. |
| `workplaceTypes` | array | none | Filter by `remote`, `hybrid`, or `onsite`. |
| `employmentTypes` | array | none | Filter by `full_time`, `part_time`, `contract`, `internship`, `freelance`, or `temporary`. |
| `experienceLevels` | array | none | Filter by `intern`, `entry`, `mid`, `senior`, `lead`, or `executive`. |
| `postedAfter` | string | none | Keep jobs posted or updated after an ISO date or relative value such as `yesterday`, `7 days ago`, or `last week`. |
| `maxItems` | integer | `0` | Maximum jobs to save after filters are applied. Use `0` for all matching jobs. |

### Output

After each run, open the Output tab to view scraped jobs, download a CSV file, or check the run summary. You can also export results from Apify in JSON, CSV, Excel, XML, HTML, or RSS.

Example result:

```json
{
  "id": 7905976,
  "title": "Associate General Counsel, Privacy & Product",
  "normalized_title": "associate_general_counsel_privacy_product",
  "organization": "Webflow",
  "department": "Legal",
  "location": "U.K. Remote; U.S. Remote",
  "locations": ["U.K. Remote; U.S. Remote", "International Remote", "U.S. Remote"],
  "workplace_type": "remote",
  "experience_level": null,
  "summary": "We're looking for an Associate General Counsel, Privacy & Product to help us scale Webflow's privacy, product, and AI legal strategy.",
  "description": "At Webflow, our mission is to bring development superpowers to everyone.",
  "descriptionHtml": "<p>At Webflow, our mission is to bring development superpowers to everyone.</p>",
  "requirements": ["Experience advising product and engineering teams"],
  "responsibilities": ["Advise product and engineering teams"],
  "benefits": ["Remote work"],
  "key_skills": ["Python"],
  "compensation": null,
  "applicationQuestionCount": 8,
  "postingUrl": "https://job-boards.greenhouse.io/webflow/jobs/7905976",
  "updatedAt": "2026-05-01T12:00:00.000Z",
  "source": "greenhouse",
  "boardToken": "webflow",
  "scrapedAt": "2026-05-20T10:30:00Z"
}
```

### Data Quality Notes

This Actor keeps the output clean and predictable:

- Core job fields come from live public Greenhouse postings.
- Derived fields such as `workplace_type`, `experience_level`, `responsibilities`, `key_skills`, `qualifications`, and `compensation` are best-effort values parsed from the posting text.
- Dataset items intentionally keep normalized fields such as `department`, `location`, and `locations` instead of repeating raw Greenhouse `departments` and `offices` objects.
- The Actor does not use LinkedIn enrichment, geocoding, or LLM-based extraction. This keeps runs fast, deterministic, and tied to the live Greenhouse source.

### Export And Integration

Use the Output tab when you need a quick download. For automated workflows, schedule the Actor in Apify and send results to your preferred destination with webhooks or Apify integrations.

# Actor input Schema

## `urls` (type: `array`):

One or more public Greenhouse board URLs, for example https://job-boards.greenhouse.io/webflow or https://boards.greenhouse.io/webflow.

## `includeQuestions` (type: `boolean`):

Include application questions from Greenhouse job detail pages.

## `includePayTransparency` (type: `boolean`):

Include Greenhouse pay transparency fields when they are available.

## `descriptionType` (type: `string`):

Choose whether output items keep text descriptions, HTML descriptions, or both.

## `titleSearch` (type: `array`):

Keep jobs whose title contains at least one of these terms. Use :\* for prefix matching, for example Soft:\*.

## `titleExclusionSearch` (type: `array`):

Skip jobs whose title contains any of these terms.

## `locationSearch` (type: `array`):

Keep jobs whose normalized location text contains at least one of these terms.

## `locationExclusionSearch` (type: `array`):

Skip jobs whose normalized location text contains any of these terms.

## `departmentSearch` (type: `array`):

Keep jobs whose primary department contains at least one of these terms.

## `departmentExclusionSearch` (type: `array`):

Skip jobs whose primary department contains any of these terms.

## `organizationSearch` (type: `array`):

Keep jobs whose derived organization name contains at least one of these terms.

## `organizationExclusionSearch` (type: `array`):

Skip jobs whose derived organization name contains any of these terms.

## `descriptionSearch` (type: `array`):

Keep jobs whose plain-text description contains at least one of these terms.

## `descriptionExclusionSearch` (type: `array`):

Skip jobs whose plain-text description contains any of these terms.

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

Keep only jobs inferred as remote from the location, title, or description.

## `workplaceTypes` (type: `array`):

Keep jobs with one of these derived workplace types.

## `employmentTypes` (type: `array`):

Keep jobs with one of these normalized employment types.

## `experienceLevels` (type: `array`):

Keep jobs with one of these derived seniority levels.

## `postedAfter` (type: `string`):

Keep jobs posted or updated after this date. Accepts ISO 8601 or relative values such as yesterday, 7 days ago, or last week.

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

Maximum number of matching jobs to save. Use 0 to save all matching jobs.

## Actor input object example

```json
{
  "urls": [
    {
      "url": "https://job-boards.greenhouse.io/webflow"
    }
  ],
  "includeQuestions": true,
  "includePayTransparency": true,
  "descriptionType": "both",
  "remoteOnly": false,
  "maxItems": 0
}
```

# Actor output Schema

## `jobs` (type: `string`):

Open the scraped jobs table.

## `csv_export` (type: `string`):

Download the scraped jobs as CSV.

## `summary` (type: `string`):

Review totals, filters, duplicates, and per-board counts.

# 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 = {
    "urls": [
        {
            "url": "https://job-boards.greenhouse.io/webflow"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vortex_data/greenhouse").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 = { "urls": [{ "url": "https://job-boards.greenhouse.io/webflow" }] }

# Run the Actor and wait for it to finish
run = client.actor("vortex_data/greenhouse").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 '{
  "urls": [
    {
      "url": "https://job-boards.greenhouse.io/webflow"
    }
  ]
}' |
apify call vortex_data/greenhouse --silent --output-dataset

```

## MCP server setup

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

```

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/B61djXJQrkx8yU5r6/builds/NaOWfeQUt2AXhSHAQ/openapi.json
