# ATS Jobs Monitor — Greenhouse, Lever, Workday & Ashby (`brick_joey_yto/ats-jobs-monitor`) Actor

Pull every open role from any company's job board in one run — Greenhouse, Lever, Ashby, Workday and SmartRecruiters auto-detected from a company name, domain or careers URL. Unified job schema, watch mode for hiring-signal monitoring, no login or API key. $1/1,000 rows.

- **URL**: https://apify.com/brick_joey_yto/ats-jobs-monitor.md
- **Developed by:** [William Billings](https://apify.com/brick_joey_yto) (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

$1.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?

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

## ATS Jobs Monitor — Greenhouse, Lever, Workday, Ashby & SmartRecruiters Scraper

**Scrape every open job from any company in one run.** Pass a list of company names, domains, or careers URLs — the actor detects which applicant tracking system (ATS) each company uses and returns all open roles in one unified schema. No login, no API key — every source is a public job-board API.

Built for recruiters, lead-gen agencies, HR-tech builders, and investors tracking **hiring signals** (a company opening 40 sales roles tells you more than their press release does).

### Why this actor

- **Unified coverage** — Greenhouse, Lever, Ashby, Workday and SmartRecruiters behind one input. Other actors scrape a single ATS; this one auto-detects and normalizes all five
- **Zero auth** — official public board APIs (`boards-api.greenhouse.io`, `api.lever.co`, `api.ashbyhq.com`, `api.smartrecruiters.com`, Workday CXS), not brittle HTML scraping
- **Hiring-signal monitoring** — `watch` mode + scheduled runs = daily alerts on new roles at your target companies
- **ATS detection** — `company` mode answers "which ATS does X use and how many openings do they have" — instant prospecting/research data

### Modes

| Mode      | What it returns                                                                                                                                      |
| --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| `jobs`    | Every open role for each company — title, department, location, remote flag, employment type, post date, salary (when the ATS exposes it), apply URL |
| `watch`   | Same rows filtered by keywords, locations, departments, remote-only and posted-within-days — built for scheduled monitoring                          |
| `company` | One row per company: detected ATS, board token, total opening count, top hiring locations                                                            |

### Input

```json
{
  "mode": "jobs",
  "companies": ["stripe", "openai", "palantir", "boschgroup"]
}
```

**Company inputs accepted:**

- Name or board token: `"stripe"`, `"openai"`, `"boschgroup"` — the actor probes all four keyless APIs and picks the board that responds
- Domain: `"stripe.com"` — same auto-detection
- Careers/job-board URL — most reliable for **Workday**:
  `"https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite"`
- Any `greenhouse.io`, `lever.co`, `ashbyhq.com` or `smartrecruiters.com` board URL is parsed directly

```json
{
  "mode": "watch",
  "companies": ["stripe", "openai", "palantir"],
  "keywords": ["machine learning", "account executive"],
  "locations": ["Remote", "New York"],
  "departments": ["Engineering"],
  "remoteOnly": true,
  "postedWithinDays": 7,
  "maxJobsPerCompany": 200
}
```

### Output (one row per job)

| Field                              | Description                                                  |
| ---------------------------------- | ------------------------------------------------------------ |
| `company`                          | Company as you passed it                                     |
| `ats`                              | greenhouse · lever · ashby · smartrecruiters · workday       |
| `jobId` / `requisitionId`          | ATS-internal identifiers                                     |
| `title`                            | Job title                                                    |
| `department`                       | Department/team where exposed                                |
| `location`                         | Location string(s) — multiple sites joined with `;`          |
| `remote`                           | Boolean remote flag                                          |
| `employmentType` / `workplaceType` | Full-time, contract, on-site, hybrid, remote (varies by ATS) |
| `datePosted` / `dateUpdated`       | ISO timestamps where the ATS exposes them (all but Workday)  |
| `salaryMin/Max/Currency/Interval`  | Lever + Ashby postings that list compensation                |
| `url`                              | Apply URL                                                    |
| `descriptionSnippet`               | First ~320 chars of the posting text                         |

`company` mode rows carry `ats`, `boardToken`, `jobCount`, `topLocations`. Per-company failures (company not found on any ATS) emit `recordType:"error"` rows without killing the run.

### Example output

```json
{
  "recordType": "job",
  "company": "openai",
  "ats": "ashby",
  "jobId": "8fb1615c-34bf-47c4-a1d1-b7b2f836bbd3",
  "title": "Technical Program Manager, Compute Infrastructure",
  "department": "Technical Program Management",
  "location": "San Francisco",
  "remote": false,
  "employmentType": "FullTime",
  "url": "https://jobs.ashbyhq.com/openai/8fb1615c-34bf-47c4-a1d1-b7b2f836bbd3",
  "datePosted": "2026-09-30T17:22:11.000Z",
  "descriptionSnippet": "OpenAI's compute infrastructure team is hiring a TPM to...",
  "scrapedAt": "2026-10-04T13:00:00.000Z"
}
```

### Hiring-signal monitoring

Schedule the actor daily or weekly with `watch` mode and you get a diff-able feed of what's actually new:

```json
{
  "mode": "watch",
  "companies": ["openai", "anthropic", "deepmind"],
  "keywords": ["safety", "research"],
  "postedWithinDays": 1
}
```

New roles in the last 24h — perfect input for an agency pipeline, an AI agent, or a Slack alert.

### Limitations

- **Workday boards must be passed as a URL** (e.g. `https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite`) — tenant/site slugs aren't guessable from the company name
- Workday doesn't expose a machine-readable post date (`datePosted` is null; `datePostedText` carries "Posted 3 Days Ago"), so `postedWithinDays` can't filter Workday rows
- Salary fields appear only where the ATS/employer publishes them (mostly Lever and Ashby)
- Companies that moved ATSes mid-migration can occasionally match the wrong board — pass the exact careers URL to pin it down
- Detection tries up to 4 slug spellings per name; very ambiguous names may need the careers URL

### Pricing

Pay per dataset row — **$1 per 1,000 jobs**. A Fortune-500 sweep typically costs well under a dollar.

### FAQ

**Which companies can I monitor?** Any company with a public board on Greenhouse, Lever, Ashby, SmartRecruiters, or Workday — that's roughly 150,000+ employers, including most of tech, pharma, finance and enterprise software.

**How do I get alerts when a company posts a new role?** Run `watch` mode on a schedule (e.g. daily) with `postedWithinDays: 1` and pipe the dataset into Slack, a spreadsheet, or an AI agent via Apify integrations.

**Can I detect what ATS a lead uses for outreach?** Yes — `company` mode returns the ATS, board token and live opening count per company: instant qualification data for HR-tech sales.

**What if detection picks the wrong board?** Pass the company's careers-page URL instead of the name — URLs are parsed directly against the ATS domains.

**Is it legal to scrape this data?** The actor only accesses publicly available data — the same pages/APIs a browser sees. Scraping public data for research, monitoring, and analysis is common practice, but platform Terms of Service and the rules in your jurisdiction still apply to how you use it. Consult legal counsel for your specific case.

### More from this developer

**Monitors & business intel:** [Sports Scores & Odds Monitor](https://apify.com/brick_joey_yto/sports-scores-odds-monitor) · [Prediction Markets Monitor](https://apify.com/brick_joey_yto/prediction-markets-monitor) · [Crypto Token Monitor](https://apify.com/brick_joey_yto/crypto-token-monitor) · [Crypto Derivatives Monitor](https://apify.com/brick_joey_yto/crypto-derivatives-monitor) · [Google News Monitor](https://apify.com/brick_joey_yto/google-news-monitor) · [App Store Monitor](https://apify.com/brick_joey_yto/app-store-monitor) · [Walmart Product Monitor](https://apify.com/brick_joey_yto/walmart-product-monitor) · [Pump.fun Monitor](https://apify.com/brick_joey_yto/memecoin-launch-monitor) · [StockTwits Scraper](https://apify.com/brick_joey_yto/stocktwits-scraper) · [Yahoo Finance Scraper](https://apify.com/brick_joey_yto/yahoo-finance-scraper) · [Product Hunt Monitor](https://apify.com/brick_joey_yto/product-hunt-monitor) · [Hacker News Monitor](https://apify.com/brick_joey_yto/hackernews-monitor) · [AI Visibility Tracker](https://apify.com/brick_joey_yto/ai-brand-monitor)

**Alt-social & OSINT:** [Gab Scraper](https://apify.com/brick_joey_yto/gab-search-scraper) · [BitChute Scraper](https://apify.com/brick_joey_yto/bitchute-search-scraper) · [Truth Social Scraper](https://apify.com/brick_joey_yto/truth-social-scraper) · [Telegram Scraper](https://apify.com/brick_joey_yto/telegram-scraper) · [Discord Scraper](https://apify.com/brick_joey_yto/discord-scraper) · [Rumble Video Scraper](https://apify.com/brick_joey_yto/rumble-video-scraper) · [Odysee Scraper](https://apify.com/brick_joey_yto/odysee-scraper) · [Kick Scraper](https://apify.com/brick_joey_yto/kick-scraper) · [4chan Scraper](https://apify.com/brick_joey_yto/4chan-scraper) · [Bitcointalk Scraper](https://apify.com/brick_joey_yto/bitcointalk-scraper) · [Xiaohongshu / RedNote Scraper](https://apify.com/brick_joey_yto/xiaohongshu-scraper)

**Creator platforms:** [Bluesky Scraper](https://apify.com/brick_joey_yto/bluesky-search-scraper) · [Threads Scraper](https://apify.com/brick_joey_yto/threads-profile-scraper) · [Farcaster Scraper](https://apify.com/brick_joey_yto/farcaster-scraper) · [Spoutible Scraper](https://apify.com/brick_joey_yto/spoutible-scraper) · [Pixelfed Scraper](https://apify.com/brick_joey_yto/pixelfed-scraper) · [Substack Notes Scraper](https://apify.com/brick_joey_yto/substack-notes-scraper) · [Dailymotion Scraper](https://apify.com/brick_joey_yto/dailymotion-scraper) · [Roblox Scraper](https://apify.com/brick_joey_yto/roblox-scraper)

**Gov & regulatory:** [Federal Register Monitor](https://apify.com/brick_joey_yto/federal-register-monitor) · [Federal Court Monitor](https://apify.com/brick_joey_yto/federal-court-monitor) · [FDA Compliance Monitor](https://apify.com/brick_joey_yto/fda-compliance-monitor) · [Clinical Trials Monitor](https://apify.com/brick_joey_yto/clinical-trials-monitor) · [Lobbying Monitor](https://apify.com/brick_joey_yto/lobbying-monitor)

# Actor input Schema

## `mode` (type: `string`):

jobs = every open role for the companies · watch = jobs filtered by keywords/locations/departments for scheduled monitoring · company = detect which ATS each company uses + opening counts.

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

Company names ('Stripe'), domains ('stripe.com'), or careers/job-board URLs. Workday boards should be passed as their myworkdayjobs.com URL (e.g. https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite).

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

Watch mode — keep jobs whose title, department or description contains any keyword (e.g. 'machine learning', 'account executive').

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

Watch mode — keep jobs whose location contains any of these strings (e.g. 'Remote', 'New York', 'London').

## `departments` (type: `array`):

Watch mode — keep jobs in these departments (e.g. 'Engineering', 'Sales').

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

Watch mode — keep only remote roles.

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

Watch mode — keep only jobs posted in the last N days (where the ATS exposes a post date; Greenhouse, Lever, Ashby and SmartRecruiters do).

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

Cap on rows emitted per company.

## `maxResults` (type: `integer`):

Cap on total rows emitted.

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

Not usually needed — all sources are public job-board APIs.

## Actor input object example

```json
{
  "mode": "jobs",
  "companies": [
    "stripe",
    "openai",
    "palantir"
  ],
  "keywords": [
    "engineer"
  ],
  "locations": [
    "Remote"
  ],
  "departments": [
    "Engineering"
  ],
  "remoteOnly": false,
  "maxJobsPerCompany": 500,
  "maxResults": 500
}
```

# Actor output Schema

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

Dataset containing job, company and error rows

# 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",
        "openai",
        "palantir"
    ],
    "keywords": [
        "engineer"
    ],
    "locations": [
        "Remote"
    ],
    "departments": [
        "Engineering"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("brick_joey_yto/ats-jobs-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 = {
    "companies": [
        "stripe",
        "openai",
        "palantir",
    ],
    "keywords": ["engineer"],
    "locations": ["Remote"],
    "departments": ["Engineering"],
}

# Run the Actor and wait for it to finish
run = client.actor("brick_joey_yto/ats-jobs-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 '{
  "companies": [
    "stripe",
    "openai",
    "palantir"
  ],
  "keywords": [
    "engineer"
  ],
  "locations": [
    "Remote"
  ],
  "departments": [
    "Engineering"
  ]
}' |
apify call brick_joey_yto/ats-jobs-monitor --silent --output-dataset

```

## MCP server setup

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