# Greenhouse Jobs API (`trap_check/greenhouse-jobs-api`) Actor

Search 180,000+ open jobs from 5,000+ companies hiring on Greenhouse (SpaceX, Anduril Industries…) by keyword, location, remote, seniority and salary. No company list needed. Checked daily, new-since-last-run feeds, $3 per 1,000 jobs.

- **URL**: https://apify.com/trap_check/greenhouse-jobs-api.md
- **Developed by:** [Chris O'Connor](https://apify.com/trap_check) (community)
- **Categories:** Jobs, Lead generation, AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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.

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

Every open job from **5,000+ companies that hire on Greenhouse**, in one search: 180,000+ open jobs from tech companies, startups and fast-growing scale-ups, such as SpaceX, Anduril Industries, Carvana. Every company is checked once a day, so you get jobs the day they go up, straight from the employer's own Greenhouse careers page.

**No company list needed.** Most Greenhouse scrapers make you supply the companies to scrape. Here the companies are already indexed: search "data engineer, remote, US" and get matches from all Greenhouse employers at once. You can still pick specific companies if you want.

**$3 per 1,000 jobs**, full descriptions included at no extra cost. Most searches cost a few cents.

Need more than one job system? Use [Career Site Jobs API](https://apify.com/trap_check/career-site-jobs): same data from all 9 job systems (Greenhouse, Workday, Lever, Ashby, SmartRecruiters, Workable, BambooHR, Recruitee, Personio), same price.

### Who it's for

- **Recruiters and sourcers**: see who is hiring for the roles you place, the day the job goes up.
- **Job boards and niche job sites**: fill your board with real, direct-from-employer jobs. Schedule a daily run with **Only jobs new since my last run**.
- **Sales and market research**: hiring is a buying signal. Track which Greenhouse companies are hiring for which teams, and where.
- **AI agents**: clean, predictable fields. Works from the Apify MCP server and API.

### What you get for each job

| Field | Example |
|---|---|
| `title` | Senior Data Engineer |
| `company` | SpaceX |
| `location` | Austin, TX; Remote (US) |
| `country` | US |
| `workplaceType` | remote, hybrid or onsite |
| `seniority` | intern, junior, senior, lead, manager, director, executive |
| `department`, `employmentType` | Engineering, Full-time |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | 150000, 190000, USD, year |
| `postedAt` | employer's posting date |
| `firstSeenAt` | when our daily check first found it |
| `url` | the job page on the employer's Greenhouse site (apply here) |
| `sourceAts`, `companyId`, `id` | stable ids for de-duplication (`sourceAts` is always `greenhouse`) |
| `descriptionText`, `descriptionHtml` | full description (optional) |

Salary is filled wherever the employer publishes it; many Greenhouse employers put pay in the description, so turn on descriptions to get the most salaries. Country, remote and seniority are worked out from the location and title text, so a small share may be blank.

### How to use it

**All new remote engineering jobs in the US, every morning**

- Job title keywords: `software engineer`, `data engineer`
- Countries: `US`, Workplace type: Remote
- Only jobs new since my last run: on
- Schedule the Actor daily (Schedules tab) and connect it to Google Sheets, Slack, a webhook or Zapier.

**Every open job at a list of companies**

- Companies: `SpaceX`, `https://job-boards.greenhouse.io/spacex`, `Anduril Industries`
- Leave keywords empty.

### Pricing

You pay per job returned. Turning on full descriptions costs the same. Set a maximum charge per run in the run options to cap spend.

### Good to know

- Each company is checked about once every 24 hours, so a job appears within a day of being posted.
- With **Only jobs new since my last run**, the first run returns everything matching your filters; later runs return only jobs first seen since the previous run. Give a feed a **Feed name** if you plan to tweak its filters but keep its place.
- Keywords match job titles by default. Choose "Title, company, location and department" for a broader search.

### Feedback

Missing a company or a field you need? Open an issue in the Issues tab. New companies are added regularly.

# Actor input Schema

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

Each keyword matches job titles containing all its words, e.g. "data engineer" or "nurse". Several keywords: a job matching any of them is returned. Leave empty for all jobs.

## `countries` (type: `array`):

Two-letter country codes, e.g. US, GB, DE, IN. Worked out from each job's location.

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

Text the job's location must contain, e.g. "Austin", "London", "Remote". A job matching any of them is returned.

## `workplaceTypes` (type: `array`):

Remote, hybrid or on-site, as stated by the employer or found in the location text.

## `maxResults` (type: `integer`):

Stop after this many jobs. Newest first.

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

Worked out from the job title (e.g. "Senior", "Staff", "Intern", "Director").

## `employmentTypes` (type: `array`):

As the employer labels the job (Full-time, Part-time, Contract...). About half of employers don't say, and those jobs are left out when you pick a type.

## `minSalary` (type: `integer`):

Only jobs whose posted pay range reaches this amount (in the job's own currency and period). Jobs without posted pay are left out.

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

Only jobs where the employer published a pay range.

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

Uses the employer's posting date; when the employer gives none, the day we first saw the job.

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

Only these companies: a name ("Stripe"), a careers page URL (https://jobs.lever.co/acme) or a company id from earlier results. Leave empty for all companies.

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

Jobs whose title contains any of these are left out, e.g. "senior", "intern", "sales".

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

Jobs from these companies are left out: a name, a careers page URL or a company id.

## `searchIn` (type: `string`):

Title only (precise), or title + company + location + department (broader).

## `onlyNewSinceLastRun` (type: `boolean`):

Schedule this Actor daily and turn this on to get only jobs that appeared since the previous run of the same search. The first run returns everything that matches.

## `includeClosedJobs` (type: `boolean`):

Used with "Only new since my last run". From the second run on, jobs matching your search that the employer took down since the previous run are added too, with status "closed" and closedAt. Handy for keeping a job board or dataset clean.

## `feedName` (type: `string`):

Used with "Only new since my last run". Give a search a name to keep its bookmark when you edit its filters. Leave empty to track each different search separately.

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

Fetch each job's full description (text and HTML) from the employer's own job system. Slower, same price.

## Actor input object example

```json
{
  "keywords": [
    "software engineer"
  ],
  "maxResults": 1000,
  "onlyWithSalary": false,
  "searchIn": "title",
  "onlyNewSinceLastRun": false,
  "includeClosedJobs": false,
  "includeDescription": false
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `details` (type: `string`):

No description

## `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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("trap_check/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"] }

# Run the Actor and wait for it to finish
run = client.actor("trap_check/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"
  ]
}' |
apify call trap_check/greenhouse-jobs-api --silent --output-dataset

```

## MCP server setup

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