# Greenhouse, Lever & Ashby Jobs API: ATS Job Postings Scraper (`stazis/ats-jobs-api`) Actor

Job postings straight from company career pages on 6 ATS platforms (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee) via their public job-board APIs. One schema, remote filter, salary where published, only-new job alerts.

- **URL**: https://apify.com/stazis/ats-jobs-api.md
- **Developed by:** [Stanislav](https://apify.com/stazis) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 job 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

## Greenhouse, Lever & Ashby Jobs API: ATS Job Postings Scraper

Get **job postings straight from company career pages** hosted on **Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee**, through the public job-board APIs these ATS platforms provide. Paste career page URLs or `ats:company` slugs and get one clean, normalized row per job: title, department, location, remote flag, salary where the ATS publishes it, posted date and apply link.

- **Who it's for:** recruiters and sourcers, job boards and newsletters, sales teams using hiring as a buying signal, labour-market research.
- **Source:** the companies' own public job-board APIs. No login, no proxies, no reposts from aggregators.
- **Alerts:** turn on only-new mode and schedule it to get just the jobs that appeared since the last run.
- **Output:** JSON, CSV or Excel; pay per job returned (see the Pricing tab).

### Quick start (one click)

Open the Actor and press **Start**: the form is prefilled with this input.

```json
{
  "companies": [
    "greenhouse:stripe",
    "lever:palantir",
    "ashby:ramp"
  ],
  "keywords": [
    "data"
  ],
  "excludeKeywords": [],
  "maxItems": 20
}
```

Sample output (one row, more fields in the dataset):

| id | title | location | url | postedAt |
|---|---|---|---|---|
| 8190059 | Account Executive, Product Sales (Data) | US-SF-HQ, US-NYC, US-CHI, US-SEA | https://stripe.com/jobs/search?gh_jid=8190059 | 2026-10-05T12:08:53-04:00 |

### Use cases

**Daily alerts for new roles at target companies.** Schedule daily; each run returns only jobs not seen before.

```json
{"companies": ["greenhouse:stripe", "ashby:ramp"], "keywords": ["engineer"], "onlyNew": true}
```

**Niche job board feed.** Remote data roles across many companies, posted in the last 7 days.

```json
{"companies": ["greenhouse:stripe", "lever:palantir", "ashby:ramp"], "keywords": ["data"], "remoteOnly": true, "postedWithinDays": 7}
```

**Hiring signals for sales.** Which accounts are hiring for a team you sell to (titles only, no descriptions, for speed).

```json
{"companies": ["greenhouse:stripe", "lever:palantir"], "keywords": ["security", "devops"], "includeDescription": false, "maxItems": 500}
```

**Salary research.** Ashby and Lever publish salary ranges on many postings.

```json
{"companies": ["ashby:ramp"], "maxItems": 200}
```

### Features and details of this job postings scraper API

Get **fresh job postings directly from company career sites**, through the official public job-board APIs that these ATS platforms provide for publishing jobs. Paste career page URLs; get clean, normalized jobs.

#### Why this Actor

- **Direct from the source:** the same data the company publishes on its own career page, with no duplicate reposts from aggregators.
- **6 ATS platforms, one output format:** Greenhouse, Lever (US and EU), Ashby, Workable, SmartRecruiters, Recruitee.
- **Filters:** title keywords and exclusions, location, remote only, posted within N days.
- **Only new jobs:** schedule it daily and receive only postings you have not seen.
- **Salary** where the ATS publishes it (Ashby, Lever).
- **Fast and cheap:** JSON APIs only, no browser, no proxies. About 1,200 jobs from 6 companies in ~6 seconds in our tests.

#### How to use

1. Open the Actor and paste one or more career page URLs into **Companies**.
2. Optionally add filters (keywords, location, remote only, posted within N days).
3. Click **Start** and download the results as JSON, CSV or Excel, or get them through the API.
4. For job alerts, add a daily **Schedule** with `onlyNew: true`.

#### Pricing

Pay per result: **$2.00 per 1,000 jobs** ($0.002 per job) plus $0.005 per run start. No subscription.

#### Notes

Only publicly published job postings are collected; no candidate or personal data. Always link applicants to the original `url`. Not affiliated with any of the ATS vendors.

### How to use the job postings scraper API

1. Open the Actor, fill in the input form (or paste the JSON below).
2. Click **Start**. Results land in the dataset as JSON, CSV, Excel or via the Apify API.
3. For alerts or regular refreshes, add an Apify **Schedule**. You can cap spend with "Max charge per run".

### Input example

Real input of cloud run `0R5xVFyeAx2twqaf8` (2026-10-22/23):

```json
{
  "companies": [
    "greenhouse:stripe",
    "ashby:ramp",
    "lever:palantir"
  ],
  "keywords": [
    "data"
  ],
  "includeDescription": false,
  "maxItems": 25
}
```

### Output example

Real rows from that run (25 results, 5.6 s) (long titles shortened in the table):

| company | title | location | posted |
|---|---|---|---|
| Stripe | Account Executive, Product Sales (Data) | US-SF-HQ, US-NYC, US-CHI, US-SEA | 2026-10-05 |
| Stripe | Account Executive, Product Sales (Data Pipeline)  | Singapore | 2026-08-19 |
| Stripe | Data Analyst | Canada | 2023-11-01 |
| Stripe | Data Analyst, Global Growth | Singapore | 2026-09-25 |
| Stripe | Data Analyst, Intern | New York, Seattle, South San Francisco HQ | 2026-10-01 |
| Stripe | Data Analyst, Intern | Toronto | 2026-10-01 |

One full record:

```json
{
  "id": "8190059",
  "title": "Account Executive, Product Sales (Data)",
  "location": "US-SF-HQ, US-NYC, US-CHI, US-SEA",
  "url": "https://stripe.com/jobs/search?gh_jid=8190059",
  "postedAt": "2026-10-05T12:08:53-04:00",
  "updatedAt": "2026-10-22T09:17:09-04:00",
  "company": "Stripe",
  "ats": "greenhouse",
  "board": "stripe",
  "isRemote": false,
  "source": "greenhouse public job board API"
}
```

A second run (`aThry5Kjz9VthqLpL`, `ashby:ramp` + `lever:palantir`) returned Ramp roles such as *Software Engineer, Data Platform*. `postedAt` is what the ATS reports; some companies re-post old roles.

### FAQ

#### Which job boards does this jobs scraper support?

Greenhouse, Lever (US and EU), Ashby, Workable, SmartRecruiters and Recruitee. LinkedIn and Indeed are not supported: they have no official public job-board API.

#### How do I find a company's ATS?

Open its Careers page and look where the Apply links go, e.g. boards.greenhouse.io or jobs.lever.co.

#### Is salary always included?

No. Salary appears only when the company publishes it in the ATS (most often Ashby and Lever).

#### How much does it cost?

$2 per 1,000 jobs plus $0.005 per run. There is no subscription.

#### Are there limits I should know about?

Yes. Results are only as complete and current as the official source. If a source is down, the run logs the error instead of returning made-up data. Report problems in the Issues tab.

### Use it from code, AI agents and automations

The same input as the form above works everywhere. Results are the run's dataset (JSON, CSV, Excel). You need an Apify API token (Console → Settings → API & Integrations).

**Python** (`pip install apify-client`)

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("stazis/ats-jobs-api").call(run_input={
  "companies": [
    "greenhouse:stripe",
    "lever:palantir",
    "ashby:ramp"
  ],
  "keywords": [
    "data"
  ],
  "maxItems": 20
})
for item in client.dataset(run.default_dataset_id).iterate_items():  # apify-client < 3: run["defaultDatasetId"]
    print(item)
```

**JavaScript / TypeScript** (`npm i apify-client`)

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('stazis/ats-jobs-api').call({
  "companies": [
    "greenhouse:stripe",
    "lever:palantir",
    "ashby:ramp"
  ],
  "keywords": [
    "data"
  ],
  "maxItems": 20
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**HTTP, one call** (waits for the run, up to 5 minutes, and returns the items)

```bash
curl -X POST "https://api.apify.com/v2/acts/stazis~ats-jobs-api/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"companies": ["greenhouse:stripe", "lever:palantir", "ashby:ramp"], "keywords": ["data"], "maxItems": 20}'
```

**AI agents (MCP).** This Actor runs with limited permissions, so AI agents can use it through the hosted Apify MCP server (Claude, Cursor, VS Code, Codex and other MCP clients). Add this to your MCP client config and sign in with Apify on first use:

```json
{ "mcpServers": { "ats-jobs-api": { "url": "https://mcp.apify.com?tools=stazis/ats-jobs-api" } } }
```

Agents without an Apify account can pay per run in USDC through [agi.apify.com](https://agi.apify.com) (x402). Pricing is pay-per-event, so an agent pays only for the results it gets.

**LangChain** (`pip install langchain-apify`, set `APIFY_TOKEN`): `from langchain_apify import ApifyActorsTool` and `tool = ApifyActorsTool("stazis/ats-jobs-api")` gives your agent this Actor as a tool.

**No-code and scheduling:** use the Apify app in Make, n8n or Zapier ("Run an Actor", then pick `stazis/ats-jobs-api`), or create a Schedule in Apify Console to run it daily and send results to a webhook, Slack or Google Drive through Apify integrations.

### Other data APIs by stazis

- [UK Companies House Search API: Bulk Company Data](https://apify.com/stazis/companies-house-api): Search all ~5.
- [Grants.gov & SAM.gov API: US Federal Grants and Contracts](https://apify.com/stazis/gov-opportunities-api): Get US federal grant opportunities from Grants.
- [SEC EDGAR Filings Scraper API: 8-K, 10-K, Full-Text Search](https://apify.com/stazis/sec-edgar-filings-api): Search SEC EDGAR filings by full text, form type (8-K, 10-K, 10-Q, S-1, Form D), date and state, or list recent filings for any ticker or CIK.
- [Bulk WHOIS & RDAP Domain Lookup API: Expiry, DNS](https://apify.com/stazis/domain-rdap-api): Bulk domain lookup via official RDAP (the WHOIS successor) plus live DNS: registrar, status, created/updated/expiry dates, nameservers, DNSSEC, A/AAAA/MX/NS/TXT records.
- [OpenAlex API: Scholarly Paper Search, Citations, Abstracts](https://apify.com/stazis/openalex-works-api): Search 250M+ scholarly papers from OpenAlex (CC0): title, DOI, year, venue, open-access link, citation count, authors, institutions, topics and abstract.

# Actor input Schema

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

Companies to fetch, one per line: a career-page URL (https://boards.greenhouse.io/stripe, https://jobs.lever.co/palantir, https://jobs.ashbyhq.com/ramp) or a short id 'ats:board' (greenhouse:stripe, lever:palantir, ashby:ramp, workable:<slug>, smartrecruiters:<slug>, recruitee:<slug>).

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

Keep only jobs whose title contains at least one of these words (case-insensitive), e.g. 'data', 'engineer'. Leave empty for all jobs.

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

Drop jobs whose title contains any of these words (case-insensitive), e.g. 'intern', 'senior'.

## `location` (type: `string`):

Keep jobs whose location text contains this value, e.g. 'Remote', 'London', 'Germany'. Leave empty for any location.

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

Keep only jobs the ATS marks as remote (workplace type, remote flag, or 'remote' in the location).

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

Only jobs posted or updated in the last N days, using the date the ATS reports. 0 = no date limit.

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

Add the full job description as plain text. Turn off for smaller, faster output.

## `onlyNew` (type: `boolean`):

Monitor mode: remember returned job IDs in a named key-value store and return only jobs not seen in earlier runs. Combine with a daily schedule for alerts.

## `stateStoreName` (type: `string`):

Name of the key-value store that 'Only new' uses to remember seen jobs. Use a different name for each watchlist.

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

Maximum number of jobs returned per run across all companies. Also caps the cost.

## Actor input object example

```json
{
  "companies": [
    "greenhouse:stripe",
    "lever:palantir",
    "ashby:ramp"
  ],
  "keywords": [
    "data"
  ],
  "excludeKeywords": [],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "includeDescription": true,
  "onlyNew": false,
  "stateStoreName": "ats-jobs-state",
  "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": [
        "greenhouse:stripe",
        "lever:palantir",
        "ashby:ramp"
    ],
    "keywords": [
        "data"
    ],
    "excludeKeywords": [],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stazis/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": [
        "greenhouse:stripe",
        "lever:palantir",
        "ashby:ramp",
    ],
    "keywords": ["data"],
    "excludeKeywords": [],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("stazis/ats-jobs-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 '{
  "companies": [
    "greenhouse:stripe",
    "lever:palantir",
    "ashby:ramp"
  ],
  "keywords": [
    "data"
  ],
  "excludeKeywords": [],
  "maxItems": 20
}' |
apify call stazis/ats-jobs-api --silent --output-dataset

```

## MCP server setup

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