# Company Job Board Monitor - Greenhouse, Lever, Ashby, Workable (`nefix7/ats-jobs-monitor`) Actor

Get live open jobs straight from company career pages (Greenhouse, Lever, Ashby, Workable). Filter by keyword, location and remote, or get only new jobs since the last run.

- **URL**: https://apify.com/nefix7/ats-jobs-monitor.md
- **Developed by:** [Nefix](https://apify.com/nefix7) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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.

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 Board Monitor: Greenhouse, Lever, Ashby & Workable

Get the **live open jobs of any company** straight from its official career page. Type company names, get clean, structured job postings. No login, no proxies, no browser, no personal data.

Thousands of startups and scale-ups publish their jobs through four hiring platforms: **Greenhouse, Lever, Ashby and Workable**. This Actor reads the public job board API of each platform and returns the same clean format for all of them. The platform is detected automatically.

### What you can do with it

- **Track competitors' hiring.** See which teams a competitor is growing, in which cities, and how fast.
- **Build a job feed or job board** for a niche (for example remote engineering jobs at Series A startups).
- **Get only new jobs.** Turn on "Only new jobs since last run", schedule the Actor daily, and receive just the fresh openings.
- **Sales and recruiting signals.** Companies that hire are companies that buy and grow.
- **Salary research.** Pay ranges are included whenever the company publishes them (for example on Ashby).
- **Fresh, direct data for AI agents and RAG.** Every job links to the original posting.

### Input

| Field | What it does |
|---|---|
| **Companies** | Company slugs (`stripe`), platform-prefixed slugs (`lever:palantir`) or careers page URLs (`https://jobs.ashbyhq.com/ramp`). |
| **Job title keywords** | Keep jobs whose title, department or team contains any keyword. |
| **Locations** | Keep jobs in these places. Add `remote` to include remote jobs. |
| **Remote jobs only** | Only remote jobs. |
| **Posted within last N days** | Only recently published jobs. |
| **Only new jobs since last run** | Skip jobs that an earlier run already returned for that company. |
| **Include full job description** | Adds the description as plain text. |
| **Maximum number of jobs** | Hard cap, newest jobs first. Default is 20. |

Example input:

```json
{
    "companies": ["stripe", "lever:palantir", "https://jobs.ashbyhq.com/ramp", "huggingface"],
    "keywords": ["engineer"],
    "locationFilter": ["remote", "Berlin"],
    "maxItems": 50
}
```

**How to find a company slug:** open the company's careers page. If the address looks like `boards.greenhouse.io/stripe`, `jobs.lever.co/palantir`, `jobs.ashbyhq.com/ramp` or `apply.workable.com/huggingface`, the last part is the slug. You can also paste the whole URL.

### Output

One dataset item per job:

```json
{
    "ats": "ashby",
    "company": "ramp",
    "companyName": null,
    "jobId": "465799ed-c58b-4c6a-a290-2e95b52ef0bb",
    "title": "Tech Lead and Manager (TLM), Production Engineering",
    "department": "Engineering",
    "team": "Engineering",
    "location": "New York, NY (HQ)",
    "locations": ["New York, NY (HQ)"],
    "workplaceType": "hybrid",
    "remote": false,
    "employmentType": "FullTime",
    "postedAt": "2026-09-28T23:10:15.801Z",
    "updatedAt": null,
    "salary": { "min": null, "max": null, "currency": null, "interval": null, "summary": "$240K - $330K" },
    "url": "https://jobs.ashbyhq.com/ramp/465799ed-c58b-4c6a-a290-2e95b52ef0bb",
    "applyUrl": "https://jobs.ashbyhq.com/ramp/465799ed-c58b-4c6a-a290-2e95b52ef0bb/application",
    "scrapedAt": "2026-09-30T11:56:27.804Z"
}
```

Fields that a platform does not provide are `null`. Export as JSON, CSV, Excel or HTML, or use the API.

### Pricing

You pay per job returned (pay-per-event). You never pay for jobs that were filtered out, and you can cap spending with the maximum cost per run in the Apify run options.

### FAQ

**Which platforms are supported?** Greenhouse, Lever (including the EU region), Ashby and Workable. More can be added on request.

**Is this legal?** The Actor only calls the public job board endpoints that these platforms provide so that companies can show their jobs on other sites. It collects job postings only, no login, and no personal data of candidates or employees.

**Does it find every company?** Only companies that use one of the four platforms. If a slug is not found, the Actor logs a warning and continues with the other companies.

**A slug exists on two platforms. Which one is used?** With a plain slug, the platforms are tried in this order: Greenhouse, Lever, Ashby, Workable. Use a prefix like `ashby:ramp` to choose.

**How does "only new jobs" work?** The Actor remembers the job IDs it returned for each company in a storage of your account. Jobs that are no longer open are forgotten automatically.

**Can I run it on a schedule or call it via API?** Yes. Use Apify Schedules, webhooks, the API, or integrations such as Make, Zapier and n8n.

**Do I need proxies?** No.

### Feedback

Found a bug or need another platform? Open an issue in the Actor's Issues tab.

# Actor input Schema

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

One entry per company. Use the company slug from its career page URL (for example "stripe" for boards.greenhouse.io/stripe), or paste the careers page URL. The job platform is detected automatically. To force a platform, write it like "lever:palantir" (greenhouse, lever, ashby, workable).

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

Keep only jobs whose title, department or team contains at least one of these words (case-insensitive). Leave empty for all jobs.

## `locationFilter` (type: `array`):

Keep only jobs located in at least one of these places (text match, for example "Berlin", "United States"). Add "remote" to also include remote jobs. Leave empty for all locations.

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

Return only jobs marked or described as remote.

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

Return only jobs published in the last N days. 0 means no limit. Jobs without a publish date are kept.

## `onlyNewSinceLastRun` (type: `boolean`):

Skip jobs that an earlier run already returned for the same company. Schedule the Actor daily to get a feed of new openings.

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

Add the job description as plain text. Makes runs a bit slower and the output larger.

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

Stop after this many jobs (newest first). You pay per job returned, so keep this low while testing.

## Actor input object example

```json
{
  "companies": [
    "stripe",
    "palantir",
    "ramp"
  ],
  "keywords": [
    "engineer"
  ],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "onlyNewSinceLastRun": false,
  "includeDescription": false,
  "maxItems": 20
}
```

# Actor output Schema

## `results` (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 = {
    "companies": [
        "stripe",
        "palantir",
        "ramp"
    ],
    "keywords": [
        "engineer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nefix7/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",
        "palantir",
        "ramp",
    ],
    "keywords": ["engineer"],
}

# Run the Actor and wait for it to finish
run = client.actor("nefix7/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",
    "palantir",
    "ramp"
  ],
  "keywords": [
    "engineer"
  ]
}' |
apify call nefix7/ats-jobs-monitor --silent --output-dataset

```

## MCP server setup

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