# Greenhouse Jobs API: Search 165k+ Jobs from 4,000+ Companies (`dododata/greenhouse-jobs-api`) Actor

Search 165,000+ open jobs from 4,000+ companies hiring on Greenhouse by title, place, remote and date. No board URLs. JSON, refreshed daily.

- **URL**: https://apify.com/dododata/greenhouse-jobs-api.md
- **Developed by:** [Dodo Data](https://apify.com/dododata) (community)
- **Categories:** Jobs, Automation, Lead generation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 API: Search 165k+ Jobs from 4,000+ Companies

Search **166,975 open jobs** from **4,126 companies that hire through Greenhouse** by title, place, remote and date, and get clean JSON back. No board URLs, no company list: type a job title, pick a time window, press Start. The index is built from each employer's own Greenhouse job board and refreshed daily (166,975 jobs on 13 November 2026, 13,381 of them published in the previous 7 days); the full text of every job you get back is fetched live from the employer's board at search time.

### In one minute

- **What you get:** one JSON row per Greenhouse job, newest first: title, company, location, remote flag, pay range as numbers when the employer publishes one, publish date, the date our index first saw it, the employer's apply link and the full text. The same 30 fields as Dodo Data's other career-site job Actors.
- **What it costs:** $2.50 per 1,000 jobs on Apify's free plan, $2.00 on Gold and higher plans, plus a start fee of $0.00005 per GB of memory, one event at the default 1 GB. The prefilled search below returns 100 jobs: about $0.25 on the free plan. Apify's free plan includes $5 of usage every month.
- **Try it:** click **Start**. The prefilled search ("software engineer") returned 100 of the 7,371 matching Greenhouse jobs (newest first, at most 10 per company) from 58 companies in 39 seconds on 13 November 2026 (a run of this code on our own machine), all 100 with full text and 56 with a pay range. About half of that time is loading the index and the rest is fetching the full text politely; with **Include full descriptions** off the same search took 17 seconds.

One real row from that run (description shortened):

```json
{
  "title": "Senior Staff Software Engineer",
  "company": "workstream",
  "company_name": "Workstream",
  "location": "Singapore",
  "workplace_type": null,
  "remote": null,
  "salary_min": null,
  "salary_max": null,
  "salary_currency": null,
  "salary_period": null,
  "posted_at": "2026-11-13T01:53:45.000Z",
  "first_seen_at": "2026-10-27",
  "apply_url": "https://job-boards.greenhouse.io/workstream/jobs/6260934004",
  "description": "Workstream is a mission-driven company building the all-in-one HR, payroll, and hiring platform for managing the hourly…"
}
```

### Which Dodo Data Actor do you need?

- **Greenhouse jobs from every company at once, by title, place and date:** this Actor.
- **Every career-page system at once** (Greenhouse and the others in one search): [Career Site Jobs Search](https://apify.com/dododata/career-jobs-search).
- **One company's Greenhouse board, read live from its URL:** [Greenhouse Jobs Scraper](https://apify.com/dododata/greenhouse-jobs-scraper).

### What you can search

| Filter | What it does |
|---|---|
| **Title keywords** | a title word that starts with one of these ("engineer" also finds "Engineering Manager") |
| **Exclude title words** | drop titles containing one of these whole words (senior, intern) |
| **Locations** / **Exclude locations** | whole words in the location text: `berlin`, `united kingdom`, `us`, `remote`. Greenhouse gives no separate country, so a country is found only where the employer wrote it. `united kingdom` also tries UK, Great Britain, England, Scotland, Wales and Northern Ireland, and the word Wales also matches New South Wales: 154 of the 6,541 jobs that search found on 12 November 2026 are in Australia |
| **Time range** / **Posted within (days)** | last 24 hours, 3, 7 or 30 days, by publish date; with both set, the narrower wins |
| **Companies** / **Exclude companies** | by name or Greenhouse board name (`stripe`, `Figma`) |
| **Remote only** | jobs whose location says remote ("Remote - US"), about 1 Greenhouse job in 8. Greenhouse boards publish no workplace type, so there is no hybrid or on-site filter here |
| **Only jobs with a pay range** | the index holds no Greenhouse pay, so matching jobs are read newest first and kept when their record states a range; jobs without pay are left out and not charged. "software engineer" read 185 jobs to return 100 with pay in 59 seconds (13 November 2026) |
| **Seniority** | as the title states it: intern, junior, senior, lead (staff, principal), director (VP, head of); most titles state no level, and "No level in the title" keeps those |
| **Max jobs per company** | keeps one company from filling a search: by default a tenth of the run (at least 2) while other companies match; when the other companies run out before **Max rows** is reached, the jobs held back fill the rest; 0 for no limit; off when you name companies |
| **Include full descriptions** | on by default; off for faster, lighter rows |
| **Max rows** | up to 5,000 per run; it is also your spend cap. Rows come back newest first. With **Max jobs per company** on (the default) they are the newest of each company, not strictly the newest overall. On the prefilled search the two were the same 100 jobs on 13 November 2026 (no company had more than 10 of the 100 newest); a search that a few large companies dominate differs. Set **Max jobs per company** to 0 for the strictly newest. The form starts at 100; an API call or AI agent that leaves it out gets 20 |

Every filter runs before a row is saved, so you only pay for the jobs you get.

Greenhouse boards publish no employment type and no workplace type (remote is read from the location words), so this Actor offers no employment type or workplace type filter. If an API call sends an employment type, or a workplace type of hybrid or on-site, the run log says why that leaves every job out; a workplace type of remote is answered from the location words.

**Only jobs with a pay range** works differently here than on systems whose listings carry pay: the index holds no Greenhouse pay, so each matching job's own record is read, newest first, and the job is kept only when it states a range. A job read without one is left out and not charged. The search stops once it holds Max rows jobs with pay, once 4 x Max rows (at least 200) jobs have been read without pay (a company that states pay on at least half of its jobs is still read after that), or after 20 minutes of reading, and the run log says how many jobs were read and how many had pay. Measured on 13 November 2026 (a run on our own machine, Max rows 100): "software engineer" matched 7,371 jobs, read 185 and returned 100 with pay from 47 companies in 59 seconds. It works with full descriptions off too: the text is read for the pay and not saved.

Greenhouse locations are free text as the employer typed them ("New York, NY", "Remote - US"), with no separate country field, so a Locations word matches what the employer wrote. `us` also finds "United States" and "USA", but a job listed only as "New York, NY" names no country: add the cities or states you want (`new york`, `ny`, `california`).

### How fresh it is

A private collector reads every Greenhouse board in the index every day and writes the result to the store this Actor searches; the run log says when it was last refreshed (13 November 2026, 02:59 UTC, for the runs on this page). A job the employer has closed leaves the index at the next refresh, within a day; until then it comes back without full text, because the text is always fetched live from the employer's board. `first_seen_at` is the date our index first listed the job, which is useful when an employer re-dates old postings. The index began on 22 October 2026, so no value is earlier: 126,505 of the 166,975 jobs carry 22 or 26 October 2026, which says when we started reading the board, not when the job opened.

### Where the jobs come from

Only from each company's own public Greenhouse job board, through Greenhouse's public Job Board API (boards-api.greenhouse.io), the endpoint Greenhouse publishes so that companies' jobs can be shown anywhere. Which companies use Greenhouse was found from public web data (the Common Crawl URL index) and confirmed by reading each board. No aggregator, no LinkedIn, no Indeed, nothing behind a login. Every row links back to the employer's own posting; a company that wants its board left out can say so in the Issues tab and it is removed within 24 hours.

### Pay ranges

Greenhouse boards that publish pay do it in their pay transparency field; when that is empty, a range written in the job text is read out ("$120,000 - $150,000", "272,000 USD - 431,250 USD"). Both are read live, together with the full text, so **pay needs Include full descriptions on** (or **Only jobs with a pay range**, which reads each job for its pay). `salary_source` says where the figures came from (`structured` or `description`) and `salary_text` holds the board's own label ("US Salary Range") or the words of the text. In the sample run, 56 of 100 jobs had pay: 25 from the boards' own field, 31 from the text. In the text, a figure labelled as a bonus, an equity grant or a sign-on amount is left out rather than mixed into base pay; where an employer states only a total cash range, the row carries that range and `salary_text` shows the employer's wording.

### What we deliberately do not collect

- No personal-data fields. In the job text, e-mail addresses, phone numbers in the usual formats and contact names next to a contact label are replaced with a marker such as `[email removed]`. The filter works on patterns: it can miss a name an employer writes into its own sentence, an address written as "name\[at]company.com" or a number in an unusual format, and now and then it replaces an ordinary word after a job title. Tell us in the Issues tab and we fix the pattern.
- Nothing behind a login, no candidate data, no tracking.
- This Actor declares **limited permissions**: it can only write to its own storages on your account.

### How to run it

1. Click **Start** to run the prefilled search, or type your own title keywords.
2. Narrow with locations, remote, a time range or companies. Set **Max rows**: newest first, and it caps your spend.
3. Download as JSON, CSV or Excel, call it from the API, or let an AI agent call it through Apify's MCP server.
4. For a daily feed of new Greenhouse jobs, schedule it daily with **Time range: Last 3 days** and keep only the `id`s you have not seen before: some boards date a job a day or two before our daily refresh reads it, so Last 24 hours can miss a few. Know the limit of a feed by date: of the 2,335 Greenhouse jobs our index listed for the first time on 12 November 2026, 440 on 237 boards were dated more than 3 days back, most of them more than a month. This feed does not return those. They are in the index, with `first_seen_at` set to the day we first listed them.

**How long it takes:** every run first loads the index: runs with nothing else to fetch took 17 to 18 seconds on our machine. Full text is then fetched politely, at most five requests a second, so 100 jobs add about half a minute; larger runs are mostly limited by that pace: about 20 minutes for 5,000 jobs at the pace measured here. With **Include full descriptions** off there is nothing to fetch: 5,000 jobs came back in 18 seconds (13 November 2026).

### Ten real rows

The ten newest rows of the prefilled run of 13 November 2026 (descriptions shortened here to 160 characters; the dataset carries them in full):

```json
[
  {
    "id": "greenhouse:abnormalsecurity:8196352003",
    "ats": "greenhouse",
    "company": "abnormalsecurity",
    "company_name": "Abnormal",
    "title": "Software Engineer I, Data Platforms",
    "department": null,
    "team": null,
    "location": "Remote - USA",
    "locations": [
      "Remote - USA"
    ],
    "country": null,
    "workplace_type": "remote",
    "remote": true,
    "employment_type": null,
    "experience_level": null,
    "salary_min": 122400,
    "salary_max": 176000,
    "salary_currency": "USD",
    "salary_period": "year",
    "salary_text": "Base salary range:",
    "posted_at": "2026-11-13T02:06:01.000Z",
    "updated_at": "2026-11-13T02:06:01.000Z",
    "requisition_id": "R-101390",
    "description": "About the Role\nEnterprises of all sizes trust Abnormal AI’s cloud products to stop cybercrime. These AI-native, data-intensive SaaS applications depend on fast,…",
    "apply_url": "https://abnormal.ai/careers/jobs/8196352003?gh_jid=8196352003",
    "url": "https://abnormal.ai/careers/jobs/8196352003?gh_jid=8196352003",
    "change_status": null,
    "first_seen_at": "2026-11-13",
    "last_seen_at": null,
    "scraped_at": "2026-11-13T03:44:02.297Z",
    "salary_source": "structured"
  },
  {
    "id": "greenhouse:zscaler:5290020007",
    "ats": "greenhouse",
    "company": "zscaler",
    "company_name": "Zscaler",
    "title": "Software Engineering Architect, Machine Learning",
    "department": null,
    "team": null,
    "location": "Bangalore, IND",
    "locations": [
      "Bangalore, IND"
    ],
    "country": null,
    "workplace_type": null,
    "remote": null,
    "employment_type": null,
    "experience_level": null,
    "salary_min": null,
    "salary_max": null,
    "salary_currency": null,
    "salary_period": null,
    "salary_text": null,
    "posted_at": "2026-11-13T02:03:53.000Z",
    "updated_at": "2026-11-13T02:04:08.000Z",
    "requisition_id": "261109_I48372",
    "description": "Zscaler (NASDAQ: ZS) accelerates digital transformation so customers can be more agile, efficient, resilient, and secure. The Zscaler Zero Trust Exchange platfo…",
    "apply_url": "https://job-boards.greenhouse.io/zscaler/jobs/5290020007",
    "url": "https://job-boards.greenhouse.io/zscaler/jobs/5290020007",
    "change_status": null,
    "first_seen_at": "2026-11-13",
    "last_seen_at": null,
    "scraped_at": "2026-11-13T03:44:02.297Z",
    "salary_source": null
  },
  {
    "id": "greenhouse:workstream:6260934004",
    "ats": "greenhouse",
    "company": "workstream",
    "company_name": "Workstream",
    "title": "Senior Staff Software Engineer",
    "department": null,
    "team": null,
    "location": "Singapore",
    "locations": [
      "Singapore"
    ],
    "country": null,
    "workplace_type": null,
    "remote": null,
    "employment_type": null,
    "experience_level": null,
    "salary_min": null,
    "salary_max": null,
    "salary_currency": null,
    "salary_period": null,
    "salary_text": null,
    "posted_at": "2026-11-13T01:53:45.000Z",
    "updated_at": "2026-11-13T01:53:45.000Z",
    "requisition_id": "ENG20",
    "description": "Workstream is a mission-driven company building the all-in-one HR, payroll, and hiring platform for managing the hourly workforce. There are 2.7 billion hourly…",
    "apply_url": "https://job-boards.greenhouse.io/workstream/jobs/6260934004",
    "url": "https://job-boards.greenhouse.io/workstream/jobs/6260934004",
    "change_status": null,
    "first_seen_at": "2026-10-27",
    "last_seen_at": null,
    "scraped_at": "2026-11-13T03:44:02.297Z",
    "salary_source": null
  },
  {
    "id": "greenhouse:workstream:6260933004",
    "ats": "greenhouse",
    "company": "workstream",
    "company_name": "Workstream",
    "title": "Senior Staff Software Engineer",
    "department": null,
    "team": null,
    "location": "Shanghai and Chengdu",
    "locations": [
      "Shanghai and Chengdu"
    ],
    "country": null,
    "workplace_type": null,
    "remote": null,
    "employment_type": null,
    "experience_level": null,
    "salary_min": null,
    "salary_max": null,
    "salary_currency": null,
    "salary_period": null,
    "salary_text": null,
    "posted_at": "2026-11-13T01:53:22.000Z",
    "updated_at": "2026-11-13T01:53:22.000Z",
    "requisition_id": "ENG20",
    "description": "Workstream is a mission-driven company building the all-in-one HR, payroll, and hiring platform for managing the hourly workforce. There are 2.7 billion hourly…",
    "apply_url": "https://job-boards.greenhouse.io/workstream/jobs/6260933004",
    "url": "https://job-boards.greenhouse.io/workstream/jobs/6260933004",
    "change_status": null,
    "first_seen_at": "2026-10-27",
    "last_seen_at": null,
    "scraped_at": "2026-11-13T03:44:02.297Z",
    "salary_source": null
  },
  {
    "id": "greenhouse:workstream:6260931004",
    "ats": "greenhouse",
    "company": "workstream",
    "company_name": "Workstream",
    "title": "Staff Software Engineer",
    "department": null,
    "team": null,
    "location": "Singapore",
    "locations": [
      "Singapore"
    ],
    "country": null,
    "workplace_type": null,
    "remote": null,
    "employment_type": null,
    "experience_level": null,
    "salary_min": null,
    "salary_max": null,
    "salary_currency": null,
    "salary_period": null,
    "salary_text": null,
    "posted_at": "2026-11-13T01:51:49.000Z",
    "updated_at": "2026-11-13T01:51:49.000Z",
    "requisition_id": "ENG-20",
    "description": "Workstream is a mission-driven company building the all-in-one HR, payroll, and hiring platform for managing the hourly workforce. There are 2.7 billion hourly…",
    "apply_url": "https://job-boards.greenhouse.io/workstream/jobs/6260931004",
    "url": "https://job-boards.greenhouse.io/workstream/jobs/6260931004",
    "change_status": null,
    "first_seen_at": "2026-10-31",
    "last_seen_at": null,
    "scraped_at": "2026-11-13T03:44:02.297Z",
    "salary_source": null
  },
  {
    "id": "greenhouse:workstream:6260930004",
    "ats": "greenhouse",
    "company": "workstream",
    "company_name": "Workstream",
    "title": "Staff Software Engineer",
    "department": null,
    "team": null,
    "location": "Shanghai and Chengdu",
    "locations": [
      "Shanghai and Chengdu"
    ],
    "country": null,
    "workplace_type": null,
    "remote": null,
    "employment_type": null,
    "experience_level": null,
    "salary_min": null,
    "salary_max": null,
    "salary_currency": null,
    "salary_period": null,
    "salary_text": null,
    "posted_at": "2026-11-13T01:51:17.000Z",
    "updated_at": "2026-11-13T01:51:17.000Z",
    "requisition_id": "ENG-20",
    "description": "Workstream is a mission-driven company building the all-in-one HR, payroll, and hiring platform for managing the hourly workforce. There are 2.7 billion hourly…",
    "apply_url": "https://job-boards.greenhouse.io/workstream/jobs/6260930004",
    "url": "https://job-boards.greenhouse.io/workstream/jobs/6260930004",
    "change_status": null,
    "first_seen_at": "2026-10-31",
    "last_seen_at": null,
    "scraped_at": "2026-11-13T03:44:02.297Z",
    "salary_source": null
  },
  {
    "id": "greenhouse:andurilindustries:5294106007",
    "ats": "greenhouse",
    "company": "andurilindustries",
    "company_name": "Anduril Industries",
    "title": "Staff Guidance Navigation and Control Software Engineer (GNC)",
    "department": null,
    "team": null,
    "location": "Costa Mesa, California, United States; Santa Ana, California, United States",
    "locations": [
      "Costa Mesa, California, United States; Santa Ana, California, United States"
    ],
    "country": null,
    "workplace_type": null,
    "remote": null,
    "employment_type": null,
    "experience_level": null,
    "salary_min": 220000,
    "salary_max": 292000,
    "salary_currency": "USD",
    "salary_period": "year",
    "salary_text": "US Salary Range",
    "posted_at": "2026-11-13T01:27:36.000Z",
    "updated_at": "2026-11-13T01:28:01.000Z",
    "requisition_id": "15743",
    "description": "Anduril Industries is a defense technology company with a mission to transform U.S. and allied military capabilities with advanced technology. By bringing the e…",
    "apply_url": "https://boards.greenhouse.io/andurilindustries/jobs/5294106007?gh_jid=5294106007",
    "url": "https://boards.greenhouse.io/andurilindustries/jobs/5294106007?gh_jid=5294106007",
    "change_status": null,
    "first_seen_at": "2026-11-13",
    "last_seen_at": null,
    "scraped_at": "2026-11-13T03:44:02.297Z",
    "salary_source": "structured"
  },
  {
    "id": "greenhouse:robinhood:8384669",
    "ats": "greenhouse",
    "company": "robinhood",
    "company_name": "Robinhood",
    "title": "Senior Software Engineer, Trump Accounts",
    "department": null,
    "team": null,
    "location": "Menlo Park, CA; New York, NY",
    "locations": [
      "Menlo Park, CA; New York, NY"
    ],
    "country": null,
    "workplace_type": null,
    "remote": null,
    "employment_type": null,
    "experience_level": null,
    "salary_min": 196000,
    "salary_max": 230000,
    "salary_currency": "USD",
    "salary_period": "year",
    "salary_text": "Zone 1 (Menlo Park, CA; New York, NY; Bellevue, WA; Washington, DC)",
    "posted_at": "2026-11-13T00:34:27.000Z",
    "updated_at": "2026-11-13T00:34:27.000Z",
    "requisition_id": "1968",
    "description": "Join us in building the future of finance.\nOur mission is to democratize finance for all. An estimated $124 trillion of assets will be inherited by younger gene…",
    "apply_url": "https://boards.greenhouse.io/robinhood/jobs/8384669?t=gh_src=&gh_jid=8384669",
    "url": "https://boards.greenhouse.io/robinhood/jobs/8384669?t=gh_src=&gh_jid=8384669",
    "change_status": null,
    "first_seen_at": "2026-11-13",
    "last_seen_at": null,
    "scraped_at": "2026-11-13T03:44:02.297Z",
    "salary_source": "structured"
  },
  {
    "id": "greenhouse:diracinc:4506200009",
    "ats": "greenhouse",
    "company": "diracinc",
    "company_name": "Dirac, Inc.",
    "title": "Software Engineer",
    "department": null,
    "team": null,
    "location": "New York City",
    "locations": [
      "New York City"
    ],
    "country": null,
    "workplace_type": null,
    "remote": null,
    "employment_type": null,
    "experience_level": null,
    "salary_min": 120000,
    "salary_max": 200000,
    "salary_currency": "USD",
    "salary_period": "year",
    "salary_text": "New York Pay Range",
    "posted_at": "2026-11-13T00:27:13.000Z",
    "updated_at": "2026-11-13T00:30:45.000Z",
    "requisition_id": "29",
    "description": "About the Company\nDirac is building the creative suite for manufacturing engineering. Manufacturing engineering has been underserved by fractured tooling. The w…",
    "apply_url": "https://job-boards.greenhouse.io/diracinc/jobs/4506200009",
    "url": "https://job-boards.greenhouse.io/diracinc/jobs/4506200009",
    "change_status": null,
    "first_seen_at": "2026-11-13",
    "last_seen_at": null,
    "scraped_at": "2026-11-13T03:44:02.297Z",
    "salary_source": "structured"
  },
  {
    "id": "greenhouse:toast:8365546",
    "ats": "greenhouse",
    "company": "toast",
    "company_name": "Toast",
    "title": "Staff Software Engineer, Enterprise",
    "department": null,
    "team": null,
    "location": "Remote, US",
    "locations": [
      "Remote, US"
    ],
    "country": null,
    "workplace_type": "remote",
    "remote": true,
    "employment_type": null,
    "experience_level": null,
    "salary_min": 193000,
    "salary_max": 309000,
    "salary_currency": "USD",
    "salary_period": "year",
    "salary_text": "Zone A",
    "posted_at": "2026-11-12T23:29:15.000Z",
    "updated_at": "2026-11-12T23:29:15.000Z",
    "requisition_id": "R15558",
    "description": "Toast creates technology to help restaurants and local businesses succeed in a digital world, helping business owners operate, increase sales, engage customers,…",
    "apply_url": "https://careers.toasttab.com/jobs?gh_jid=8365546",
    "url": "https://careers.toasttab.com/jobs?gh_jid=8365546",
    "change_status": null,
    "first_seen_at": "2026-11-13",
    "last_seen_at": null,
    "scraped_at": "2026-11-13T03:44:02.297Z",
    "salary_source": "structured"
  }
]
```

### Related Actors

- [Career Site Jobs Search](https://apify.com/dododata/career-jobs-search): the same index across every career-page system we read, in one search.
- [Greenhouse Jobs Scraper](https://apify.com/dododata/greenhouse-jobs-scraper): one company's Greenhouse board, read live from its URL, with a monitor mode for new, changed and closed jobs.

### Price

**$2.50 per 1,000 jobs** on Apify's free plan, less on paid plans: $2.30 on Bronze, $2.10 on Silver, $2.00 on Gold and above. Any change is announced 14 days ahead through Apify, as its rules require, and applies to every user alike.

### Questions and feedback

Something missing, wrong or unclear? Open an Issue on this page: we answer within a day, and fixes usually ship within 48 hours. If the Actor saved you time, a short review here helps other people find it.

### Changelog

- 2026-11-13, v0.1: every number and sample row on this page measured again against the index of 13 November 2026 (166,975 Greenhouse jobs from 4,126 companies), the day the Actor went public. No change to the search itself.
- 2026-11-12, v0.1: every number and sample row on this page measured again against the index of 12 November 2026 (167,747 Greenhouse jobs from 4,132 companies); the title now says 4,000+ companies. No change to the search itself.
- 2026-10-29, v0.1: first build. Index of 168,884 Greenhouse jobs from 4,192 companies; measured on local runs against the live index on 29 October 2026.

# Actor input Schema

## `keywords` (type: `array`):

Keep Greenhouse jobs whose title has a word starting with one of these ("engineer" also finds "Engineering Manager"). Empty for every job.

## `excludeKeywords` (type: `array`):

Drop jobs whose title contains one of these whole words, for example senior or intern.

## `locations` (type: `array`):

Keep jobs whose location text contains one of these whole words: berlin, united kingdom, us, remote. Greenhouse gives no separate country, so a country is found only where the employer wrote it.

## `excludeLocations` (type: `array`):

Drop jobs whose location, country or workplace type names one of these places, by the same rule as Locations: "uk" also drops "United Kingdom", "remote" drops jobs marked remote.

## `remoteOnly` (type: `boolean`):

Keep only jobs whose location says remote (about 1 Greenhouse job in 8). Greenhouse boards publish no workplace type, so there is no hybrid or on-site filter here.

## `postedWithinDays` (type: `integer`):

Keep jobs published in the last N days. With Time range also set, the narrower window wins. Empty for any date.

## `timeRange` (type: `string`):

Greenhouse jobs published in this window (or first seen by the index when a job carries no date). The index refreshes daily; for a daily feed use Last 3 days and keep ids you have not seen, since some boards date a job before our refresh reads it.

## `companies` (type: `array`):

Keep jobs from these companies only, by name or Greenhouse board slug (the part of the board URL after the domain).

## `excludeCompanies` (type: `array`):

Drop jobs from these companies, by name or Greenhouse board slug.

## `onlyWithSalary` (type: `boolean`):

Keep only jobs that state a pay range. The index holds no Greenhouse pay, so each matching job's own record is read, newest first, until Max rows jobs with pay are found; jobs without pay are left out and not charged. At most 4 x Max rows (at least 200) jobs without pay are read, so a broad search may stop early: the run log says so. On 12 November 2026, "software engineer" read 186 jobs to return 100 with pay in 58 seconds (a run on our own machine).

## `seniority` (type: `array`):

Keep jobs whose title states one of these levels: "Senior Data Engineer" is senior, "Staff Engineer" lead, "Head of Sales" director. Read from the title words only, never guessed; most titles state no level, which "No level in the title" keeps.

## `maxPerCompany` (type: `integer`):

At most this many jobs from one company while other companies also match, so a few very large boards (some are agencies reposting other companies' jobs) cannot fill a search. Empty: a tenth of Max rows, at least 2. 0: no limit, and the rows are then strictly the newest matching jobs; with a limit they are the newest of each company. Not applied when you name companies.

## `includeDescription` (type: `boolean`):

Fetch the full job text for the jobs returned, live from each career site. Turn off for faster, lighter rows.

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

Newest first, up to 5,000 per run; it is also your spend cap. The form starts at 100; a call through the API or an AI agent that leaves it out gets 20.

## Actor input object example

```json
{
  "keywords": [
    "software engineer"
  ],
  "remoteOnly": false,
  "timeRange": "",
  "onlyWithSalary": false,
  "includeDescription": true,
  "maxItems": 100
}
```

# Actor output Schema

## `results` (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 = {
    "keywords": [
        "software engineer"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("dododata/greenhouse-jobs-api").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 = {
    "keywords": ["software engineer"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("dododata/greenhouse-jobs-api").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 '{
  "keywords": [
    "software engineer"
  ],
  "maxItems": 100
}' |
apify call dododata/greenhouse-jobs-api --silent --output-dataset

```

## MCP server setup

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

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/KRwjAF5u6JHck0c9U/builds/JrOQeWsJ3IupIzG38/openapi.json
