# Greenhouse, Lever and Ashby Jobs Scraper with New Job Alerts (`dynamic_jingle/ats-job-boards-greenhouse-lever-ashby`) Actor

Pull every open job from company career pages on Greenhouse, Lever and Ashby through their official public job board APIs. Keyword, location, remote and date filters, salary where posted, and a monitor mode that returns only new postings for hiring-signal leads.

- **URL**: https://apify.com/dynamic_jingle/ats-job-boards-greenhouse-lever-ashby.md
- **Developed by:** [Scott Davidson](https://apify.com/dynamic_jingle) (community)
- **Categories:** Lead generation, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 job postings

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

## Greenhouse, Lever and Ashby Jobs Scraper with New Job Alerts

**What it does:** give it a list of companies and it returns every open job from their Greenhouse, Lever or Ashby career page in one clean format. Filter by title keyword, location, remote, department and posting date. Turn on monitor mode to get only new postings since your last run, which makes it a ready-made hiring-signal feed for sales and recruiting.

Data comes from the official public job board APIs that Greenhouse, Lever and Ashby provide so companies can syndicate their openings. No login, no cookies, no browser, no proxies.

### Who uses it and why

- **Sales and GTM teams:** a company hiring its first RevOps lead, a new SDR team or a data engineer is a buying signal. Schedule the monitor weekly on your target account list and push new postings into Clay, HubSpot or Salesforce.
- **Recruiters and staffing agencies:** see every new role at your client and prospect companies the day it goes live, with apply links.
- **Investors and analysts:** track headcount plans and hiring velocity across a portfolio or a competitor set.
- **Job seekers and job boards:** build a niche board (remote data jobs, fintech sales roles) from hundreds of company boards at once.

### Input

| Field | Example | Notes |
|---|---|---|
| companies | `stripe`, `https://jobs.lever.co/spotify`, `ashby:ramp` | URL, prefixed slug or bare slug |
| mode | `search` or `newPostings` | monitor returns only jobs not seen before |
| keywords | `["account executive", "sdr"]` | title contains any |
| excludeKeywords | `["intern"]` | |
| locations | `["New York", "Remote"]` | location text contains any |
| remoteOnly | `true` | |
| departments | `["Sales"]` | |
| postedWithinDays / postedAfter | `7` / `2026-10-01` | |
| includeDescription | `true` | plain text and HTML |
| maxResults | `500` | caps cost |
| monitorId | `sales-hiring-weekly` | one per feed |

Example input:

```json
{
  "companies": ["stripe", "https://jobs.lever.co/spotify", "https://jobs.ashbyhq.com/ramp"],
  "mode": "newPostings",
  "keywords": ["sales", "revops", "account executive"],
  "locations": ["United States", "Remote"],
  "monitorId": "gtm-hiring-signals"
}
```

### Output

One row per job, same fields for all three ATSs:

```json
{
  "ats": "ashby",
  "companySlug": "ramp",
  "companyName": "ramp",
  "jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "title": "Security Engineer, Cloud",
  "department": "Engineering",
  "team": "Backend",
  "location": "New York, NY (HQ)",
  "allLocations": ["New York, NY (HQ)", "Remote (Canada)"],
  "country": "USA",
  "isRemote": true,
  "workplaceType": "hybrid",
  "employmentType": "FullTime",
  "salary": { "min": 211400, "max": 290600, "currency": "USD", "interval": "1 YEAR", "summary": "$211.4K - $290.6K, Offers Equity" },
  "postedAt": "2026-04-07T17:12:35.753Z",
  "jobUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
  "descriptionText": "About Ramp ...",
  "isNewPosting": true,
  "firstSeenAt": "2026-10-18T20:51:44.527Z",
  "scrapedAt": "2026-10-18T20:51:44.527Z"
}
```

Salary is filled when the company publishes it (common on Ashby and on Lever for US roles). A RUN_SUMMARY record in the key-value store lists open job counts per company and any company whose board was not found.

### Pricing

Pay per event, no subscription:

- **Actor start:** $0.001 per run
- **Job posting (search mode):** $0.0015 per job returned
- **New job posting (monitor mode):** $0.002 per new job returned

A weekly monitor on 200 target accounts that finds 150 new relevant roles costs about $0.30. Jobs filtered out by your keywords or seen in earlier runs are free.

### How to find a company slug

Open the company's careers page and look at the URL. `job-boards.greenhouse.io/figma` means slug `figma` on Greenhouse, `jobs.lever.co/netflix` means `netflix` on Lever, and `jobs.ashbyhq.com/notion` means `notion` on Ashby. You can paste the full URL instead.

### FAQ

**Is this allowed?** The Actor only reads the public job board endpoints that each ATS documents for listing a company's open jobs. It respects Lever's one-second crawl delay and never logs in.

**Which ATSs are supported?** Greenhouse, Lever (US and EU) and Ashby. Workday and others may come later.

**Can AI agents use it?** Yes. It needs no special permissions, has clear input fields and returns structured JSON.

# Actor input Schema

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

Companies to pull jobs from. Enter a career page URL (https://boards.greenhouse.io/stripe, https://job-boards.greenhouse.io/stripe, https://jobs.lever.co/spotify, https://jobs.ashbyhq.com/ramp), a prefixed slug (greenhouse:stripe, lever:spotify, ashby:ramp), or a bare slug like "stripe". Bare slugs are tried on Greenhouse, then Lever, then Ashby.

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

Use "search" to export every open job that matches your filters. Use "newPostings" to return only jobs that appeared since your last run with the same Monitor ID. The first monitor run returns jobs posted in the last 7 days (or since your date filter) and remembers the rest. Schedule it daily or weekly for a hiring-signal feed with no duplicates.

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

Return jobs whose title contains any of these words (case-insensitive). Examples: "sales", "account executive", "revops", "data engineer". Leave empty for all jobs.

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

Skip jobs whose title contains any of these words. Examples: "intern", "senior", "manager".

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

Return jobs whose location text contains any of these values (case-insensitive). Examples: "New York", "London", "United States", "US", "Remote".

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

Return only jobs marked remote by the ATS or with "Remote" in the location.

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

Return jobs whose department or team contains any of these words. Examples: "Sales", "Engineering", "Marketing".

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

Return only jobs first published in the last N days. 0 means no limit. Example: 7.

## `postedAfter` (type: `string`):

Return only jobs first published on or after this date (YYYY-MM-DD). Ignored when "Posted within last N days" is set. Example: 2026-10-01.

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

Include the full description as plain text and HTML. Turn off for smaller, faster output.

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

Stop after this many jobs in total. 0 means no limit. You pay per job returned, so this caps cost.

## `monitorId` (type: `string`):

Name for the monitor's memory in New postings mode. Use a different ID for each separate feed, for example "sales-hiring-weekly".

## Actor input object example

```json
{
  "companies": [
    "stripe",
    "https://jobs.lever.co/spotify",
    "https://jobs.ashbyhq.com/ramp"
  ],
  "mode": "search",
  "remoteOnly": false,
  "postedWithinDays": 0,
  "includeDescription": true,
  "maxResults": 1000,
  "monitorId": "default"
}
```

# Actor output Schema

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

Open jobs from Greenhouse, Lever, and Ashby career pages.

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

Per-company board detection, open-job counts, and monitor baseline flags.

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

// Run the Actor and wait for it to finish
const run = await client.actor("dynamic_jingle/ats-job-boards-greenhouse-lever-ashby").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",
        "https://jobs.lever.co/spotify",
        "https://jobs.ashbyhq.com/ramp",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("dynamic_jingle/ats-job-boards-greenhouse-lever-ashby").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",
    "https://jobs.lever.co/spotify",
    "https://jobs.ashbyhq.com/ramp"
  ]
}' |
apify call dynamic_jingle/ats-job-boards-greenhouse-lever-ashby --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dynamic_jingle/ats-job-boards-greenhouse-lever-ashby"
        }
    }
}
```

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/CIjT6KV0Yb5LSBqK3/builds/bqy0U61GYmQ28RcUT/openapi.json
