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

Get every open job from Greenhouse, Lever, Ashby, SmartRecruiters and Workable in one table. Auto-detects boards, salaries, filters, only-new-jobs monitoring.

- **URL**: https://apify.com/tidyrowsfetcher/company-job-boards-scraper.md
- **Developed by:** [TidyRows Data](https://apify.com/tidyrowsfetcher) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 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/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

Get **every open job from company career pages** in one clean table. Paste company names or links, and the Actor finds the company's job board on **Greenhouse, Lever, Ashby, SmartRecruiters or Workable** (the applicant tracking systems, or ATS, behind most tech and startup career sites) for you.

- 🔎 **Auto-detects the board.** Works with a name (`OpenAI`), a board link (`jobs.lever.co/spotify`) or the company's own careers page (`figma.com/careers`).
- 🧹 **One format for all five systems.** Same columns whichever system a company uses.
- 💰 **Salaries** when the company publishes them, as numbers (min, max, currency, per year/month/hour).
- 📄 **Full job descriptions** as clean plain text, ready for spreadsheets or AI tools.
- 🎯 **Filters** for keywords, excluded words, locations, remote only and posting date.
- 🔔 **Only new jobs.** Schedule it daily and get just the openings you haven't seen before.
- ⚡ **Fast and reliable.** It reads the official public job feeds, with no browser and no proxies, so runs take seconds.

### What can I use it for?

- **Job seekers:** watch your dream companies and get new roles the day they're posted.
- **Recruiters & agencies:** track hiring at target accounts and spot who is growing.
- **Sales & market research:** hiring is a buying signal. See which companies are hiring for what.
- **Job boards & newsletters:** feed your site with fresh roles from hundreds of companies.
- **Data & AI projects:** build datasets of job descriptions, skills and salaries.

### How to use it

1. Add companies under **Companies**, one per line. Mix names and links freely:
   ```
   OpenAI
   https://jobs.lever.co/spotify
   https://boards.greenhouse.io/stripe
   https://www.figma.com/careers
   ```
2. Optional: add filters, such as keywords `engineer`, `analyst`, location `Singapore` or `remote`.
3. Click **Start**. Download results as Excel, CSV, JSON or HTML, or fetch them via API.

#### Monitoring new jobs

Turn on **Only new jobs since the last run**, then create a **Schedule** (e.g. daily at 9:00). The first run returns every matching job; each later run returns only jobs that weren't delivered before. Use **Monitor name** to keep separate watches (for example `engineering-sg` and `sales-us`).

### Output

One row per job:

```json
{
  "id": "ashby:openai:240d459b-696d-43eb-8497-fab3e56ecd9b",
  "source": "ashby",
  "company": "OpenAI",
  "title": "Research Engineer",
  "department": "Research",
  "team": "Research",
  "location": "San Francisco",
  "locations": ["San Francisco"],
  "country": "United States",
  "remote": null,
  "workplaceType": null,
  "employmentType": "FullTime",
  "postedAt": "2026-04-05T00:03:20+00:00",
  "url": "https://jobs.ashbyhq.com/openai/240d459b-...",
  "applyUrl": "https://jobs.ashbyhq.com/openai/240d459b-.../application",
  "salaryMin": 250000,
  "salaryMax": 445000,
  "salaryCurrency": "USD",
  "salaryInterval": "year",
  "salaryText": "$250K - $445K",
  "description": "As a Research Engineer here, you will...",
  "scrapedAt": "2026-10-12T07:07:14+00:00"
}
```

Fields a company doesn't publish are `null`. A **SUMMARY** record in the run's key-value store lists, for each input line, the board found, the number of open jobs and the number delivered, or why a line failed.

### How much does it cost?

You pay **per job delivered**: about **$1.50 per 1,000 jobs**, plus Apify's standard start charge of $0.00005 per run. Jobs removed by your filters, and jobs already delivered in monitoring mode, are free. Set a maximum cost per run in the run options, and the Actor stops cleanly when it's reached.

| Example | Jobs | Cost |
|---|---|---|
| One mid-size company | ~150 | ~$0.23 |
| 20 companies, engineering roles only | ~400 | ~$0.60 |
| Daily monitor of 50 companies (new jobs only) | ~30/day | ~$1.35/month |

### Supported job boards

| System | Example links | Salary |
|---|---|---|
| Greenhouse | `boards.greenhouse.io/x`, `job-boards.greenhouse.io/x`, embedded boards | When published |
| Lever | `jobs.lever.co/x`, `jobs.eu.lever.co/x` | When published |
| Ashby | `jobs.ashbyhq.com/x` | Yes, often |
| SmartRecruiters | `jobs.smartrecruiters.com/x`, `careers.smartrecruiters.com/x` | From description text |
| Workable | `apply.workable.com/x`, `x.workable.com` | From description text |

Salaries found in description text are detected only when a currency and a range are both present (e.g. `$120,000 – $150,000`).

### Tips

- If a **name** isn't found, paste the company's careers page link instead. Different companies use different codes.
- Careers pages that load their job list with JavaScript are matched by their domain name (e.g. `cloudflare.com`).
- Very large employers (thousands of jobs) can be capped with **Max jobs per company**.

### Integrations

Send results anywhere with Apify integrations: **Google Sheets, Slack, Zapier, Make, n8n**, webhooks, or the **API** (Python, JavaScript, HTTP). A common setup is a daily schedule plus *Only new jobs* plus a Slack or Google Sheets integration, so new openings arrive automatically.

### FAQ

**Which companies use these systems?** Thousands, including Stripe, Figma and Cloudflare (Greenhouse), Spotify (Lever), OpenAI and Notion (Ashby), ServiceNow and Canva (SmartRecruiters), and Hugging Face (Workable).

**Can I scrape Workday, LinkedIn or Indeed?** Not with this Actor. It focuses on the five systems above, where official public feeds make it fast and reliable.

**Why is salary empty for some jobs?** Many companies don't publish pay. When they do (in the posting or the job text), it's filled in.

### Is it legal?

The Actor reads only **public job postings** that companies publish through their hiring systems' official public feeds. It collects no personal data. You are responsible for using the data in line with applicable laws and the sites' terms.

# Actor input Schema

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

One per line: a company name (e.g. <code>openai</code>), a job board link (e.g. <code>https://jobs.lever.co/spotify</code>) or the company's own careers page. Greenhouse, Lever, Ashby, SmartRecruiters and Workable boards are detected automatically.

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

Keep only jobs whose title contains at least one of these words or phrases (e.g. <code>engineer</code>, <code>data analyst</code>). Leave empty for all jobs.

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

Drop jobs whose title contains any of these (e.g. <code>intern</code>, <code>senior</code>).

## `searchInDescription` (type: `boolean`):

Match keywords against the full description as well as the title.

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

Keep only jobs in one of these places (city, country or <code>remote</code>), e.g. <code>Singapore</code>, <code>London</code>, <code>remote</code>.

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

Keep only jobs marked remote by the company.

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

Keep only jobs posted in the last N days. Leave empty for any date.

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

Turn on and schedule this Actor (e.g. daily) to receive only jobs you haven't received before. The first run returns everything that matches.

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

Keeps separate 'already seen' lists for different watches (e.g. <code>engineering-sg</code>). Only used with 'Only new jobs'.

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

Clean plain-text description of each job.

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

Stop after this many matching jobs per company. Leave empty for no limit.

## Actor input object example

```json
{
  "companies": [
    "https://apply.workable.com/huggingface",
    "https://jobs.lever.co/spotify"
  ],
  "searchInDescription": false,
  "remoteOnly": false,
  "onlyNewJobs": false,
  "includeDescription": true
}
```

# Actor output Schema

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

One row per open job, in the same format for every hiring system.

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

Per input line: the job board found, open jobs, jobs delivered, or why it failed.

# 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://apply.workable.com/huggingface",
        "https://jobs.lever.co/spotify"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidyrowsfetcher/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": [
        "https://apply.workable.com/huggingface",
        "https://jobs.lever.co/spotify",
    ] }

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

```

## MCP server setup

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