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

Scrape job listings straight from company career pages powered by Greenhouse, Lever, Ashby and SmartRecruiters. Paste a board URL, get structured jobs. No API key needed.

- **URL**: https://apify.com/hussain2407/job-board-scraper.md
- **Developed by:** [Hussain Ali](https://apify.com/hussain2407) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 results

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?

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 — Workday, Greenhouse, Lever, Ashby & More

Export job listings straight from company career pages to JSON, CSV or Excel.

**Paste a job board URL. Get structured jobs.** No API key, no login, no proxies.

Most job scrapers fight LinkedIn or Indeed and break constantly. This one reads the
**official public APIs** of the applicant tracking systems those career pages actually
run on — so it returns complete, accurate data and keeps working.

***

### Supported platforms

| Platform | URL you paste |
|---|---|
| **Workday** | `https://COMPANY.wd5.myworkdayjobs.com/SITE` |
| **Greenhouse** | `https://boards.greenhouse.io/COMPANY` |
| **Lever** | `https://jobs.lever.co/COMPANY` |
| **Ashby** | `https://jobs.ashbyhq.com/COMPANY` |
| **SmartRecruiters** | `https://careers.smartrecruiters.com/COMPANY` |
| **Personio** | `https://COMPANY.jobs.personio.de` |
| **Teamtailor** | `https://COMPANY.teamtailor.com` |
| **Breezy HR** | `https://COMPANY.breezy.hr` |

The platform is detected automatically from the URL. Hundreds of thousands of companies —
from seed-stage startups to most of the Fortune 500 — publish through these eight systems.
Workday alone powers the careers site of a large share of the Fortune 500.

***

### Quick start

1. Click **Try for free**
2. Press **Start** with the defaults — you'll get real jobs immediately
3. Swap in the career-page URLs of the companies you care about

***

### What you get per job

| Field | Example |
|---|---|
| `title` | Security Engineer, Cloud |
| `company` / `companyName` | ramp / Ramp |
| `department` / `team` | Engineering / Backend |
| `employmentType` | FullTime |
| `location` / `locations` | New York, NY (HQ) / Remote (Canada) |
| `isRemote` / `workplaceType` | true / Hybrid |
| `country` | USA |
| `url` / `applyUrl` | direct links to the posting and application |
| `compensationSummary` | $211.4K – $290.6K • Offers Equity |
| `description` | full job description as clean text |
| `postedAt` / `updatedAt` | ISO 8601 UTC timestamps |

Compensation is included wherever the company publishes it (common on Ashby).

***

### Filters

- **Job title contains** — e.g. `engineer`
- **Location contains** — e.g. `London` or `Germany`
- **Remote jobs only**
- **Include full job description** — turn off for smaller, faster results
- **Maximum jobs** — cap any run

***

### Who uses this

- **Recruiters and sourcers** tracking who is hiring, and for what
- **Job boards and aggregators** filling listings from real company sources
- **Market intelligence** — headcount signals, hiring trends, salary benchmarks
- **Job seekers** monitoring target companies for new openings
- **AI / RAG pipelines** needing clean, structured job data

***

### Why it is reliable

Every platform here exposes a documented public JSON API. There is no HTML parsing, no
anti-bot layer and no login, so the usual causes of scraper rot do not apply. Requests are
retried with exponential backoff, and a company whose board has closed is skipped with a
warning instead of failing the whole run.

***

### Notes & limits

- Only **public, listed** jobs are returned — the same postings anyone can view.
- SmartRecruiters does not include descriptions in its listing response, so `description`
  is empty for that platform. Every other field is populated.
- A small share of Lever postings have no description text published by the company.
- Teamtailor does not publish employment type or department in its feed, so those
  fields are empty for that platform.
- Workday keeps descriptions behind a per-job detail call, so `description` is empty there;
  its `postedLabel` field carries Workday’s relative date text (e.g. "Posted Today").
- Workable is **not** supported: its public widget endpoint returned zero jobs for every
  account tested, so including it would have meant shipping a feature that silently
  returns nothing.

***

### Is this legal?

This Actor reads publicly available job listings through official public APIs — the same
postings any visitor can see. You receive the results directly; nothing is stored or resold
by this Actor. You are responsible for how you use the output.

***

### Questions or a bug?

Open an issue on the **Issues** tab. Bug reports are usually fixed within a few days.

# Actor input Schema

## `boardUrls` (type: `array`):

Paste any company career-board URL. Supported: boards.greenhouse.io/COMPANY, jobs.lever.co/COMPANY, jobs.ashbyhq.com/COMPANY, careers.smartrecruiters.com/COMPANY. The platform is detected automatically.

## `titleFilter` (type: `string`):

Only keep jobs whose title contains this text, e.g. engineer. Leave empty for all jobs.

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

Only keep jobs whose location contains this text, e.g. London or Germany.

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

Keep only jobs flagged or described as remote.

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

Include the full job description text. Turn off for smaller, faster results.

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

Stop after this many jobs. Keep it low for a first test run.

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

Optional. Instead of URLs, give pairs like \[{"platform":"greenhouse","company":"stripe"}]. Platforms: greenhouse, lever, ashby, smartrecruiters.

## Actor input object example

```json
{
  "boardUrls": [
    "https://boards.greenhouse.io/stripe",
    "https://jobs.lever.co/spotify",
    "https://jobs.ashbyhq.com/ramp"
  ],
  "titleFilter": "",
  "locationFilter": "",
  "remoteOnly": false,
  "includeDescription": true,
  "maxItems": 200,
  "companies": []
}
```

# Actor output Schema

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

No description

## `resultsCsv` (type: `string`):

No description

## `datasetInConsole` (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 = {
    "boardUrls": [
        "https://boards.greenhouse.io/stripe",
        "https://jobs.lever.co/spotify",
        "https://jobs.ashbyhq.com/ramp"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("hussain2407/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 = { "boardUrls": [
        "https://boards.greenhouse.io/stripe",
        "https://jobs.lever.co/spotify",
        "https://jobs.ashbyhq.com/ramp",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("hussain2407/job-board-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 '{
  "boardUrls": [
    "https://boards.greenhouse.io/stripe",
    "https://jobs.lever.co/spotify",
    "https://jobs.ashbyhq.com/ramp"
  ]
}' |
apify call hussain2407/job-board-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hussain2407/job-board-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/2lc8foRSVCU4aC9VO/builds/dbDJWQOOpIJ60UKFm/openapi.json
