# Company Job Boards Scraper: Greenhouse, Lever & Ashby (`private_image_hg9/company-job-boards-scraper`) Actor

Get every open job from any company's Greenhouse, Lever or Ashby careers board. Type a company name and the board is found for you. Clean, unified JSON with salary ranges, remote flag and posting dates. New-jobs-only mode for scheduled monitoring.

- **URL**: https://apify.com/private_image_hg9/company-job-boards-scraper.md
- **Developed by:** [Michael Shanker](https://apify.com/private_image_hg9) (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

$1.00 / 1,000 job saveds

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 Job Boards Scraper: Greenhouse, Lever & Ashby

Get every open job from any company's **Greenhouse**, **Lever** or **Ashby** careers board as clean, unified JSON. Type a company name and the Actor finds the board for you. No login, no cookies, no proxies, no browser. It reads the public job-board APIs these systems publish for exactly this purpose, so runs are fast and don't break when a careers page is redesigned.

**$1.00 per 1,000 jobs.** You pay only for jobs saved to your dataset. Boards that aren't found and jobs your filters drop cost nothing.

### What you can use it for

- **Job seekers and job boards:** pull fresh roles from a list of target companies into one sheet.
- **Recruiters and sales teams:** see who is hiring, for which teams and where. Hiring is a strong buying signal.
- **Investors and analysts:** track headcount plans and new departments at portfolio companies or competitors.
- **Monitoring:** schedule it daily with **Only new jobs** turned on and get just the roles posted since the last run.

### Input

| Field | What it does |
|---|---|
| **Companies** | Company names (`Ramp`), board slugs (`anthropic`) or board URLs (`https://jobs.lever.co/acme`, `https://job-boards.greenhouse.io/acme`, `https://jobs.ashbyhq.com/acme`). |
| **Job board system** | Auto-detect (default) checks Greenhouse, Lever and Ashby. Pick one system to skip the others. |
| **Title keywords / Exclude title keywords** | Keep titles with any of these words, and drop titles with any of the excluded ones (case-insensitive). |
| **Locations** | Keep jobs whose location contains any of these, e.g. `London`, `New York`, `US`. |
| **Remote jobs only** | Keep jobs the board marks as remote. |
| **Posted within (days)** | Keep only jobs first published in the last N days. |
| **Max jobs per company** | Cap results per company. |
| **Include full job description** | Add plain-text descriptions (off by default to keep output small). |
| **Only new jobs since the last run** | Monitor mode. Remembers job IDs and returns only unseen jobs on later runs. Use **Monitor name** to keep separate watch lists. |

Example input:

```json
{
  "companies": ["anthropic", "Ramp", "https://jobs.lever.co/leverdemo"],
  "keywords": ["engineer", "designer"],
  "remoteOnly": true,
  "postedWithinDays": 30
}
```

### Output

One row per job, with the same fields whatever system the company uses:

```json
{
  "company": "Ramp",
  "ats": "ashby",
  "boardSlug": "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)", "Remote (Canada)", "Remote (US)", "Miami, FL"],
  "country": "USA",
  "remote": true,
  "workplaceType": "Hybrid",
  "employmentType": "FullTime",
  "salaryMin": 211400,
  "salaryMax": 290600,
  "salaryCurrency": "USD",
  "salaryInterval": "1 YEAR",
  "salaryText": "$211.4K – $290.6K • Offers Equity",
  "postedAt": "2026-04-07T17:12:35.753000+00:00",
  "updatedAt": null,
  "url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
  "input": "Ramp",
  "scrapedAt": "2026-11-02T18:02:11.000000+00:00"
}
```

Salary fields are filled when the company publishes pay on its board (Lever and Ashby expose structured ranges; Greenhouse boards usually don't). Download results as JSON, CSV or Excel, or connect them to Google Sheets, Zapier, Make or n8n.

The run also saves a `SUMMARY` record in the key-value store showing which system and slug each company resolved to, how many jobs were open and how many were saved, or why a company wasn't found.

### Pricing

Pay per event: **$0.001 per job saved ($1.00 per 1,000 jobs)**. Set a maximum charge per run in the run options and the Actor stops cleanly when it is reached.

### Tips

- If auto-detect misses a company, paste its careers board URL. Some companies use a slug that differs from their name (e.g. `acmeinc`).
- Companies on Workday, iCIMS, SmartRecruiters or their own custom systems aren't covered. Those show as "not found" in the summary and cost nothing.

### Data source and terms

The Actor reads only published job postings through the vendors' public, documented job-board APIs (Greenhouse Job Board API, Lever Postings API, Ashby Job Postings API). It doesn't log in, doesn't collect candidate or employee data, and makes a handful of requests per company. Use the data in line with the terms of the boards you query.

# Actor input Schema

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

Company names (e.g. "Ramp"), board slugs (e.g. "anthropic") or board URLs (e.g. https://jobs.lever.co/acme, https://job-boards.greenhouse.io/acme, https://jobs.ashbyhq.com/acme). With a name or slug the Actor checks Greenhouse, Lever and Ashby and uses the board it finds.

## `ats` (type: `string`):

Leave on Auto-detect unless you know which system every company uses. Board URLs always use the system in the URL.

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

Keep jobs whose title contains at least one of these words or phrases. Case-insensitive. Leave empty for all jobs.

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

Drop jobs whose title contains any of these (e.g. "intern", "senior").

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

Keep jobs whose location text contains one of these (e.g. "New York", "London", "US").

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

Keep only jobs marked remote by the board or with "remote" in the location.

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

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

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

Cap the number of saved jobs per company. 0 means no cap.

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

Add the plain-text job description to every result (larger output).

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

Remembers job IDs between runs and saves only jobs not seen before. Ideal with a daily schedule. The first run returns all matching jobs.

## `monitorKey` (type: `string`):

Use different names to keep separate watch lists (e.g. "design-roles", "competitors").

## Actor input object example

```json
{
  "companies": [
    "anthropic",
    "Ramp",
    "https://jobs.lever.co/leverdemo"
  ],
  "ats": "auto",
  "remoteOnly": false,
  "postedWithinDays": 0,
  "maxJobsPerCompany": 0,
  "includeDescription": false,
  "onlyNewJobs": false,
  "monitorKey": "default"
}
```

# Actor output Schema

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

Every row the run saved, in the default dataset.

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

Counts and notes for the run, including anything skipped and why.

# 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": [
        "anthropic",
        "Ramp",
        "https://jobs.lever.co/leverdemo"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("private_image_hg9/company-job-boards-scraper").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": [
        "anthropic",
        "Ramp",
        "https://jobs.lever.co/leverdemo",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("private_image_hg9/company-job-boards-scraper").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": [
    "anthropic",
    "Ramp",
    "https://jobs.lever.co/leverdemo"
  ]
}' |
apify call private_image_hg9/company-job-boards-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,private_image_hg9/company-job-boards-scraper"
        }
    }
}
```

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/HKKAj6nEijbFmRfyy/builds/gKkb4n2nT0gWXys8Z/openapi.json
