# Greenhouse Jobs Feed | Public Job Board API (`zinin/greenhouse-jobs-feed`) Actor

Collect published Greenhouse Job Board vacancies from supplied board tokens. One structured job per paid result; free diagnostics for blocked boards.

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

## Pricing

from $1.40 / 1,000 result founds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Feed

Collect published vacancies from public Greenhouse Job Board API endpoints. Enter the board tokens of employers you already track and receive one structured row per valid job. This Actor is for recruiters, job-market analysts, and teams building their own hiring feeds.

### What you get

- Job ID, title, date, source URL, location, department, office, and board token.
- One paid row only when ID, title, and URL are present.
- A free diagnostic for a blocked board or exhausted buyer budget.
- Direct public API access with one request per board, one-second spacing, and no proxy rotation or retries.
- On Apify, schedule runs, monitor them, use the API, and export datasets to JSON, CSV, or Excel.

### How to run it

1. Paste public board tokens into **Greenhouse board tokens**; for example, `airbnb` or `asana`.
2. Set **Maximum jobs** (default 50, maximum 500). Descriptions are off by default.
3. Start the Actor and open the **Jobs** dataset or its `/items` API URL.

### Pricing

The pay-per-event tariff is **$0.002 per valid job** (`result-found`), **$0 per start**, and **$0 per diagnostic**. At that tariff, 100 jobs cost **$0.20**. A row is delivered and charged in one linked dataset write. There is no Actor-specific free quota. Apify's [Free plan](https://apify.com/pricing) lists $5 monthly usage credit (checked 2026-11-01); it may cover eligible usage depending on the account's other runs. The live Actor price must be checked before purchase.

The same-unit Store comparator, [fantastic-jobs/greenhouse-jobs-api](https://apify.com/fantastic-jobs/greenhouse-jobs-api), had 158 users in the past 30 days and charged **$0.002 per job** on the Free tier in an API GET on 2026-11-01. The comparator's event is called `apify-default-dataset-item`; its unit is one job.

The current `result-found` event price is $0.002 per useful row. The following are Actor event charges:

| Useful rows | Actor event charges |
|---:|---:|
| 10 | $0.020 |
| 100 | $0.200 |
| 1,000 | $2.000 |

These examples assume that many valid, billed rows across one or more runs. Input limits and source availability may require several runs. Apify platform compute usage is separate.

### Input

| Field | Required | Purpose |
|---|---|---|
| `boardTokens` | Yes | Public Greenhouse board identifiers, such as airbnb or asana. |
| `maxItems` | No | Maximum number of published jobs to return across the supplied boards. |
| `includeDescription` | No | Include a sanitized version of each public job description. |
| `proxyConfiguration` | No | Not used by this direct public API actor. |

```json
{
  "boardTokens": [
    "airbnb",
    "asana"
  ]
}
```

### Output

This row comes from a successful Actor run completed 2026-11-01T16:04:47.438Z. Values are copied from its dataset.

```json
{
  "id": "8306554",
  "title": "AirCover Specialist, Claims Experience",
  "absoluteUrl": "https://careers.airbnb.com/positions/8306554?gh_jid=8306554",
  "location": "Canada",
  "boardToken": "airbnb",
  "companyName": "airbnb"
}
```

| Field | Meaning |
|---|---|
| `id` | Public source identifier for this result. |
| `title` | Published job title. |
| `absoluteUrl` | Link to the source job posting. |
| `location` | Public job location. |
| `boardToken` | Supplied public board token. |
| `companyName` | Employer name supplied by the public source. |

### Other tools we built

#### Related tools

Related tools for adjacent workflows in jobs and hiring.

| Actor | What it does |
|---|---|
| [Ashby Jobs Feed | Public Posting API](https://apify.com/zinin/ashby-jobs-feed) | Pair it in the jobs and hiring workflow: Collect published Ashby jobs from supplied board names |
| [Lever Jobs Feed | Public Postings API](https://apify.com/zinin/lever-jobs-feed) | Pair it in the jobs and hiring workflow: Collect published Lever jobs from company boards |
| [SmartRecruiters Jobs Feed | Public Posting API](https://apify.com/zinin/smartrecruiters-jobs-feed) | Pair it in the jobs and hiring workflow: Collect published SmartRecruiters jobs from company identifiers |
| [Recruitee Jobs Feed | Public Career Offers](https://apify.com/zinin/recruitee-jobs-feed) | Pair it in the jobs and hiring workflow: Collect public Recruitee career offers from company subdomains |
| [Teamtailor Jobs Feed | Public Career Sites](https://apify.com/zinin/teamtailor-jobs-feed) | Pair it in the jobs and hiring workflow: Extract job titles, locations, dates and URLs from supplied public Teamtailor career sites |

### FAQ / Limitations

**Will it find every company?** No. Supply exact board tokens. A board can remove jobs, change fields, or return no rows.

**What about blocked requests?** HTTP 403/429 produces a free diagnostic and an honestly failed run. The Actor does not retry, solve challenges, rotate IPs, or visit application forms.

**Does this include candidate data?** No. It reads public Job Board GET endpoints and never calls the application POST endpoint. Descriptions are off by default; if enabled, common email, phone, and named-contact patterns are removed, but arbitrary prose may still require your own review before redistribution.

**Source access and rights.** The [Greenhouse Job Board API documentation](https://docs.greenhouse.io/job-board.html) states: “Job Board data is publicly available, so authentication is not required for any GET endpoints.” (checked 2026-11-01). The [Greenhouse MSA, API fair use clause](https://www.greenhouse.com/master-subscription-agreement) describes usage that is “excessive, abusive, or negatively impacts, degrades, or impairs the Greenhouse API’s or platform’s availability, reliability, or performance.” (checked 2026-11-01). The MSA addresses Greenhouse customers and does not establish a third-party redistribution license for employer job text. Respect each employer's terms and use the source URLs for attribution.

Report source changes or bugs through the Actor's issue page.

# Changelog

This Actor's version history is a separate document: https://apify.com/zinin/greenhouse-jobs-feed/changelog.md

# Actor input Schema

## `boardTokens` (type: `array`):

Public Greenhouse board identifiers, such as airbnb or asana.

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

Maximum number of published jobs to return across the supplied boards.

## `includeDescription` (type: `boolean`):

Include a sanitized version of each public job description.

## `proxyConfiguration` (type: `object`):

Not used by this direct public API actor.

## Actor input object example

```json
{
  "boardTokens": [
    "airbnb",
    "asana"
  ],
  "maxItems": 50,
  "includeDescription": false
}
```

# 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 = {
    "boardTokens": [
        "airbnb",
        "asana"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zinin/greenhouse-jobs-feed").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 = { "boardTokens": [
        "airbnb",
        "asana",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("zinin/greenhouse-jobs-feed").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 '{
  "boardTokens": [
    "airbnb",
    "asana"
  ]
}' |
apify call zinin/greenhouse-jobs-feed --silent --output-dataset

```

## MCP server setup

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

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/U9IvwP8bb3qDOObPc/builds/0XGGQV5MLgkYZWSDu/openapi.json
