# Greenhouse, Lever & Ashby Jobs API — Open Roles by Company Name (`abdulwhab95/greenhouse-lever-ashby-jobs`) Actor

Company name, domain or careers URL in, every open job out. Finds the Greenhouse, Lever or Ashby board itself. One row per job: title, department, location, remote/hybrid, salary, apply link. No start fee, pay per job.

- **URL**: https://apify.com/abdulwhab95/greenhouse-lever-ashby-jobs.md
- **Developed by:** [ABDULWAHAB NASER RASHED ALQARAWI](https://apify.com/abdulwhab95) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.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

Give it a company name, domain or careers URL and receive open jobs with titles, locations and application links from a matching **Greenhouse**, **Lever** or **Ashby** board. Names and domains are resolved using board-slug guesses; use the exact careers URL when you need to identify a particular company's board reliably.

```json
{ "companies": ["Stripe", "OpenAI", "notion.so"], "keywords": ["engineer"], "locations": ["remote"] }
```

### Why this one

**Start with a name, domain or board URL.** The Actor tries matching board slugs across the three supported platforms. Use an exact Greenhouse, Lever or Ashby board URL for reliable board selection; automatic name matching is a convenience, not verified company identity.

**$1 per 1,000 jobs delivered, with no Actor start fee.** Each delivered job costs $0.001. Informational status rows are free. Three companies capped at three jobs each cost at most $0.009 in this Actor's job charges. Repeated runs charge for jobs delivered again; other Apify platform services may have separate charges under your plan.

**Compact output by default.** Descriptions are omitted unless you set `includeDescription`, so an agent can scan roles without receiving every description. The prefilled trial is limited to three jobs per company; raise the limit for a larger export.

**One row shape for all three ATS**, with salary ranges where supported and published by the company.

### Input

| Field | What it does |
|---|---|
| `companies` | Company names, domains, or careers URLs, one per line. Up to 1,000 per run. |
| `keywords` | Only jobs whose title contains one of these words. |
| `locations` | Only jobs whose location contains one of these. `remote` and `hybrid` match the workplace type. |
| `includeDescription` | Add the full plain-text description. Off by default. |
| `maxJobsPerCompany` | Cap per company. Prefilled trial: 3; API fallback when omitted: 1,000. |

### Output

Selected real results from small cloud runs on September 27, 2026 (UTC). Job availability can change:

| Source | Company board | Job title | Location |
|---|---|---|---|
| Greenhouse | Stripe | Manager, Sales Development | Dublin |
| Lever | palantir | Administrative Business Partner | Singapore, Singapore |
| Ashby | notion | Software Engineer, Developer Platform | San Francisco, California |

A complete row from the Ashby test, with descriptions disabled:

```json
{
  "status": "ok", "input": "https://jobs.ashbyhq.com/notion", "ats": "ashby", "boardSlug": "notion", "company": "notion",
  "jobId": "1fc309c8-da20-4ff2-84c7-8b863ece2b0a",
  "title": "Software Engineer, Developer Platform",
  "department": "Engineering", "team": "Engineering",
  "location": "San Francisco, California",
  "allLocations": ["San Francisco, California", "New York, New York"],
  "workplaceType": "hybrid", "employmentType": "FullTime",
  "url": "https://jobs.ashbyhq.com/notion/1fc309c8-da20-4ff2-84c7-8b863ece2b0a",
  "applyUrl": "https://jobs.ashbyhq.com/notion/1fc309c8-da20-4ff2-84c7-8b863ece2b0a/application",
  "publishedAt": "2026-08-24T14:44:49.699+00:00", "updatedAt": null,
  "salary": null,
  "description": null
}
```

Fields unavailable in this Actor's selected source response are `null`. This Actor does not extract employment type or salary for Greenhouse, or a last-updated date for Lever and Ashby. `workplaceType` is normalized from the vendor's workplace field, Greenhouse location text or Ashby's remote flag; it may be absent.

An unmatched company gets a `company_not_found` row; a found board with no jobs matching your filters gets `no_matching_jobs`. An exhausted source/network failure or invalid JSON gets `lookup_failed`, so it is not confused with an absent company. Each status row contains a `note` and is not charged. The run's `RUN_REPORT` totals what was found, delivered and charged, and lists failed lookups separately.

Name-based discovery is a heuristic, not company identity verification. A name can match a similarly named board, and a failure to resolve does not prove the company uses a different ATS. Results are capped by `maxJobsPerCompany` and the run's spending limit. Repeated runs return the current snapshot; this Actor does not filter out jobs seen in earlier runs.

### Tips

- If a company's board uses a different name than the company (`Scale AI` might be `scaleai`), pass its careers page URL instead: `https://job-boards.greenhouse.io/scaleai`.
- Schedule it daily with `keywords` to watch a list of companies for new roles.
- This version supports standard board URLs on Greenhouse, `jobs.lever.co` and Ashby. Greenhouse embedded `job_board?for=...` URLs and Lever EU boards are not supported.

### Source

The Actor reads the public job-board APIs that Greenhouse, Lever and Ashby publish so companies' openings can be listed elsewhere: no login, no key, no scraping of HTML. Data is what each company posts on its own board.

# Actor input Schema

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

One per line: a company name, domain or Greenhouse, Lever or Ashby board URL. Names and domains use board-slug guesses; use the exact board URL to identify a particular company's board reliably.

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

Only jobs whose title contains at least one of these words, ignoring case. Leave empty for every job.

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

Only jobs whose location contains at least one of these, ignoring case. Use remote or hybrid to match the workplace type. Leave empty for every location.

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

Add each job's full description as plain text. Off by default: descriptions are most of the size, and one large board runs to megabytes.

## `maxJobsPerCompany` (type: `integer`):

Stop after this many matching jobs for each company. The prefilled trial uses 3; increase for a larger export.

## Actor input object example

```json
{
  "companies": [
    "https://job-boards.greenhouse.io/stripe",
    "https://jobs.ashbyhq.com/notion",
    "https://jobs.lever.co/palantir"
  ],
  "keywords": [],
  "locations": [],
  "includeDescription": false,
  "maxJobsPerCompany": 3
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `runReport` (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 = {
    "companies": [
        "https://job-boards.greenhouse.io/stripe",
        "https://jobs.ashbyhq.com/notion",
        "https://jobs.lever.co/palantir"
    ],
    "maxJobsPerCompany": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("abdulwhab95/greenhouse-lever-ashby-jobs").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 = {
    "companies": [
        "https://job-boards.greenhouse.io/stripe",
        "https://jobs.ashbyhq.com/notion",
        "https://jobs.lever.co/palantir",
    ],
    "maxJobsPerCompany": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("abdulwhab95/greenhouse-lever-ashby-jobs").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 '{
  "companies": [
    "https://job-boards.greenhouse.io/stripe",
    "https://jobs.ashbyhq.com/notion",
    "https://jobs.lever.co/palantir"
  ],
  "maxJobsPerCompany": 3
}' |
apify call abdulwhab95/greenhouse-lever-ashby-jobs --silent --output-dataset

```

## MCP server setup

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

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/GA7deuRRQdC4XAIag/builds/m03DFCO4AqjpOaiSh/openapi.json
