# Greenhouse Jobs Scraper — Company Board Export (`datamule/greenhouse-jobs-scraper`) Actor

Export public Greenhouse jobs with descriptions, locations, departments, dates and application links. Filter by job title or location across company boards you supply. $0.40 per 1,000 delivered jobs, no start fee.

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

## Pricing

$0.40 / 1,000 delivered 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

Export open jobs from **company Greenhouse boards you supply** for recruiting research, job-board feeds, hiring-market analysis, or a careers-page archive. Each row contains the job title, description, location, departments, application URL and source timestamps. No login or API key is needed.

**This is not a global jobs index.** It does not discover all companies or provide historical, closed, private or internal openings. Supply a board token such as `stripe`, a `boards.greenhouse.io` / `job-boards.greenhouse.io` company URL, or a documented `boards-api.greenhouse.io/v1/boards/TOKEN/jobs` URL. Job URLs select that job's company board, not just the individual job. Custom company career domains and embedded-board URLs are not supported; extract their Greenhouse token yourself.

### Start with one job

```json
{"boards":["stripe"],"maxJobs":1,"keyword":"","location":""}
```

This explicitly targets Stripe's public board and returns at most **one job total**. No board is silently substituted when input is missing or invalid.

### Several boards and optional filters

```json
{"boards":["stripe","https://job-boards.greenhouse.io/databricks"],"maxJobs":100,"keyword":"engineer","location":""}
```

- `boards`: 1–50 supported board tokens or HTTPS board URLs. Duplicate tokens/URLs resolve to one board.
- `maxJobs`: 1–10,000, default 1. One **global** cap across all boards, in caller order.
- `keyword`: optional case-insensitive substring of the **job title**, not a full-text or regex search.
- `location`: optional case-insensitive substring of the public location name. “Remote” is a text match, not a remote-work guarantee.
- Both filters must match. No filters means all currently available jobs, up to the global cap. Source order is preserved; no guaranteed newest-first sort.

### Output

The dataset overview displays title, company, board, location, departments, link and update time. JSON/CSV/Excel export is available through Apify. Fields: `boardToken`, `jobId`, `title`, `companyName`, `location`, `departments`, `offices`, `descriptionHtml`, `descriptionText`, `jobUrl`, `updatedAt`, `firstPublishedAt`, `requisitionId`, `sourceUrl`, `scrapedAt`. Optional source fields can be null; departments/offices are lists. `scrapedAt` is extraction time, not posting time. Descriptions and external links are untrusted source content; sanitize HTML before rendering it.

### Pricing

The Actor charges **$0.0004 per delivered job** ($0.40 / 1,000), with one `job` event and **no start fee**. Examples: 1 delivered job = $0.0004; 100 = $0.04; 1,000 = $0.40. These are Actor event fees, not a promise about any separately billed Apify services. Consult the live pricing tab for the effective price.

The SDK clips delivered rows to the event budget, and the Actor stops fetching before starting another request when no further job fits. Set Apify's maximum charge to a **positive amount**: a cap below $0.0004 delivers no jobs. Do not use zero as a zero-spend guarantee: the platform may treat zero as unset. Empty results generate no job events; platform resources may still be consumed.

### Source and practical limits

Uses only the [documented public Greenhouse Job Board GET API](https://docs.greenhouse.io/job-board.html), pinned to `https://boards-api.greenhouse.io`. No authentication, applications POST endpoint, proxies, cookies, redirects or access bypass. No individual applicant, resume or application data is requested. Greenhouse is not affiliated with this Actor. Respect applicable source terms, rights and privacy laws; public access does not grant unlimited republication rights.

The API lists a whole company board, not a paginated global database. Small requests retrieve a description-free list plus selected job details; larger requests retrieve descriptions with the board list. Consequently a one-job cap does not limit upstream bytes to one job. Responses above 25 MB fail safely. The default runtime is 128 MB / 180 seconds; unusually large boards may need 256 MB. A missing board, malformed data, non-2xx HTTP response, redirect or network failure fails the run instead of quietly producing sample data. Earlier delivered rows may remain if a later board fails. Zero matching jobs on a valid board is a successful empty result.

Duplicates are suppressed by board token + job ID within a run and its durable resume. Separate runs intentionally produce fresh snapshots. On resume, durable rows are compared against restored charged-event counts. Unreadable, duplicated or inconsistent history fails closed rather than charging twice. Dataset writes and charge API calls are not transactional: an interrupted write/charge sequence can leave an orphan row and requires investigation, not automatic rebilling. One compact `SUMMARY` record reports source requests, board sizes, delivered counts and why extraction stopped.

# Actor input Schema

## `boards` (type: `array`):

Explicit company boards only; no global discovery or fallback board.

## `maxJobs` (type: `integer`):

Global cap across all supplied boards. Start cheaply with one job.

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

Optional case-insensitive title substring, not description search.

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

Optional case-insensitive location substring.

## Actor input object example

```json
{
  "boards": [
    "stripe"
  ],
  "maxJobs": 1
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "boards": [
        "stripe"
    ],
    "keyword": "",
    "location": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("datamule/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 = {
    "boards": ["stripe"],
    "keyword": "",
    "location": "",
}

# Run the Actor and wait for it to finish
run = client.actor("datamule/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 '{
  "boards": [
    "stripe"
  ],
  "keyword": "",
  "location": ""
}' |
apify call datamule/greenhouse-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datamule/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/fiSzhhmj0usWeENmj/builds/RCH0J4XLCSTs6j2ff/openapi.json
