> ## Documentation Index
> Fetch the complete documentation index at: https://rocketyard.dev/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> These Actors run on the Apify platform and charge per result. Call one with POST https://api.apify.com/v2/acts/rocketyard~<actor-id>/run-sync-get-dataset-items and the header Authorization: Bearer <APIFY_TOKEN>, or connect Apify's MCP server at https://mcp.apify.com?tools=rocketyard/<actor-id>.

# Export all open jobs from a Greenhouse board to CSV or JSON

> Three ways to export every open job from a Greenhouse job board to CSV or JSON: the free API with curl and jq, a REST call, or no code at all.

Every company on Greenhouse has a public job board, and Greenhouse publishes the same list through a free job board API. Here are three ways to get all open jobs into a file, from the most work to the least. The `curl` and `jq` commands were run as written on 2026-11-05 against Discord's board, which had 27 open jobs that day.

| | Free API with curl and jq | Greenhouse Jobs API & Scraper over REST | Greenhouse Jobs API & Scraper without code |
| - | - | - | - |
| **Cost** | Free | \$1.00 per 1,000 jobs | \$1.00 per 1,000 jobs |
| **You need** | curl, jq and somewhere to run them | An Apify API token | An Apify account |
| **Several boards at once** | Write a loop | Built in | Built in |
| **Salary columns and plain-text descriptions** | Write the mapping | Included | Included |

## Find the board name

Open the company's careers page and click a job. If the address starts with `job-boards.greenhouse.io/discord` or `boards.greenhouse.io/discord`, then `discord` is the board name. If the careers page stays on the company's own domain, look for `gh_jid=` in the job's address, or for `boards.greenhouse.io/embed/job_board?for=discord` in the page source.

To test a name, this prints `200` for a real board and `404` otherwise:

```bash theme={null}
curl -s -o /dev/null -w "%{http_code}\n" "https://boards-api.greenhouse.io/v1/boards/discord/jobs"
```

## Option 1: the free Greenhouse job board API

No key or account is needed. This saves the full response as JSON and prints how many jobs it holds:

```bash theme={null}
curl -s "https://boards-api.greenhouse.io/v1/boards/discord/jobs?content=true&pay_transparency=true" -o discord.json
jq '.meta.total' discord.json
```

This turns it into a CSV with one row per job:

```bash theme={null}
jq -r '["id","title","location","department","updated_at","url"], (.jobs[] | [.id, .title, .location.name, ([.departments[].name] | join("; ")), .updated_at, .absolute_url]) | @csv' discord.json > discord.csv
```

For one board you read once, that may be all you need. The raw response leaves the rest to you:

* **Parameters decide what you get.** Without `content=true` there are no descriptions or departments. Without `pay_transparency=true` there are no pay ranges.
* **Pay ranges are in cents**: `min_cents` of `20000000` is \$200,000, under `pay_input_ranges`.
* **Descriptions are escaped HTML** (`&lt;p&gt;`), so they need decoding and stripping before they are readable.
* **One board per request**, so several companies mean a loop, retries and handling for boards that don't exist.

## Option 2: one REST call, several boards

[Greenhouse Jobs API & Scraper](https://rocketyard.dev/greenhouse-jobs-scraper.md) works as a Greenhouse jobs API. One request runs it, waits and returns the file:

```bash theme={null}
curl -s -X POST "https://api.apify.com/v2/acts/rocketyard~greenhouse-jobs-scraper/run-sync-get-dataset-items?format=csv" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'content-type: application/json' \
  -d '{"companies":["discord","figma"]}' \
  -o jobs.csv
```

* Use `format=json` or `format=xlsx` for JSON or Excel.
* Add `&fields=title,company,location,salaryMin,salaryMax,salaryCurrency,url` to keep only those columns.
* Add `"keyword":"engineer"` or `"location":"London"` to the input to keep only matching jobs. Jobs you filter out aren't charged.
* A name without a public board adds one free error item to the results and the other boards carry on.
* The request waits up to 300 seconds. For larger runs, start the run with `POST /runs` and read the dataset when it finishes.

Records carry salary as `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryUnit`, and the description as plain text. The same fields come back from the [Lever](https://rocketyard.dev/lever-jobs-scraper.md) and [Ashby](https://rocketyard.dev/ashby-jobs-scraper.md) Actors. [Which fields each platform fills](https://rocketyard.dev/greenhouse-vs-lever-vs-ashby-job-board-api.md).

## Option 3: no code

1. Open [Greenhouse Jobs API & Scraper on Apify](https://apify.com/rocketyard/greenhouse-jobs-scraper) and click **Try for free**.
2. Add `discord` to **Job board names**, or paste the board's address into **Job board URLs**.
3. Click **Start**.
4. When the run finishes, export the results as CSV, Excel or JSON from the run's output.

## What it costs

The API is free. The Actor charges $1.00 per 1,000 jobs plus a small start fee per run, with no subscription. At that price, exporting Discord's 27 jobs costs $0.03 and Databricks's 926 jobs cost $0.93. Apify's Free plan includes $5 of usage a month, with no credit card.

> [card] [Run Greenhouse Jobs API & Scraper on Apify](https://apify.com/rocketyard/greenhouse-jobs-scraper)
>
> \$1.00 per 1,000 jobs, no subscription. You run it with your own Apify account.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.