# Job Board Scraper — Greenhouse, Lever & Ashby (`glitchbound/job-board-scraper`) Actor

Pull open jobs straight from companies' own career boards on Greenhouse, Lever and Ashby. Auto-detects the system, normalises every job into one shape, and filters by title, location or remote.

- **URL**: https://apify.com/glitchbound/job-board-scraper.md
- **Developed by:** [Daniel Meshulam](https://apify.com/glitchbound) (community)
- **Categories:** Jobs, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.75 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Job Board Scraper — Greenhouse, Lever & Ashby

Pull open roles **straight from companies' own career boards**. Give it a list of companies; it works out which system each one uses and returns every job in a single consistent shape.

### Why these sources

Greenhouse, Lever and Ashby publish **official public job-board APIs** — companies expose them deliberately so their openings can be syndicated. That means no blocking, no login, and no grey area, unlike scraping a job aggregator.

It also means the data is **first-party**: straight from the employer, before it's rewritten or delayed by an aggregator.

### Auto-detect

You rarely know which ATS a company uses. Enter the board name from their careers URL and the Actor tries all three:

| Careers URL | Enter |
|---|---|
| `boards.greenhouse.io/stripe` | `stripe` |
| `jobs.lever.co/acme` | `acme` |
| `jobs.ashbyhq.com/ramp` | `ramp` |

### Filter before you pay

```json
{
  "companies": ["stripe", "ramp", "figma"],
  "titleKeywords": ["engineer"],
  "remoteOnly": true,
  "includeDescription": true
}
```

Filters run before billing — **you are charged only for jobs actually returned**, not for everything scanned.

### What you get per job

`company` · `ats` · `jobId` · `title` · `location` + `locations` · `department` + `departments` · `remote` · `employmentType` · `compensation` (Ashby) · `postedAt` · `updatedAt` · `url` · `description` (clean text, HTML stripped)

### Use cases

- **Hiring-signal intelligence** — a company suddenly opening 12 sales roles is a growth signal; schedule this weekly and watch headcount plans
- **Job boards & aggregators** — build a niche board from first-party listings
- **Recruiting** — track which competitors are hiring the roles you're filling
- **Sales prospecting** — companies hiring for a stack are buying tools for it
- **LLM pipelines** — descriptions come through as clean text, ready to summarise or classify

### Notes

- Descriptions are HTML-stripped into plain text, capped at 5,000 characters.
- Companies with no public board on any of the three systems return a clear `error` row naming the problem. **Error rows are never charged.**
- Public job postings only — no candidate data, no personal data.

# Actor input Schema

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

Board names from careers URLs, one per line. For boards.greenhouse.io/stripe enter "stripe"; same for jobs.lever.co/<name> and jobs.ashbyhq.com/<name>. The Actor detects which system each company uses.

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

Only keep jobs whose title or department contains one of these (e.g. "engineer", "sales"). Leave empty for all. You are only charged for jobs actually returned.

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

Only keep jobs matching one of these locations (e.g. "london", "new york"). Leave empty for all.

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

Only return roles flagged remote.

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

Include the full job description as clean text (HTML stripped) — ready for an LLM.

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

Leave on Auto-detect unless you know which system every company uses.

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

Upper limit of jobs RETURNED per company (after filters), so a small limit plus filters still gives you results.

## `proxyConfiguration` (type: `object`):

Proxy settings.

## Actor input object example

```json
{
  "companies": [
    "stripe"
  ],
  "remoteOnly": false,
  "includeDescription": true,
  "ats": "auto",
  "maxJobsPerCompany": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Open roles from company Greenhouse, Lever and Ashby boards.

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

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

# Run the Actor and wait for it to finish
run = client.actor("glitchbound/job-board-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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"
  ]
}' |
apify call glitchbound/job-board-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=glitchbound/job-board-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/3cNHRmfh2urgdifbY/builds/2umCO99LUV9QK4xB2/openapi.json
