# Greenhouse, Lever & Ashby Job Scraper + New Job Monitor (`bridgeworks/ats-job-monitor`) Actor

Watch any company's Greenhouse, Lever, or Ashby job board and get only what changed: job added, job changed, job closed. Uses the official public ATS APIs, so no proxies and no login. One normalized schema across all three, with webhook events for Slack, Zapier, Make, or n8n on every run.

- **URL**: https://apify.com/bridgeworks/ats-job-monitor.md
- **Developed by:** [Bridgeworks](https://apify.com/bridgeworks) (community)
- **Categories:** Jobs, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 board checkeds

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 Monitor: know the moment a company's hiring changes

Point this Actor at any company's job board on **Greenhouse**, **Lever**, or **Ashby** and run it on a schedule. It keeps a snapshot of every board and reports precise events each run: **job-added**, **job-changed** (title, location, or team edited), **job-closed**. Optionally it POSTs those events to your webhook: silence costs nothing.

Job lists are everywhere; *changes* are the signal. New roles reveal strategy and budgets, closed roles reveal freezes, a changed location reveals remote policy: and recruiters, sales teams, job seekers, and AI agents all pay for that signal, not for another list.

### Why this one

- **Official public APIs, not scraping.** Greenhouse, Lever, and Ashby publish these job feeds for exactly this purpose. No anti-bot arms race, no breakage cycle, no gray area.
- **Stateful, so it reports events, not lists.** The first run records a baseline. Every run after that tells you exactly what changed, with the job URL. An identical board produces zero events and zero noise.
- **Webhook when it matters.** Wire it to Slack, Make, n8n, or your own endpoint; you get called only when something happened.
- **Free demo run.** Press Start with no input: a built-in sample board shows all three event kinds so you can see the exact output shape before watching anything real.

### Setup in 30 seconds

Targets are `ats:company-slug`, one per line: the slug is right in the board URL:

```
greenhouse:stripe        <- boards.greenhouse.io/stripe
lever:spotify            <- jobs.lever.co/spotify
ashby:openai             <- jobs.ashbyhq.com/openai
```

Create an Apify **Schedule** (daily or hourly), attach this Actor, done.

### Output

**Dataset**: every open job per board (`title`, `location`, `department`, `url`) plus one row per event.
**OUTPUT record**: per-board summary and the full event list.

### Pricing

| Event | Price |
| --- | --- |
| Run start | $0.01 |
| Board checked | $0.05 per board |

A daily watch of 10 companies costs $0.51/day. No subscription, no per-job fees, demo runs free. If your run has a spending cap, the Actor checks exactly as many boards as the cap covers and says so.

### FAQ

**Which ATS platforms are supported?**
Greenhouse, Lever, and Ashby at launch: together they cover most tech-company boards. Workable is on the roadmap; ask in Issues if you need another.

**What counts as "changed"?**
Title, location, or department edits to an existing posting. Description-only edits are ignored deliberately: they fire constantly and mean nothing.

**Can an AI agent use this?**
Yes. Pay-per-event pricing makes it callable via Apify's MCP server and agentic payments, and the event list is machine-readable: an agent can watch competitors' boards and act on changes.

**What if a slug is wrong?**
The run tells you exactly which URL failed and what a valid slug looks like, and other boards in the same run still complete.

***

### More from Bridgeworks

We build small, dependable data plumbing for automations and AI agents. Every Bridgeworks Actor has a free demo run, plain-English errors, and pay-per-event pricing that AI agents can call directly.

- **[Google Sheets Import & Export](https://apify.com/bridgeworks/sheets-bridge)**: push any Apify dataset into Google Sheets (or pull a sheet back in) using service-account auth, so nothing ever expires mid-schedule.
- **[AI Answer Watch](https://apify.com/bridgeworks/ai-answer-watch)**: track what ChatGPT Search, Google AI Overviews, and Perplexity say about your brand, with share-of-voice scoring and change alerts.
- **[Job Board Monitor](https://apify.com/bridgeworks/ats-job-monitor)**: watch any company's Greenhouse, Lever, or Ashby board and get events the moment a job is added, changed, or closed.

Built by Bridgeworks: clear errors, honest metering, and nothing that expires.

# Actor input Schema

## `targets` (type: `array`):

One per line, in the form ats:company-slug. Examples: greenhouse:stripe, lever:spotify, ashby:openai. The slug is the company name in the board URL (boards.greenhouse.io/SLUG, jobs.lever.co/SLUG, jobs.ashbyhq.com/SLUG). Leave empty for a FREE demo run on a sample board: nothing is fetched or charged.

## `webhookUrl` (type: `string`):

Optional. POSTed with the event list whenever jobs are added, changed, or closed. First run records a baseline and never alerts. No events, no call.

## Actor input object example

```json
{}
```

# Actor output Schema

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

Boards checked, open-job counts, and the event list (added/changed/closed).

## `rows` (type: `string`):

One item per open job plus one per detected event.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("bridgeworks/ats-job-monitor").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("bridgeworks/ats-job-monitor").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 '{}' |
apify call bridgeworks/ats-job-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bridgeworks/ats-job-monitor"
        }
    }
}

```

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/qDCslZY5FvR3PNdFC/builds/dS65gWDzW2a34iN0F/openapi.json
