# Greenhouse

Source: https://career-ops.org/docs/reference/portals/greenhouse (canonical HTML, identical content)

> career-ops hits Greenhouse's public boards API directly. No HTML scraping, no rate-limit risk, no AI tokens consumed during the scan itself.



## What it does [#what-it-does]

The greenhouse provider in providers/greenhouse.mjs makes HTTP requests to boards-api.greenhouse.io/v1/boards/`{slug}`/jobs and parses the JSON response into the career-ops listing format. The slug is the company's Greenhouse board identifier (e.g. 'notion' for Notion).

## When to use it [#when-to-use-it]

Use Greenhouse scanning when your target companies use Greenhouse as their ATS. Most US tech companies in the 50–10,000-employee range do. templates/portals.example.yml ships with 70+ pre-configured Greenhouse slugs you can enable.

## Example [#example]

```
In your portals.yml: `- provider: greenhouse\n  slug: notion\n  careers_url: https://job-boards.greenhouse.io/notion` — then `/career-ops scan` picks up all open Notion roles.
```

## What the scanner does [#what-the-scanner-does]

The scanner reads your enabled Greenhouse slugs from portals.yml, calls the public boards API for each one, and adds new, title-matching roles to your pipeline with no scraping and zero LLM tokens spent on the fetch. A single `node scan.mjs` run handles your Greenhouse, Ashby, and Lever boards in one pass, then filters the results by your configured title keywords.

```bash title="Terminal"
node scan.mjs
```

```txt title="Output"
Portal Scan - 2026-07-06
Offers found: 58 total
Filtered by title: 9 relevant
Duplicates: 6 (already evaluated or in pipeline)
New added to pipeline.md: 3

  + Notion | AI Product Engineer | greenhouse
  + OpenAI | Applied Engineer    | greenhouse
```

## How career-ops talks to Greenhouse [#how-career-ops-talks-to-greenhouse]

career-ops requests `boards-api.greenhouse.io/v1/boards/{slug}/jobs` and reads the `jobs` array from the JSON, taking each role's title and its `absolute_url`. That boards endpoint returns listing metadata — title, location, and department — but not the full description, so career-ops pulls the complete job text with a follow-up request per role during the evaluate step, or by appending `?content=true` where the board supports it. The scan itself is a plain HTTPS GET against a public endpoint, which is why it stays inside rate limits and spends no model tokens. Re-running the scan is safe: every URL is deduplicated against your scan history, your evaluated applications, and the current pipeline, so a role you have already seen is never added twice.

## Gotchas [#gotchas]

Greenhouse-API listings only include the title, location, and department in the boards endpoint. Full JD text requires a follow-up request per listing, which career-ops handles automatically during the evaluate step.

## Related [#related]

* [ashby](https://career-ops.org/docs/reference/portals/ashby.md)
* [lever](https://career-ops.org/docs/reference/portals/lever.md)
