# Greenhouse Jobs Scraper & API - Public Job Boards (`ahmed.fouaad82/greenhouse-public-jobs`) Actor

Scrape Greenhouse jobs from public company job boards: titles, descriptions, locations, departments, offices and update dates. $1/1,000 saved jobs.

- **URL**: https://apify.com/ahmed.fouaad82/greenhouse-public-jobs.md
- **Developed by:** [Ahmed Fouad](https://apify.com/ahmed.fouaad82) (community)
- **Categories:** Jobs, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 job postings

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 & API - Public Job Boards

Scrape **Greenhouse jobs** (public job postings) from known company job boards for job-board builders, hiring researchers and company-monitoring workflows. Export titles, descriptions, locations, departments and update timestamps using the public Job Board API.

**First 25 saved jobs of every run are free; after that, $1.00 per 1,000 saved jobs.** Each saved public posting is one result; unsuccessful board requests are not result events. The Pricing tab is authoritative. Apify plan allowances and any applicable platform/storage charges are separate.

**Example output** (illustrative abbreviated record, not a captured result):

```json
{"id":"example-job","board":"example","title":"Software Engineer","location":"Remote","departments":["Engineering"]}
```

### What does Greenhouse Jobs Scraper do?

Extract **public Greenhouse job postings** from company board slugs using the [documented public Job Board API](https://developers.greenhouse.io/job-board.html). Collect job titles, descriptions, locations, departments and source update timestamps in one structured dataset. This is not a global job-search service: you must know the company board identifier. It never accesses applications, candidate records, recruiter contacts or authenticated endpoints.

### Why use this Greenhouse jobs API tool?

Use consistent records for a job-search application, company hiring monitor, market research or an AI agent. Combine multiple known boards in one run, filter titles and locations, and use an updated-since watermark. Apify supplies scheduling, API execution, integrations and downloadable datasets. No browser, proxy, account or CAPTCHA service is required. The Actor checks the public API origin's current robots.txt and fails closed on an unavailable robots response.

### What data can it extract?

| Field | Type | Meaning |
|---|---|---|
| id / board | string | Stable job ID and requested board |
| title / url | string | Title and public source/application page |
| location | string or null | Source location label, not inferred geography |
| departments / offices | string\[] | Source organizational labels |
| updatedAt | string or null | Source modification time, not publication date |
| descriptionHtml / descriptionText | string | Decoded source HTML and plain text |
| language / requisitionId | string or null | Source values, when provided |
| scrapedAt | string | Extraction timestamp |

### How to scrape Greenhouse public jobs

1. Find the company's Greenhouse board slug, for example `stripe`.
2. Enter one or more slugs and choose a maximum number of results.
3. Optionally filter title, location or an inclusive ISO updated-since date.
4. Start the run and inspect the dataset and SUMMARY record.

### Input

See the input tab for full configuration options. The default is `{"boards":["stripe"],"maxResults":100}`. Supply up to 20 board slugs, not full URLs. `titleContains` and `locationContains` are case-insensitive substring filters. Empty filter fields disable the filter. `updatedSince` compares source last-update dates; missing dates are excluded when the filter is active. `delayMillis` is bounded to 1–10 seconds between boards. `maxResults` is global across all boards, not per company. The API returns a whole board before local filtering; a low output cap does not limit the source response size. Responses over 20 MB fail safely.

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. Example values below illustrate the schema; they are not claimed live postings:

```json
[{"id":"1234567","board":"example","title":"Software Engineer","location":"Remote","departments":["Engineering"],"updatedAt":"2026-01-01T00:00:00Z"},
 {"id":"1234568","board":"example","title":"Product Engineer","location":"London","departments":["Product"],"updatedAt":"2026-01-02T00:00:00Z"}]
```

The dataset contains 13 fields. SUMMARY reports total results, per-board errors and stop reason. Duplicate board/job IDs are removed within one run. Persisted state supports platform restarts, not cross-run change detection. Downstream consumers should upsert using board and id and overlap their date windows.

### How much will it cost?

**First 25 saved jobs of every run are free; after that, $1.00 per 1,000 jobs.** One result = one job posting saved to your dataset. The exact current price is always shown in the Pricing tab.

### FAQ and limitations

An invalid or removed board can return an error; other boards can still succeed. Zero matching jobs is valid, while zero results with board errors marks the run failed. Closed postings disappear from the current feed; this does not provide historical closed jobs. No retry or evasion occurs on access denial or rate limiting. Respect Greenhouse terms and each employer's content rights.

Descriptions are untrusted HTML: sanitize before browser rendering. Although the Actor does not collect structured personal contacts, employers may put contact information inside public descriptions; users remain responsible for lawful processing and retention. Support: use the Issues tab, and the API tab for programmatic access. Do not assume every source field is populated.

# Actor input Schema

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

Public company board identifiers, e.g. stripe. Not URLs. Up to 20.

## `maxResults` (type: `integer`):

Global result cap across all boards. Matching jobs only. First 25 results of every run are free.

## `titleContains` (type: `string`):

Case-insensitive title substring. Empty means all titles.

## `locationContains` (type: `string`):

Case-insensitive location substring. Empty means all locations.

## `updatedSince` (type: `string`):

Inclusive ISO date/time filter on source updated_at. Empty means no date filter. Not a publication date.

## `delayMillis` (type: `integer`):

Polite pause in milliseconds between company API requests.

## Actor input object example

```json
{
  "boards": [
    "stripe"
  ],
  "maxResults": 10,
  "titleContains": "",
  "locationContains": "",
  "updatedSince": "",
  "delayMillis": 1000
}
```

# Actor output Schema

## `dataset` (type: `string`):

Extracted public jobs

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

Counts, errors and stop reason

# 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"
    ],
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed.fouaad82/greenhouse-public-jobs").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"],
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed.fouaad82/greenhouse-public-jobs").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"
  ],
  "maxResults": 10
}' |
apify call ahmed.fouaad82/greenhouse-public-jobs --silent --output-dataset

```

## MCP server setup

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

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/1OpGBggFb5LajKPc0/builds/EAksqj2iceBGnu99J/openapi.json
