# Job Board API — Live Listings (Greenhouse, Lever, Ashby) (`teamkamkod/ats-job-boards-api`) Actor

Structured job postings from company ATS boards. Scan greenhouse, lever, Ashby & Recruitee boards for open roles, or enable hiring-intel mode for company hiring velocity, intent roles you define (intentKeywords) and new-role deltas (watchId).

- **URL**: https://apify.com/teamkamkod/ats-job-boards-api.md
- **Developed by:** [Team Kamkod](https://apify.com/teamkamkod) (community)
- **Categories:** Jobs, Business, Automation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.10 / 1,000 job-listings

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 API — Live Job Listings (Greenhouse, Lever & Ashby)

Search live job postings across **800 validated company career boards** (Greenhouse, Lever, Ashby,
Recruitee) — pulled from each company's **official public API**, no login, no CAPTCHA, no fragile
HTML parsing. Type what you're looking for, get clean JSON rows. Also powers a **hiring-intel**
feature that turns job openings into sales leads.

### Two ways to use it

#### 1) 🔎 Search mode — type criteria, get jobs (across 800 companies)

Open the actor, pick **"All catalog — 800 companies (search mode)"**, type your criteria — done.
No per-company setup, no board IDs to learn:

```json
{
  "boardPreset": "All catalog — 800 companies (search mode)",
  "keywords": ["sales", "account"],
  "sinceDays": 7,
  "remoteOnly": false
}
```

Every matching opening is returned as a row (`kind: job`, charged `job-listing`): `title`,
`department`, `location`, `is_remote`, `employment_type`, `published_at`, direct `url`, plus the
company (`board_type`/`org`). Companies without matching jobs are skipped — you only pay for
rows you receive.

#### 2) 🧠 Hiring-intel mode — target companies, get leads

Pick a targeted pack (or Custom companies), turn `intel` on, and each company returns one
**hiring-intel report** (`kind: company`, charged `hiring-intel`): open jobs, hiring velocity
(posted/updated ≤7 & ≤30 days), top departments, **intent roles** matching *your* ICP keywords,
and what's **NEW since your last scan** (`watchId`) — companies posting your ICP roles this week
are your warmest outreach targets.

```json
{
  "boardPreset": "Scale-ups — 7 boards (GH×5 + Ashby×2)",
  "intel": true,
  "watchId": "agency-watchlist-eu",
  "intentKeywords": ["revops", "sales ops", "customer success", "head of operations"]
}
```

> Catalog mode = job search only. Hiring-intel is designed for a *targeted* watchlist — that's
> where its signal is meaningful. `keywords` filters job rows; `intentKeywords` drives intent.

### Companies input — 3 ways (Custom mode)

- **Company name** — `Airbnb`, `Notion`, `bunq`… auto-resolved to its public board (Greenhouse,
  Lever, Ashby, Recruitee)
- **Board id** — `greenhouse:coinbase`, `ashby:notion`, `recruitee:bunq`, `lever:org`
- **Careers URL** — `https://boards.greenhouse.io/airbnb` (Workday requires the full URL: custom domains)

Unresolvable names return a clean per-company error — the rest of the run continues.

### Catalog coverage (800 boards, validated live)

| Platform | Live boards | Sample |
|---|---|---|
| Greenhouse | 412 | 2K, 3 Day Blinds (Sales), ABC Legal Services, ACCEL Schools, ADESA, AEG Worldwide, ALO, ALTEN Technology USA, ASM, AST SpaceMobile, Accenture Federal Services, Addepar, Advanced Technology Services, Adyen, Affirm, Agoda, Airbnb, Alarm.com, … and 394 more |
| Ashby | 220 | 10x Team, 1Password, 1X, 3Y Health, Adaptive Home Health, Air Apps, Airbyte, Airwallex, Alan, Allara, Almedia, Alpaca Health, Antares, Apex Technology, Inc., Apple Roofing, Applied Intuition, Ashby, Astera Institute, … and 202 more |
| Lever | 160 | 15five, 21st Century Home Health Services Inc., 360Learning, 3Pillar, ABM Industries, AHEAD, AIFund, AMIRI, AMT Engineering, ANA, ANS, AO Garcia Agency, APCO Holdings, APPLY, ARC'TERYX, ARSIEM, ATI Business Group, Above and Beyond Therapy, … and 142 more |
| Recruitee | 8 | bunq, clay, gong, google, invision, meta, multiplier, personio |

Catalogue refreshed weekly (dead boards removed, new live ones added) from a pool of 8 000+ validated company slugs. Slug directory source: LastRound AI ATS Company Directory (CC BY 4.0).

Boards are re-verified against their live APIs before shipping; per-company errors are localized,
never fatal.

### Input reference

| Parameter | Default | Description |
|---|---|---|
| `boardPreset` | `All catalog — 800 companies (search mode)` | Full-catalog search (default) · targeted packs · Custom |
| `boards` | `[]` | Custom mode: company names, board ids or careers URLs |
| `keywords` | `[]` | Keep jobs whose title/department/location match (OR). Empty = all |
| `remoteOnly` | `false` | Drop explicitly non-remote jobs |
| `sinceDays` | `0` | Freshness window (0 = no date filter) |
| `intel` | `false` | Emit one hiring-intel report per scanned company |
| `intentKeywords` | `[]` | ICP roles for intent detection (required for intent; empty = no intent) |
| `watchId` | – | Stable watchlist id → deltas (`new_count`/`new_roles`) vs previous scan |
| `maxJobsPerBoard` | `500` | Per-board cap (auto-capped at 30 in catalog mode for predictable spend) |

### Filters

- `keywords` — OR-match on title/department/location (`["sales", "account"]`)
- `remoteOnly` — excludes explicitly on-site jobs
- `sinceDays` — `7` = weekly-digest pattern

### Output

Two dataset views: **Jobs** (one row per job) and **Hiring-intel reports** (one row per company
when `intel: true`). Runs returning nothing cost nothing.

### Pricing

Pay-per-event, no platform-usage charges on results: **`job-listing`** $0.0001 per job
returned ($0.10 per 1,000 jobs), **`hiring-intel`** $0.02 per company report. Predictable
spend: catalog mode caps each board at 30 jobs → a full 800-company scan is hard-capped at
24,000 rows ≈ **$2.40 max** (typical keyword scan: $1-2.50). A single-company scan is
usually < $0.05.

### Set it on a schedule

Hiring signals are only useful as a *trend*. Schedule this Actor weekly on your watchlist:
same boards, same keywords — each run gives you the new postings delta, and with
`hiring-intel` + a `watchId` it also tracks velocity (7/30-day) and surfaces the intent
roles you care about. Run-to-run deltas are what make it a leading indicator, not a snapshot.

### Integrations

- **AI agents / MCP** — run it through the Apify MCP server (`https://mcp.apify.com`)
- **Python/JS** — official `apify-client`, or REST: start a run, wait, read the dataset
- **Schedules/webhooks** — set a weekly cron on your watchlist for a hiring digest

### Why it exists

- **Zero-maintenance data** — official ATS JSON APIs (Greenhouse `boards-api`, Lever `postings`,
  Ashby `posting-api`, Recruitee `api/offers`): stable, documented, no anti-bot
- **Hiring signal = leading indicator** — new postings reveal where companies invest: sales
  outreach, recruiting, market analysis
- **Agent-ready** — one call = current openings across your whole universe of companies

### FAQ

**Why zero results?** Your filters excluded everything (`sinceDays` too small, keywords too
narrow, company board has no current openings) — clear the filters to widen. A board with 0 open
jobs are simply skipped.

**Can I scan a company not in the catalog?** Yes — Custom mode: type its name (auto-resolved if
it runs Greenhouse/Lever/Ashby/Recruitee), or paste its careers URL (any ATS, incl. Workday).

**Is that legal?** Data comes from companies' own public career APIs; the actor bypasses no
access control. Respect each target's terms.

**Workday / SmartRecruiters / Teamtailor?** Workday & SmartRecruiters public APIs are in
maintenance/empty (09/2026) — pullers ready, reactivated when platforms return. Teamtailor
requires a key — no keyless support.

### Roadmap

- ✅ v1.2+: Recruitee · preset dropdown · smart company-name lookup · **v0.2: catalog search mode
  (800 companies)**
- Negative keywords (`-staff`) & title-only matching
- Extended catalog (Workday hosts when platform returns)

# Actor input Schema

## `boardPreset` (type: `string`):

Search mode: 'All catalog — 800 companies' scans every validated company board (Greenhouse/Lever/Ashby/Recruitee) — just type your criteria (keywords, sinceDays) and search. Or pick a targeted pack for a small watchlist. Choose 'Custom' to define your own companies below (type the name, a board id or paste a careers URL — auto-detected). Catalog mode = job search only (no hiring-intel); targeted packs & Custom support both. Default when omitted: full-catalog search mode (so API/MCP callers get results from a minimal input).

## `boards` (type: `array`):

Only needed when boardPreset is 'Custom'. One entry per company — EASIEST: just type the company name (Airbnb, Notion, bunq... auto-detected across Greenhouse/Lever/Ashby/Recruitee), or paste its careers URL (https://boards.greenhouse.io/airbnb...), or use board:org (greenhouse:coinbase, ashby:notion, recruitee:bunq). Workday: full URL required. Empty = no scan.

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

Keep only jobs whose title, department or location contains one of these (case-insensitive). Empty = all jobs of the scanned boards.

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

Drop jobs explicitly marked as non-remote. Default: false.

## `sinceDays` (type: `integer`):

Keep only roles whose board timestamp is newer than N days (weekly digest pattern: 7). 0 = no date filter.

## `intel` (type: `boolean`):

Emit one hiring-intel report per scanned company (charged as hiring-intel): open roles, velocity (posted ≤7/≤30 days), top departments, intent roles and growth flags. Pair with watchId to get new\_count/new\_roles vs your previous scan.

## `intentKeywords` (type: `array`):

REQUIRED for intent detection: the roles/titles that make a job an intent match for you (e.g. "revops", "sales ops", "customer success", "product manager"). Empty = no intent detection (intent\_roles stays empty). Each watchlist has its own list.

## `watchId` (type: `string`):

Stable id for this watchlist. When set, the actor remembers the job ids it returned (actor key-value store) and hiring-intel reports include what is NEW since the previous scan. Use a different id per watchlist.

## `maxJobsPerBoard` (type: `integer`):

Cap per board (boards return up to ~500). Default: 500.

## Actor input object example

```json
{
  "boardPreset": "All catalog — 800 companies (search mode)",
  "boards": [],
  "keywords": [],
  "remoteOnly": false,
  "sinceDays": 0,
  "intel": false,
  "intentKeywords": [],
  "maxJobsPerBoard": 500
}
```

# Actor output Schema

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

Dataset with all job rows and hiring-intel company reports.

# 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 = {
    "keywords": [],
    "intentKeywords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("teamkamkod/ats-job-boards-api").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 = {
    "keywords": [],
    "intentKeywords": [],
}

# Run the Actor and wait for it to finish
run = client.actor("teamkamkod/ats-job-boards-api").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 '{
  "keywords": [],
  "intentKeywords": []
}' |
apify call teamkamkod/ats-job-boards-api --silent --output-dataset

```

## MCP server setup

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

```

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/u8GFWfhkcsdpULG4w/builds/s6hYioRmte6OYVXlw/openapi.json
