# Greenhouse Jobs Scraper — No Actor Fee (`samvelkarapetyan/greenhouse-jobs-scraper`) Actor

No Actor fee. Apify platform usage charges apply. Export open jobs from Greenhouse company career pages to JSON or CSV. Get titles, locations, departments, full descriptions and application links. Add company board URLs and run—no coding or Greenhouse account needed.

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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 Greenhouse company career pages to JSON or CSV. Add company board URLs and get job titles, locations, departments, full descriptions and application links—no coding needed.

Useful for recruiters, job board operators and anyone researching hiring trends. No Greenhouse account, Greenhouse API key or proxy is needed. You need an Apify account to run the Actor.

### Start in three steps

1. Click **Try for free** and add a company board URL, for example `https://job-boards.greenhouse.io/webflow`.
2. Set **Maximum jobs** (try **5** first), then click **Start** or **Save & Start**.
3. When the run finishes, open **Output** to view jobs. Click **Export** and choose **JSON** or **CSV**.

### Which links can I use?

Use the company's **full list of jobs**, such as:

- `https://job-boards.greenhouse.io/webflow`
- `https://boards.greenhouse.io/airbnb`

To find one, open a company's Careers page and follow its link to all open positions. If the address starts with one of the two Greenhouse domains above and ends with the company identifier, copy it.

Individual job links such as `https://job-boards.greenhouse.io/webflow/jobs/123` and custom company domains are not accepted. If the company only shows a custom careers address, you will need its Greenhouse board URL.

### Input

| Field in the form | What to enter | Default |
| --- | --- | --- |
| Company board URLs (`boardUrls`) | 1–20 supported company board URLs | Required |
| Maximum jobs (`maxItems`) | Total number of jobs to save, from 1 to 5,000 | 100 |

**Maximum jobs applies to all companies combined.** For example, with a limit of 5, the run saves at most 5 jobs in total. Companies are processed in your input order, so later companies may not be reached.

Repeated links to the same company are handled once. A trailing slash or query parameters do not affect the company selection.

For the JSON input editor or API:

```json
{
  "boardUrls": [
    "https://job-boards.greenhouse.io/webflow",
    "https://boards.greenhouse.io/airbnb"
  ],
  "maxItems": 100
}
```

### What will I get?

Each job becomes one row in the results. Example below is illustrative, not a live vacancy.

| Job title | Company board | Location | Department |
| --- | --- | --- | --- |
| Software Engineer | example | London | Engineering |

Each row also includes the full description and the original job link, where you can view the vacancy or apply.

| Output field | Meaning |
| --- | --- |
| `title`, `location` | Job title and location as provided by the source |
| `departments`, `offices` | Lists of department and office names |
| `descriptionText` | Readable description, convenient for spreadsheets |
| `descriptionHtml` | Description with HTML formatting |
| `jobUrl` | Original job or application page |
| `boardToken`, `id` | Company board identifier and job ID |
| `updatedAt` | Source's last update time—**not the publication date** |
| `scrapedAt` | Time the job was collected, in UTC |

Missing text values are `null`; missing lists are `[]`. Descriptions stay in their original language. Duplicate jobs from the same board are removed within each run. Source HTML is not sanitized for embedding in a website.

### Pricing

There is **no separate Actor fee**. Apify platform usage charges can still apply, which is why the Store may show **Pay per usage**. Check the run's cost in Console. Start with 5 jobs to try it with a small result set; this is not a guaranteed spending cap.

### Frequently asked questions

#### Why did I get zero jobs?

A valid company board may currently have no open positions. Check the board in your browser. If the run failed, check its Log for an invalid link, a board that was not found, or a temporary source error.

#### What if one company fails?

The Actor continues with the other companies and keeps their results. A warning appears in the Log. For details, open the run's **Storage**, then its default **Key-value store**, and view `RUN_SUMMARY`. It lists successful, failed and skipped boards and the number of saved jobs. If every attempted board fails, the run is marked **Failed**.

#### Can I run it automatically?

Yes. Save your input as an Apify task, then add it to a Schedule with your preferred frequency and timezone. Each run creates a separate set of results and may incur platform charges. A schedule does not automatically compare results or identify new and closed jobs.

#### Does it search for companies or filter jobs?

No. Provide the company board URLs yourself. This version collects jobs in source order; it does not filter by keywords, infer salaries or remote status, or submit applications.

#### Where can I get help?

Open the Actor's **Issues** tab and describe the problem. Include the board URL and any error message, but never share your Apify API token.

### Use through the API

The Actor's **API** tab provides integration examples. For Python, install `apify-client` and set your Apify token in the `APIFY_TOKEN` environment variable.

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("samvelkarapetyan/greenhouse-jobs-scraper").call(
    run_input={
        "boardUrls": ["https://job-boards.greenhouse.io/webflow"],
        "maxItems": 5,
    },
)
if run["status"] != "SUCCEEDED":
    raise RuntimeError(f"Actor run status: {run['status']}")
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job)
```

Uses the official public [Greenhouse Job Board API](https://docs.greenhouse.io/job-board.html). This Actor is not affiliated with Greenhouse.

# Actor input Schema

## `boardUrls` (type: `array`):

1–20 Greenhouse company board URLs. Individual job links and custom domains are not supported.

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

Total unique jobs across all boards, processed in input order.

## Actor input object example

```json
{
  "boardUrls": [
    "https://job-boards.greenhouse.io/webflow"
  ],
  "maxItems": 100
}
```

# Actor output Schema

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

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

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

```

## MCP server setup

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