# Company Jobs Scraper: Greenhouse, Lever & Ashby Job Boards (`open-data-tools/company-jobs-greenhouse-lever-ashby`) Actor

Get every open job at the companies you name, live from their official Greenhouse, Lever and Ashby job board APIs. Company name, website or board link in; title, location, remote, salary, department, apply link out. Filters and a new-jobs monitor. $0.50 per 1,000 jobs.

- **URL**: https://apify.com/open-data-tools/company-jobs-greenhouse-lever-ashby.md
- **Developed by:** [Open Data Tools](https://apify.com/open-data-tools) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 job in outputs

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

## Company Jobs Scraper: Greenhouse, Lever & Ashby Job Boards

Get every open job at the companies you care about, read live from each company's own job board. Type a company name (`Stripe`), a website (`ramp.com`) or a job board link (`boards.greenhouse.io/stripe`, `jobs.lever.co/spotify`, `jobs.ashbyhq.com/notion`), and this Actor finds the board and returns its open jobs in one clean table.

It reads the official, public **Greenhouse Job Board API**, **Lever Postings API** and **Ashby Job Posting API**: the same feeds that power those companies' career pages. No login, no proxies, no stale database. The jobs are the ones open right now.

For each job you get:

- **Title, department, team, location(s), country**
- **Workplace type** (remote, hybrid, onsite) and a `remote` flag
- **Salary range** with currency and interval, where the company publishes it (common on Ashby and Lever, and on Greenhouse boards with pay transparency)
- **Employment type**, **posted date**, **job page and apply link**
- Optional **full description** as plain text
- With the monitor on: **isNew** and **firstSeenAt**, plus the jobs that **closed** since the last run

### What people use it for

- **Job seekers**: track 50 target companies and get only the new engineering or design roles each morning
- **Recruiters and agencies**: see who is hiring for what, and spot new openings before they reach job sites
- **Sales and investors**: hiring as a buying or growth signal (a company that opens 10 sales roles is scaling)
- **Job boards and newsletters**: feed niche boards with fresh postings straight from the source
- **Market research**: salary ranges and remote share by company, team or location

### How it works

1. **Finds the board.** A board link is used as is. A company name is tried as a board name on Greenhouse, Lever (US and EU) and Ashby, in a few spellings (`Scale AI` tries `scaleai` and `scale-ai`). A website is tried the same way, then its home and careers pages are checked for a job board link. If a name matches boards on two systems, the one with more jobs is used and the other is listed in the COMPANIES record.
2. **Reads every open job** from that board's public API.
3. **Filters** by title words, excluded words, location, remote, department and posting date.
4. **Monitor** (optional): remembers the jobs it saw under a monitor name and outputs only the new ones next time. Schedule it daily for alerts.

Companies it cannot find are listed in the COMPANIES record with every board name it tried, and cost nothing. If a name fails, paste the careers page link instead.

### Input example

```json
{
  "companies": ["Stripe", "jobs.lever.co/spotify", "ramp.com", "greenhouse:anthropic"],
  "titleKeywords": ["engineer", "developer"],
  "excludeTitleKeywords": ["intern"],
  "locationKeywords": ["remote", "new york"],
  "postedWithinDays": 14,
  "onlyNewJobs": false
}
```

### Output example

```json
{
  "company": "ramp.com",
  "companyName": null,
  "ats": "ashby",
  "board": "ramp",
  "jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "title": "Security Engineer, Cloud",
  "department": "Engineering",
  "team": "Backend",
  "location": "New York, NY (HQ)",
  "locations": ["New York, NY (HQ)"],
  "country": "USA",
  "workplaceType": "hybrid",
  "remote": false,
  "employmentType": "Full Time",
  "salaryMin": 211400,
  "salaryMax": 290600,
  "salaryCurrency": "USD",
  "salaryInterval": "year",
  "salaryText": "$211.4K - $290.6K",
  "postedAt": "2026-04-07T17:12:35.753Z",
  "url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
  "isNew": true,
  "matchedBy": "name"
}
```

The run also saves **COMPANIES** (which board each company was found on, open and matched job counts, new and closed jobs) and **SUMMARY** in the key-value store.

### Pricing

Pay per event: **$0.0005 per job** in the output ($0.50 per 1,000 jobs), no start fee. Board lookups, companies not found and jobs removed by your filters are free. In monitor mode you pay only for the new jobs. Set "Max jobs in total" or a maximum charge to cap a run.

### Limits and notes

- Covers companies whose careers page runs on Greenhouse, Lever or Ashby (thousands of tech and startup employers). Workday, iCIMS, Taleo and other systems are not included.
- Name matching guesses the board name. A short or generic name can match a different company with the same board name: check `companyName` (Greenhouse) or the job links, or use the board link for certainty.
- Salary appears only when the company publishes it on the board.
- Job descriptions belong to the employers. Use them in line with each company's terms and the laws that apply to you.

### FAQ

**Do I need an API key or account at Greenhouse, Lever or Ashby?** No. The job board APIs are public.

**How do I get alerts for new jobs?** Turn on "Only new jobs", give the monitor a name, and schedule the Actor (for example daily). Connect the run to email, Slack or a webhook with Apify integrations.

**How do I find a company's board link?** Open any job on their careers page. Links that start with `boards.greenhouse.io/`, `job-boards.greenhouse.io/`, `jobs.lever.co/` or `jobs.ashbyhq.com/` show the board name.

# Actor input Schema

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

Company names (Stripe), websites (ramp.com) or job board links (boards.greenhouse.io/stripe, jobs.lever.co/spotify, jobs.ashbyhq.com/ramp). You can also write greenhouse:stripe. One per line.

## `titleKeywords` (type: `array`):

Keep jobs whose title contains any of these words, for example engineer, sales, designer. Case-insensitive.

## `excludeTitleKeywords` (type: `array`):

Drop jobs whose title contains any of these words, for example senior, intern, manager.

## `locationKeywords` (type: `array`):

Keep jobs whose location contains any of these, for example London, Germany, Remote, US.

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

Keep only jobs the board marks as remote.

## `departments` (type: `array`):

For example Engineering, Sales, Marketing.

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

Keep jobs first published in the last N days. Empty means any date.

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

Adds the full description as plain text. Makes the dataset much larger.

## `atsPlatforms` (type: `array`):

Which job board APIs to search when you give a company name. Default: all three.

## `onlyNewJobs` (type: `boolean`):

Remembers the jobs it saw and outputs only jobs added since the last run with the same monitor name. On the first run every job counts as new. Closed jobs are listed in the COMPANIES record.

## `monitorName` (type: `string`):

Keeps separate memories for different company lists or schedules.

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

Empty means all matching jobs.

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

Stop after this many jobs. Empty means no limit.

## Actor input object example

```json
{
  "companies": [
    "Stripe",
    "jobs.lever.co/spotify",
    "ramp.com"
  ],
  "remoteOnly": false,
  "includeDescription": false,
  "atsPlatforms": [
    "greenhouse",
    "lever",
    "ashby"
  ],
  "onlyNewJobs": false,
  "monitorName": "default"
}
```

# Actor output Schema

## `jobs` (type: `string`):

One row per open job.

## `companies` (type: `string`):

Which board each company was found on, job counts, new and closed jobs, and companies not found.

## `summary` (type: `string`):

Totals for the run.

# 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": [
        "Stripe",
        "jobs.lever.co/spotify",
        "ramp.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("open-data-tools/company-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 = { "companies": [
        "Stripe",
        "jobs.lever.co/spotify",
        "ramp.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("open-data-tools/company-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 '{
  "companies": [
    "Stripe",
    "jobs.lever.co/spotify",
    "ramp.com"
  ]
}' |
apify call open-data-tools/company-jobs-greenhouse-lever-ashby --silent --output-dataset

```

## MCP server setup

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