# Greenhouse, Lever & Ashby Jobs API — Official Job Boards (`scarlet_harrier/ats-jobs-greenhouse-lever-ashby`) Actor

Pull every open job from Greenhouse, Lever and Ashby company boards into one unified table: title, department, location, remote flag, employment type, published salary, dates, apply URL and description. Official public job-board APIs, no browser, no login.

- **URL**: https://apify.com/scarlet_harrier/ats-jobs-greenhouse-lever-ashby.md
- **Developed by:** [Upton & Partners](https://apify.com/scarlet_harrier) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 job postings

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, Lever & Ashby Jobs API — Official Job Boards

Give it a list of companies. Get back every open job from their Greenhouse, Lever and Ashby job boards in one unified table — title, department, location, remote flag, employment type, published pay range, dates, apply URL and (optionally) the description — ready to export to CSV, JSON or Excel, or pull via API.

### What it does

- **Reads the official public job-board APIs** of Greenhouse, Lever and Ashby. These are the same endpoints companies use to power their own careers pages. No login, no browser, no proxies
- **One schema for all three systems**: the same fields whichever ATS the company uses
- **Accepts board names or URLs**: `airbnb`, `https://boards.greenhouse.io/airbnb`, `https://jobs.lever.co/palantir`, or a company careers page that links to a Greenhouse, Lever or Ashby board
- **Filters** by keyword, location, department and remote-only
- **Published pay** (salary ranges) where the company shows them, normalised to min, max, currency and interval
- **Optional plain-text descriptions**, cleaned of HTML

### Use cases

- Hiring-trend and competitor tracking: who is hiring for what, and where
- Lead generation for recruiters and sales teams (company-level hiring signals)
- Salary and pay-transparency research
- Building a job board or alerting on new roles
- Labour-market analysis and datasets for research

### Input

| Field | Description |
|---|---|
| `greenhouseBoards` | Greenhouse board tokens, e.g. `airbnb`. |
| `leverCompanies` | Lever company names, e.g. `palantir`. |
| `ashbyBoards` | Ashby board names, e.g. `ramp`. |
| `careerPageUrls` | Optional career page URLs; the board is read from the URL or from a link on the page. |
| `keywords` | Keep jobs matching ANY keyword (title, department, team, description). |
| `titleOnly` | Match keywords against the title only. |
| `locationFilter` | Keep jobs whose location contains this text, e.g. `London`. |
| `departmentFilter` | Keep jobs whose department or team contains this text. |
| `remoteOnly` | Keep only remote jobs. |
| `includeDescription` | Add the description as plain text. Default off. |
| `maxJobsPerBoard` | Cap per board. Default 5,000. |
| `maxJobsTotal` | Overall cap. Default 10,000. |

```json
{
  "greenhouseBoards": ["airbnb"],
  "leverCompanies": ["palantir"],
  "ashbyBoards": ["ramp"],
  "keywords": ["data engineer", "machine learning"],
  "locationFilter": "London",
  "includeDescription": false
}
```

### Output

```json
{
  "ats": "ashby",
  "company": "ramp",
  "boardId": "ramp",
  "jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "title": "Security Engineer, Cloud",
  "department": "Engineering",
  "team": "Backend",
  "location": "New York, NY (HQ)",
  "allLocations": ["New York, NY (HQ)", "Remote (Canada)", "Remote (US)", "Miami, FL"],
  "remote": true,
  "workplaceType": "hybrid",
  "employmentType": "Full-time",
  "compensationSummary": "$211.4K – $290.6K • Offers Equity",
  "compensationMin": 211400,
  "compensationMax": 290600,
  "compensationCurrency": "USD",
  "compensationInterval": "year",
  "compensationRanges": [{ "min": 211400, "max": 290600, "currency": "USD", "interval": "year", "label": "Salary" }],
  "postedAt": "2026-04-07T17:12:35.753+00:00",
  "updatedAt": null,
  "applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
  "jobUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245"
}
```

With `includeDescription` on, each row also has a `description` field (plain text).

### Pricing

Pay per job fetched. You only pay for results.

### Notes

- Uses only the official public job-board APIs of Greenhouse, Lever and Ashby, which publish exactly the jobs a company has chosen to show on its public careers site. It does not log in, bypass anything or crawl career pages.
- Recruiter and hiring-manager names and e-mail addresses are not output. E-mail addresses that appear inside description text are replaced with `[email removed]`.
- `updatedAt` is only provided by Greenhouse. `team` is only provided by Lever and Ashby. `postedAt` is the first-published date (Greenhouse, Ashby) or creation date (Lever).
- Ashby's `remote` flag is Ashby's own; it can be `true` for a hybrid role that also lists remote locations, so check `workplaceType` too. On Greenhouse, remote is inferred from the workplace-type field when the company fills it in, otherwise from the word "remote" in the location, and is `null` when unknown.
- Published pay only appears where the company chooses to publish it. Greenhouse pay ranges are converted from cents.
- Job descriptions are the employers' content. Check that your use of them complies with the employers' and the ATS providers' terms and applicable law.
- A board name that does not exist is skipped with a warning and costs nothing. If every board fails, the run fails with a clear message.
- This Actor was built and is maintained with AI assistance, with human review. Issues are answered within a few days.

# Actor input Schema

## `greenhouseBoards` (type: `array`):

Greenhouse board tokens, e.g. airbnb (from boards.greenhouse.io/airbnb). Full board URLs also work.

## `leverCompanies` (type: `array`):

Lever company names, e.g. palantir (from jobs.lever.co/palantir). Full URLs also work. EU-hosted sites are detected automatically.

## `ashbyBoards` (type: `array`):

Ashby job board names, e.g. ramp (from jobs.ashbyhq.com/ramp). Full URLs also work.

## `careerPageUrls` (type: `array`):

Career page URLs. If the URL is a boards.greenhouse.io, jobs.lever.co or jobs.ashbyhq.com page the board is read from the URL. For a company's own careers page, the page HTML is checked for an embedded Greenhouse, Lever or Ashby board link.

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

Keep jobs where ANY keyword appears in the title, department, team or description (case-insensitive).

## `titleOnly` (type: `boolean`):

If on, keywords are matched against the job title only.

## `locationFilter` (type: `string`):

Keep jobs whose location (or any additional location) contains this text, e.g. London or Remote.

## `departmentFilter` (type: `string`):

Keep jobs whose department or team contains this text, e.g. Engineering.

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

Keep only jobs flagged as remote by the ATS or with 'remote' in the location.

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

Add the full job description as plain text. Makes the output larger.

## `maxJobsPerBoard` (type: `integer`):

Stop after this many matching jobs per board.

## `maxJobsTotal` (type: `integer`):

Overall cap across all boards. Use it to control cost.

## Actor input object example

```json
{
  "greenhouseBoards": [
    "airbnb"
  ],
  "leverCompanies": [
    "palantir"
  ],
  "ashbyBoards": [
    "ramp"
  ],
  "titleOnly": false,
  "remoteOnly": false,
  "includeDescription": false,
  "maxJobsPerBoard": 10,
  "maxJobsTotal": 10000
}
```

# 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 = {
    "greenhouseBoards": [
        "airbnb"
    ],
    "leverCompanies": [
        "palantir"
    ],
    "ashbyBoards": [
        "ramp"
    ],
    "maxJobsPerBoard": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("scarlet_harrier/ats-jobs-greenhouse-lever-ashby").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 = {
    "greenhouseBoards": ["airbnb"],
    "leverCompanies": ["palantir"],
    "ashbyBoards": ["ramp"],
    "maxJobsPerBoard": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("scarlet_harrier/ats-jobs-greenhouse-lever-ashby").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 '{
  "greenhouseBoards": [
    "airbnb"
  ],
  "leverCompanies": [
    "palantir"
  ],
  "ashbyBoards": [
    "ramp"
  ],
  "maxJobsPerBoard": 10
}' |
apify call scarlet_harrier/ats-jobs-greenhouse-lever-ashby --silent --output-dataset

```

## MCP server setup

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

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/lgtT2uebNdiB6YhNh/builds/vYAehdDIQ0xSqBUOE/openapi.json
