# Multi-ATS Jobs API — Greenhouse, Lever & Ashby (`neko_bobrik/multi-ats-jobs-api`) Actor

One clean, normalized, de-duplicated feed of live job postings from company career pages across Greenhouse, Lever & Ashby. Public ATS endpoints only — no login, no anti-bot, legally clean. For recruiters, job boards, ATS aggregators & AI hiring tools.

- **URL**: https://apify.com/neko\_bobrik/multi-ats-jobs-api.md
- **Developed by:** [Bobrik Dobrik](https://apify.com/neko_bobrik) (community)
- **Categories:** Jobs, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## 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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## Multi-ATS Jobs API — Greenhouse, Lever & Ashby Job Scraper

**Get one clean, normalized, de-duplicated feed of live job postings from company career pages — across Greenhouse, Lever, and Ashby — in a single run.** This Jobs API pulls directly from each company's **public ATS endpoints** (no login, no cookies, no blocked sites, no anti-bot workarounds), so results are fast, reliable, and legally clean. Point it at a list of companies or use the built-in seed list of well-known tech employers and get thousands of up-to-date jobs with titles, departments, locations, remote flags, employment type, apply URLs, and full descriptions — all in **one unified schema** you can drop straight into a database, job board, sourcing tool, or AI hiring agent.

Built for **recruiters, job boards, ATS aggregators, sales-intelligence, and AI recruiting tools** that need structured hiring data without maintaining a dozen brittle scrapers. Reliability is the point: each company is fetched in isolation, failures are retried and labelled (never silently dropped), and every record is de-duplicated by a stable key.

### Why this actor

- **3 ATS platforms, 1 schema** — Greenhouse, Lever, and Ashby normalized into identical fields. No per-source glue code on your side.
- **Public endpoints only** — reads the same JSON companies publish for their own career sites. No authentication, no anti-bot evasion, no legal gray area.
- **Reliable by design** — per-company isolation, retries with backoff, partial-but-labelled runs via a `RUN_SUMMARY`, and full de-duplication.
- **Zero-config start** — run with no input to pull a curated set of top companies; or pass your own list.
- **Pay per result** — you only pay for jobs returned.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `companies` | array | — | `[{ "ats": "greenhouse\|lever\|ashby", "token": "stripe" }]`. Empty → seed list. |
| `useSeedList` | boolean | `true` | Use the built-in curated company list when `companies` is empty. |
| `includeDescription` | boolean | `true` | Include `description_html` and `description_text`. |
| `onlyRemote` | boolean | `false` | Return only remote jobs. |
| `maxJobsPerCompany` | integer | `0` | Cap jobs per company (0 = no cap). |

The **`token`** is the company's board slug: the `X` in `boards.greenhouse.io/X`, `jobs.lever.co/X`, or `jobs.ashbyhq.com/X`.

### Output

Each dataset item is one job in a unified schema:

```json
{
  "source": "greenhouse",
  "company": "Stripe",
  "company_token": "stripe",
  "job_id": "7954688",
  "title": "Account Executive, AI Sales",
  "department": "Account Executives",
  "departments": ["Account Executives"],
  "team": null,
  "location": "San Francisco, CA",
  "offices": ["San Francisco, CA"],
  "is_remote": false,
  "employment_type": "Full Time",
  "url": "https://stripe.com/jobs/search?gh_jid=7954688",
  "apply_url": "https://stripe.com/jobs/search?gh_jid=7954688",
  "published_at": "2026-06-02T12:58:57.000Z",
  "updated_at": "2026-07-22T17:25:41.000Z",
  "description_html": "…",
  "description_text": "…"
}
````

### Notes on responsible use

- Reads only **public** ATS job-board endpoints that companies expose for their own career pages.
- Returns **job postings**, not candidate/personal data. Use hiring data in line with the ATS providers' terms and applicable law.
- Respects each source; fetches are lightweight and rate-friendly.

### Roadmap

- Workday, Recruitee, SmartRecruiters, Personio adapters
- Company auto-discovery
- Incremental "changed since last run" mode

# Actor input Schema

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

List of company boards to fetch, e.g. \[{"ats":"greenhouse","token":"stripe"}]. Leave empty to use the built-in curated seed list.

## `useSeedList` (type: `boolean`):

Fetch a curated set of well-known tech companies out of the box.

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

Include description\_html and description\_text fields.

## `onlyRemote` (type: `boolean`):

Return only jobs flagged/inferred as remote.

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

Cap jobs per company (0 = no cap).

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

full = every current job. incremental = only jobs that are new, updated, or removed since the last run (each row gets a 'change' field). Incremental compares against a saved snapshot.

## `snapshotName` (type: `string`):

Named store that holds the previous run's snapshot for incremental diffing. Use a distinct name per company set you monitor.

## Actor input object example

```json
{
  "companies": [
    {
      "ats": "greenhouse",
      "token": "stripe"
    },
    {
      "ats": "ashby",
      "token": "ramp"
    },
    {
      "ats": "lever",
      "token": "gopuff"
    },
    {
      "ats": "workday",
      "token": "nvidia/wd5/NVIDIAExternalCareerSite"
    }
  ],
  "useSeedList": true,
  "includeDescription": true,
  "onlyRemote": false,
  "maxJobsPerCompany": 0,
  "mode": "full",
  "snapshotName": "ats-jobs-snapshot"
}
```

# 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": [
        {
            "ats": "greenhouse",
            "token": "stripe"
        },
        {
            "ats": "ashby",
            "token": "ramp"
        },
        {
            "ats": "lever",
            "token": "gopuff"
        },
        {
            "ats": "workday",
            "token": "nvidia/wd5/NVIDIAExternalCareerSite"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("neko_bobrik/multi-ats-jobs-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 = { "companies": [
        {
            "ats": "greenhouse",
            "token": "stripe",
        },
        {
            "ats": "ashby",
            "token": "ramp",
        },
        {
            "ats": "lever",
            "token": "gopuff",
        },
        {
            "ats": "workday",
            "token": "nvidia/wd5/NVIDIAExternalCareerSite",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("neko_bobrik/multi-ats-jobs-api").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    {
      "ats": "greenhouse",
      "token": "stripe"
    },
    {
      "ats": "ashby",
      "token": "ramp"
    },
    {
      "ats": "lever",
      "token": "gopuff"
    },
    {
      "ats": "workday",
      "token": "nvidia/wd5/NVIDIAExternalCareerSite"
    }
  ]
}' |
apify call neko_bobrik/multi-ats-jobs-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=neko_bobrik/multi-ats-jobs-api",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Multi-ATS Jobs API — Greenhouse, Lever & Ashby",
        "description": "One clean, normalized, de-duplicated feed of live job postings from company career pages across Greenhouse, Lever & Ashby. Public ATS endpoints only — no login, no anti-bot, legally clean. For recruiters, job boards, ATS aggregators & AI hiring tools.",
        "version": "0.0",
        "x-build-id": "5rST0QfEmkYDRdcug"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/neko_bobrik~multi-ats-jobs-api/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-neko_bobrik-multi-ats-jobs-api",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/neko_bobrik~multi-ats-jobs-api/runs": {
            "post": {
                "operationId": "runs-sync-neko_bobrik-multi-ats-jobs-api",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/neko_bobrik~multi-ats-jobs-api/run-sync": {
            "post": {
                "operationId": "run-sync-neko_bobrik-multi-ats-jobs-api",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "companies": {
                        "title": "Companies",
                        "type": "array",
                        "description": "List of company boards to fetch, e.g. [{\"ats\":\"greenhouse\",\"token\":\"stripe\"}]. Leave empty to use the built-in curated seed list."
                    },
                    "useSeedList": {
                        "title": "Use built-in seed list when 'companies' is empty",
                        "type": "boolean",
                        "description": "Fetch a curated set of well-known tech companies out of the box.",
                        "default": true
                    },
                    "includeDescription": {
                        "title": "Include full job descriptions",
                        "type": "boolean",
                        "description": "Include description_html and description_text fields.",
                        "default": true
                    },
                    "onlyRemote": {
                        "title": "Only remote jobs",
                        "type": "boolean",
                        "description": "Return only jobs flagged/inferred as remote.",
                        "default": false
                    },
                    "maxJobsPerCompany": {
                        "title": "Max jobs per company",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Cap jobs per company (0 = no cap).",
                        "default": 0
                    },
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "full",
                            "incremental"
                        ],
                        "type": "string",
                        "description": "full = every current job. incremental = only jobs that are new, updated, or removed since the last run (each row gets a 'change' field). Incremental compares against a saved snapshot.",
                        "default": "full"
                    },
                    "snapshotName": {
                        "title": "Snapshot name (incremental)",
                        "type": "string",
                        "description": "Named store that holds the previous run's snapshot for incremental diffing. Use a distinct name per company set you monitor.",
                        "default": "ats-jobs-snapshot"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
