---
title: "Greenhouse API"
description: "Greenhouse API: the keyless Job Board API at boards-api.greenhouse.io, Harvest API keys, the documentation, and every public board in one call."
canonical: https://jobspipe.dev/sources/greenhouse
date_published: 2026-06-16
date_modified: 2026-09-30
author: Dvir Atias
---

# Greenhouse API

Greenhouse's official Job Board API is public and keyless: GET https://boards-api.greenhouse.io/v1/boards/<board_token>/jobs?content=true returns one company's open jobs as JSON, while the Harvest API needs a key issued inside that customer's account. JobsPipe returns Greenhouse postings from one search endpoint, in the same record shape as the rest of its 30+ sources, so you never need to know a board token. Official documentation: [developers.greenhouse.io/job-board.html](https://developers.greenhouse.io/job-board.html).

> Greenhouse's Job Board API is free and public, one board token at a time. JobsPipe returns postings from every public Greenhouse board through one endpoint, in the same record shape as every other board it covers.

**Canonical URL:** https://jobspipe.dev/sources/greenhouse

## Official Greenhouse API documentation

Greenhouse publishes its API documentation at developers.greenhouse.io. The Job Board API is the public one: GET requests need no key, and each request reads one company's board, named by its board token. The jobs endpoint returns every published job post on that board, and content=true adds each post's full description, departments and offices. The Harvest API is the private API for a customer's own recruiting data.

- Jobs endpoint: `GET https://boards-api.greenhouse.io/v1/boards/{board_token}/jobs`
- Jobs with descriptions, departments and offices: `GET https://boards-api.greenhouse.io/v1/boards/{board_token}/jobs?content=true`
- One job: `GET https://boards-api.greenhouse.io/v1/boards/{board_token}/jobs/{job_id}`
- Departments: `GET https://boards-api.greenhouse.io/v1/boards/{board_token}/departments`
- Offices: `GET https://boards-api.greenhouse.io/v1/boards/{board_token}/offices`

