# ATS Jobs Scraper (Greenhouse, Lever, Ashby, Workday) (`leorochasantos/ats-jobs`) Actor

Scrape live job postings from Greenhouse, Lever, Ashby, and Workday career pages. Flat typed JSON with title, location, department, salary, description, and apply URL. Auto-detects ATS platform. $0.00075 per job.

- **URL**: https://apify.com/leorochasantos/ats-jobs.md
- **Developed by:** [Leonardo Santos](https://apify.com/leorochasantos) (community)
- **Categories:** Jobs, Automation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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.

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

## ATS Jobs Scraper (Greenhouse, Lever, Ashby, Workday)

Scrape live job postings from any company career page powered by Greenhouse,
Lever, Ashby, or Workday — into clean, flat, LLM/agent-ready JSON. One item
per job posting, with title, location, department, employment type,
compensation, description, and direct apply URL. Auto-detect mode figures out
which ATS a company uses.

### Why this actor?

- 💵 **$0.00075 per job** — half the price of the nearest direct competitor
  (bovi at $1.50/1K). No start fee, no platform usage bill on top.
- 🏢 **4 major ATS platforms** — Greenhouse, Lever, Ashby, and Workday. Most
  competitors miss Workday, which is where 90% of Fortune 500 jobs live.
- 🔍 **Auto-detect** — pass a company slug; the actor figures out which ATS to
  query. No need to know which platform each company uses.
- ⚡ **Direct API access** — Greenhouse and Lever use public JSON APIs (zero
  maintenance burden). Ashby parses server-rendered data. Workday uses the
  CXS API. No browser overhead.
- 🔒 **No personal data** — public job listings only. This actor never touches
  applicant data, employee records, or any private information.
- 🤖 **LLM-ready output** — flat typed schema with `global_id` (deterministic
  compound key), ISO dates, boolean `remote` flag, and pre-extracted plain-text
  descriptions alongside the raw HTML.

### Input

```json
{
  "companies": [
    { "ats": "greenhouse", "slug": "airbnb" },
    { "ats": "lever", "slug": "spotify" },
    { "ats": "workday", "url": "https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite" }
  ],
  "maxJobsPerCompany": 50,
  "maxPages": 3
}
````

Each company entry takes `ats` (or `"auto"`) and either `slug` (for
Greenhouse/Lever/Ashby) or `url` (required for Workday). Up to 50 companies
per run.

### Output

One item per job posting:

```json
{
  "input": "airbnb",
  "ats": "greenhouse",
  "company": "airbnb",
  "job_id": "7995153",
  "global_id": "greenhouse:airbnb:7995153",
  "title": "Acquisition Manager",
  "location": "Berlin, Germany",
  "remote": null,
  "department": "Sales",
  "employment_type": "Full-time",
  "salary_min": null,
  "salary_max": null,
  "salary_currency": null,
  "compensation_summary": null,
  "description_text": "Airbnb was born in 2007 when two hosts...",
  "description_html": "<p>Airbnb was born in 2007...</p>",
  "url": "https://careers.airbnb.com/positions/7995153?gh_jid=7995153",
  "apply_url": "https://careers.airbnb.com/positions/7995153?gh_jid=7995153",
  "posted_at": "2026-06-10T12:50:56.000Z",
  "error": null,
  "scraped_at": "2026-07-27T00:00:00.000Z"
}
```

Error items (company not found, invalid input) have `error` set and `title`
describing the problem — always free.

### Pricing

Pay per event, and **the platform usage is on us** — the price you see is the price you pay, with no compute bill on top.

| Event | Price | What one charge buys |
|---|---|---|
| Job Result | **$0.00075** | One job posting result. Error items and empty results are free. |
| Actor Start | **$0.002** | One run, whatever it returns. |

Higher Apify subscription tiers pay less on every event (Silver −20%, Gold −35%).

### Limitations

- Up to 50 companies per run, up to 5,000 jobs per company.
- **Workday requires a full URL** — the subdomain pattern varies per company
  (`wd5`, `wd3`, `wd1`). Pass the exact career page URL from the browser.
- **Ashby and Workday descriptions are not included in v1** — those platforms
  require per-job detail page scraping, coming in a future update.
- Greenhouse and Lever are JSON APIs (low fragility). Ashby and Workday
  parsing may break if those platforms change their page structure.

### Use cases

- 🏢 **Recruitment intelligence** — monitor competitor hiring across multiple
  ATS platforms in one run.
- 🤖 **LLM pipelines / RAG** — flat, pre-cleaned `description_text` from
  Greenhouse and Lever for job matching or analysis.
- 📊 **Labor market research** — aggregate job posting data across companies
  and platforms with consistent field names.

***

*This Actor is an independent tool, not affiliated with or endorsed by
Greenhouse, Lever, Ashby, or Workday.*

# Actor input Schema

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

Array of company queries. Each entry: { ats, slug?, url? }. ats can be 'greenhouse', 'lever', 'ashby', 'workday', or 'auto'.

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

Maximum jobs to return per company (default: 200, max: 5000).

## `maxPages` (type: `integer`):

Maximum pages to paginate per company (default: 5, max: 20).

## `proxyConfiguration` (type: `object`):

Proxy to use for outgoing requests.

## Actor input object example

```json
{
  "companies": [
    {
      "ats": "greenhouse",
      "slug": "airbnb"
    },
    {
      "ats": "lever",
      "slug": "spotify"
    }
  ],
  "maxJobsPerCompany": 200,
  "maxPages": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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": [
        {
            "ats": "greenhouse",
            "slug": "airbnb"
        },
        {
            "ats": "lever",
            "slug": "spotify"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("leorochasantos/ats-jobs").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",
            "slug": "airbnb",
        },
        {
            "ats": "lever",
            "slug": "spotify",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("leorochasantos/ats-jobs").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",
      "slug": "airbnb"
    },
    {
      "ats": "lever",
      "slug": "spotify"
    }
  ]
}' |
apify call leorochasantos/ats-jobs --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ATS Jobs Scraper (Greenhouse, Lever, Ashby, Workday)",
        "description": "Scrape live job postings from Greenhouse, Lever, Ashby, and Workday career pages. Flat typed JSON with title, location, department, salary, description, and apply URL. Auto-detects ATS platform. $0.00075 per job.",
        "version": "0.1",
        "x-build-id": "ldSgtAk6c4Z1WmdDB"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/leorochasantos~ats-jobs/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-leorochasantos-ats-jobs",
                "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/leorochasantos~ats-jobs/runs": {
            "post": {
                "operationId": "runs-sync-leorochasantos-ats-jobs",
                "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/leorochasantos~ats-jobs/run-sync": {
            "post": {
                "operationId": "run-sync-leorochasantos-ats-jobs",
                "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",
                "required": [
                    "companies"
                ],
                "properties": {
                    "companies": {
                        "title": "Companies",
                        "type": "array",
                        "description": "Array of company queries. Each entry: { ats, slug?, url? }. ats can be 'greenhouse', 'lever', 'ashby', 'workday', or 'auto'."
                    },
                    "maxJobsPerCompany": {
                        "title": "Max jobs per company",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum jobs to return per company (default: 200, max: 5000).",
                        "default": 200
                    },
                    "maxPages": {
                        "title": "Max pages",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum pages to paginate per company (default: 5, max: 20).",
                        "default": 5
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy to use for outgoing requests.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