- [Job Board API documentation: developers.greenhouse.io/job-board.html](https://developers.greenhouse.io/job-board.html)
- [Harvest API documentation: developers.greenhouse.io/harvest.html](https://developers.greenhouse.io/harvest.html)
- [Harvest v3 authentication: harvestdocs.greenhouse.io](https://harvestdocs.greenhouse.io/docs/authentication)

## Coverage

- **Sources covered:** Public Greenhouse job boards
- **Freshness:** discovered_at, last_seen_at and verified_at on every record
- **History retention:** Closed postings kept, with closed_at and closed_reason

## Greenhouse exposes a public Job Board API per company: no key needed for reads. Swap in any company's board token (usually their name).

Endpoint: `https://boards-api.greenhouse.io/v1/boards/stripe/jobs?content=true`

```bash
curl "https://boards-api.greenhouse.io/v1/boards/stripe/jobs?content=true"
```

## Why Greenhouse jobs data is confusing

Greenhouse ships two APIs that share a name. The Harvest API is private, key-scoped, and exposes the full ATS surface: candidates, applications, scorecards, scheduled interviews. The Job Board API is public, unauthenticated, and exposes only the openings the customer has chosen to publish. Most developers searching 'Greenhouse API' land on Harvest docs and assume that is the only option, even though Job Board is what they need.

The Job Board endpoint lives at boards-api.greenhouse.io/v1/boards/<board_token>/jobs, but you still need to know each company's board token in advance, and many enterprises either disable the public board, use a vanity careers domain, or embed jobs through Greenhouse's iframe widget. JobsPipe returns Greenhouse postings in the same JSON shape as every other board it covers, with no token to look up.

## Workarounds

### Hit boards-api.greenhouse.io/v1/boards/<token>/jobs

Works when the customer keeps a public board enabled and you already know their token. There is no list endpoint to enumerate Greenhouse customers, and the token list changes every week as companies onboard or churn.

### Onboard the Harvest API per tenant

Required if you want applicants and pipeline state, not just postings. Each customer must mint you a Harvest key, so it does not scale to aggregation.

### Use JobsPipe

Every public Greenhouse board, one endpoint, no board tokens to manage. The free plan includes 1,000 jobs to start.

## Fields available on every record

- `id`
- `job_title`
- `company`
- `company_domain`
- `url`
- `date_posted`
- `discovered_at`
- `last_seen_at`
- `verified_at`
- `status`
- `closed_at`
- `closed_reason`
- `ghost_score`
- `seniority`
- `cities`
- `state_code`
- `min_annual_salary_usd`
- `max_annual_salary_usd`
- `technology_slugs`
- `keyword_slugs`
- `esco_skills`
- `sources`

## Sample response

```json
{
  "id": "4022345678",
  "job_title": "Software Engineer, Payments Infrastructure",
  "company": "Stripe",
  "company_domain": "stripe.com",
  "url": "https://job-boards.greenhouse.io/stripe/jobs/4022345678",
  "date_posted": "2026-09-02",
  "discovered_at": "2026-09-02T16:04:27+00:00",
  "last_seen_at": "2026-09-08 06:12:03",
  "verified_at": "2026-09-08 06:40:19",
  "status": "active",
  "closed_at": null,
  "closed_reason": null,
  "ghost_score": 12,
  "seniority": "mid",
  "cities": [
    "New York"
  ],
  "state_code": "NY",
  "min_annual_salary_usd": 198000,
  "max_annual_salary_usd": 297000,
  "technology_slugs": [
    "java",
    "kafka",
    "aws"
  ],
  "keyword_slugs": [
    "payments",
    "distributed-systems"
  ],
  "sources": [
    {
      "provider": "greenhouse",
      "url": "https://job-boards.greenhouse.io/stripe/jobs/4022345678"
    }
  ]
}
```

## FAQ

### How do I find a company's Greenhouse board token?

Look at the URL of its careers page. A Greenhouse-hosted board sits at boards.greenhouse.io/<board_token> or job-boards.greenhouse.io/<board_token>, and an embedded board usually leaks the same token in the page source or the boards-api call. Tokens are usually the company name in lowercase, such as stripe for Stripe, but some vanity domains hide the token entirely.

### What is the Greenhouse Job Board API rate limit?

Greenhouse's Job Board API documentation publishes no rate limit for its GET endpoints, so set your own modest ceiling and back off when you receive a 429 or a server error. The Harvest API's limit is documented: requests are limited to the amount in the X-RateLimit-Limit response header per 10 seconds, and a 429 response carries a Retry-After header.

### Greenhouse Job Board API vs Harvest API: what is the difference?

The Job Board API is public, read-only and unauthenticated, returning one company's published postings, departments and offices by board token. The Harvest API is private, key-authenticated and scoped to one company's full recruiting data: candidates, applications, scorecards, offers and webhooks. Aggregators and job boards read Job Board; an employer's internal integration uses Harvest, and the two are not interchangeable.

### Do Greenhouse job postings include salary and location fields?

Not as structured fields. Greenhouse returns pay as free text inside the description and free-texts location, with values like 'Remote - US' or 'NYC or Remote'. JobsPipe parses a stated pay range into min_annual_salary_usd and max_annual_salary_usd, and resolves the location to cities, state_code and the job_country_code_or and remote filters.

## Does Greenhouse have an API?

Yes, two. The Job Board API at boards-api.greenhouse.io is public and unauthenticated and returns one company's published openings, departments and offices by board token; it is the surface job boards and aggregators read. The Harvest API at harvest.greenhouse.io is the private, key-authenticated API for a company's own account: candidates, applications, jobs in their internal form, scorecards, offers, users and webhooks. Both call themselves the Greenhouse API, which is why developers land on Harvest docs when they wanted postings. JobsPipe returns the postings those public boards publish.

## Is the Greenhouse API free?

The Job Board API is free: no key, no signup and no published quota. The Harvest API has no separate price either, but it is only reachable with a key issued inside a paying customer's account, so for an outside developer it is unavailable rather than expensive. JobsPipe's free plan includes 1,000 jobs to start across every board it covers, Greenhouse included, and the sandbox needs no key. Paid plans are priced by jobs returned, not by source.

## How do I get a Greenhouse API key?

For postings you do not need one. The Job Board API takes a board token in the URL and nothing else, so the work is finding tokens: read the company's careers URL or inspect the embed on a vanity domain. Harvest credentials are created by a customer admin under Configure, then Dev Center, then API Credential Management, with permissions scoped when the credential is made; Harvest v3 uses OAuth 2.0. They never reach another company's account. JobsPipe never requests Harvest credentials; one JobsPipe key reads every public board.

## What does the Greenhouse API documentation cover?

developers.greenhouse.io documents both halves. The Job Board API pages cover the public endpoints for jobs (with content=true for full descriptions), departments, offices, sections and the application POST, plus the job-board embed. The Harvest API pages cover the authenticated resources: candidates, applications, jobs, job posts, offers, scorecards, scheduled interviews, users, custom fields and webhooks, with a rate limit returned in the X-RateLimit-Limit header and the permission model. Greenhouse also documents the Ingestion API for partners that push candidates in. JobsPipe's docs at /docs cover the one record shape returned for Greenhouse rows and every other board it covers.

## What JobsPipe returns for Greenhouse

A POST /v1/jobs/search with "source_or": ["greenhouse"] returns Greenhouse postings as JobsPipe records: id (the Greenhouse job id), job_title, company, company_domain, url, date_posted, discovered_at, last_seen_at, verified_at, status with closed_at and closed_reason once a posting closes, ghost_score, seniority, min_annual_salary_usd and max_annual_salary_usd when the posting states a range (Greenhouse returns pay as free text inside the description, so JobsPipe parses it), technology_slugs and keyword_slugs, and sources[0].provider set to greenhouse. Greenhouse free-texts location ('Remote - US', 'NYC or Remote'); JobsPipe resolves it to cities, state_code and the job_country_code_or and remote filters. Narrow to one company with company_name_partial_match_or.

## Greenhouse webhooks

Greenhouse webhooks are configured inside a customer's own account (Configure, Dev Center, Webhooks) and fire on that account's hiring events: candidate stage changes, hires, job creation and updates. Like Harvest keys they are per customer, so there is no way to subscribe to posting changes across Greenhouse customers you do not administer. For that cross-customer case, poll POST /v1/jobs/search with discovered_at_gte set to your last run and "source_or": ["greenhouse"]; every new board posting JobsPipe has seen since then comes back in one call.

## Reading Greenhouse job boards at scale

The Job Board API reads one board per request, and Greenhouse's documentation describes no request that lists boards. Reading many companies means holding a board token for each one, scheduling a request per board without a published rate limit, normalising free-text locations and pay, and inferring closed jobs from the posts that stop appearing. The guide below works through each of those problems and compares the aggregated APIs that include company career sites.

- [Greenhouse API for many companies: reading thousands of job boards](https://jobspipe.dev/blog/greenhouse-api-for-many-companies)
- [Companies using Greenhouse](https://jobspipe.dev/blog/companies-using-greenhouse)

## Related

- **Product:** https://jobspipe.dev/jobs-api
- **All sources:** https://jobspipe.dev/sources
- **Docs:** https://docs.jobspipe.dev
- **Sign up (free tier):** https://jobspipe.dev/signup

---
Generated from structured data. View the rendered page at https://jobspipe.dev/sources/greenhouse.

---
Building this integration yourself? The steps above work. The alternative is one API over 30+ sources, already normalized and deduplicated. Try it right now - no key, no signup:

```bash
curl -d '{"limit":3}' https://api.jobspipe.dev/v1/sandbox/jobs/search
```

Sample data, exact live schema. For live data get a free key (1,000 jobs to start) at https://jobspipe.dev/signup, then swap /v1/sandbox/jobs/search for /v1/jobs/search with an Authorization: Bearer header. Full agent index: https://jobspipe.dev/llms.txt?src=md-twin