# ATS Job Scraper (`enosgb/ats-job-scraper`) Actor

Extract job postings from Greenhouse, Lever, Ashby, Workday, and Rippling with automatic ATS detection and standardized JSON output.

- **URL**: https://apify.com/enosgb/ats-job-scraper.md
- **Developed by:** [Enos Melo](https://apify.com/enosgb) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 job extracteds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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 Job Scraper

Extract job postings from company career pages across **5 major ATS platforms** — Greenhouse, Lever, Ashby, Workday, and Rippling — with automatic ATS detection and standardized JSON output. Simply provide a list of company domains and get back structured data ready for Clay, Apollo, Instantly, or any CRM.

### What does ATS Job Scraper do?

ATS Job Scraper is a powerful data extraction tool that scrapes job listings from multiple Applicant Tracking Systems (ATS) and normalizes them into a single, consistent JSON format. It automatically detects which ATS a company uses and fetches all available job data.

**Key features:**

- **Auto-detects ATS** — No need to know which system a company uses. The actor figures it out automatically.
- **5 ATS platforms supported** — Greenhouse, Lever, Ashby, Workday, and Rippling
- **Standardized output** — Same schema regardless of ATS source
- **Built for B2B workflows** — Clean JSON ready for enrichment pipelines
- **No browser overhead** — Uses direct API calls for speed and reliability

### Why use ATS Job Scraper?

- **Save hours of research** — Manually finding and scraping each company's career page takes time. This actor does it in seconds.
- **Consistent data** — Every job comes with the same fields: title, department, location, salary, description, and more.
- **Scale your outreach** — Process hundreds of companies in a single run for recruitment, sales intelligence, or market research.
- **Works with your stack** — Output integrates seamlessly with Clay, Apollo, Instantly, Zapier, Make, or any tool that consumes JSON.

### How to use

1. Go to the **Input** tab
2. Add companies to the `companies` array with their domain (e.g., `{ "domain": "stripe.com" }`)
3. Optionally add `careers_url` if you know the career page URL for more accurate detection
4. Configure filters (keywords, location, department) if needed
5. Click **Start** and download your dataset

### Input

| Field                        | Required | Description                                                        |
| ---------------------------- | -------- | ------------------------------------------------------------------ |
| `companies`                  | Yes      | Array of `{ name, domain, careers_url }` objects                   |
| `filters.keywords`           | No       | Comma-separated keywords to filter jobs                            |
| `filters.location`           | No       | Location filter (e.g., "remote", "San Francisco")                  |
| `filters.department`         | No       | Department name to filter                                          |
| `filters.posted_within_days` | No       | Only jobs posted within N days (0 = no limit)                      |
| `ats_override`               | No       | Force a specific ATS (greenhouse, lever, ashby, workday, rippling) |
| `include_description`        | No       | Include full job descriptions (default: true)                      |
| `include_salary`             | No       | Include salary data where available (default: false)               |
| `max_jobs_per_company`       | No       | Max jobs per company (default: 100)                                |

#### Example Input

```json
{
    "companies": [
        { "name": "Stripe", "domain": "stripe.com" },
        { "name": "Linear", "domain": "linear.app", "careers_url": "https://jobs.ashbyhq.com/linear" }
    ],
    "filters": {
        "keywords": "engineer,product",
        "location": "remote"
    },
    "max_jobs_per_company": 50
}
````

### Output

Each job record includes the following fields:

| Field              | Type           | Description                                              |
| ------------------ | -------------- | -------------------------------------------------------- |
| `job_id`           | string         | Unique job ID from the ATS                               |
| `company_name`     | string         | Company name                                             |
| `company_domain`   | string         | Company domain                                           |
| `ats_platform`     | string         | Source ATS (greenhouse, lever, ashby, workday, rippling) |
| `job_title`        | string         | Job title                                                |
| `department`       | string/null    | Department                                               |
| `team`             | string/null    | Team                                                     |
| `location`         | string         | Job location                                             |
| `remote`           | boolean/string | true, false, or "hybrid"                                 |
| `employment_type`  | string/null    | full\_time, part\_time, contract, intern                   |
| `seniority`        | string/null    | junior, mid, senior, staff, director, vp                 |
| `job_url`          | string         | URL to the job posting                                   |
| `apply_url`        | string         | URL to apply                                             |
| `description_html` | string         | Full job description (HTML)                              |
| `description_text` | string         | Full job description (plain text)                        |
| `salary_min`       | number/null    | Minimum salary                                           |
| `salary_max`       | number/null    | Maximum salary                                           |
| `salary_currency`  | string/null    | Currency code (USD, EUR, etc.)                           |
| `posted_at`        | string/null    | Posted date (ISO 8601)                                   |
| `updated_at`       | string/null    | Last updated (ISO 8601)                                  |
| `scraped_at`       | string         | Timestamp when scraped                                   |

You can download the dataset in various formats: **JSON, CSV, Excel, XML, or RSS**.

### Supported ATS Platforms

| ATS        | API Type | Salary Data                        | Posted Date     |
| ---------- | -------- | ---------------------------------- | --------------- |
| Greenhouse | REST API | Yes (per-job, with include\_salary) | updated\_at only |
| Lever      | REST API | Yes (optional)                     | Not available   |
| Ashby      | REST API | Yes (with include\_description)     | Yes             |
| Workday    | CXS API  | Not available                      | Yes             |
| Rippling   | REST API | Not available                      | Yes             |

### Pricing

**Pay-per-event**: $0.003 per job returned

This actor uses the Apify pay-per-event pricing model. You're charged for each job successfully scraped and added to the dataset. No jobs = no charge.

Example: Scraping 50 companies with ~500 total jobs costs approximately **$1.50** in actor fees.

### Tips

- Provide `careers_url` when possible for more accurate ATS detection
- Disable `include_description` for faster runs when you only need metadata
- Use `ats_override` if you know the ATS to skip detection entirely
- Use `filters.keywords` to reduce the number of results and save on costs

### FAQ

**Q: Do I need a proxy?**
A: No. Greenhouse, Lever, and Ashby expose public APIs that don't require proxies. Workday and Rippling may benefit from proxies for large batches, but the actor works without them.

**Q: What if ATS detection fails?**
A: The actor will attempt to fetch using all available connectors as fallback. You can also use `ats_override` to force a specific ATS.

**Q: Can I scrape unlimited jobs?**
A: Yes, but use `max_jobs_per_company` to control costs and run time. The default is 100 jobs per company.

**Q: Why is Lever returning 0 jobs?**
A: Some companies disable public job APIs. Use `careers_url` or try another company as a test.

**Q: Is this legal?**
A: This actor uses publicly available APIs provided by each ATS for job listings. It respects the terms of service of each platform. For Workday and other enterprise systems, ensure you have permission before scraping.

### Need help?

- Report issues on [GitHub](https://github.com/anomalyco/opencode/issues)
- Check the [Apify documentation](https://docs.apify.com/)
- Contact support through the Apify Console

# Actor input Schema

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

List of companies with domain or careers URL. At least one company is required.

## `filters` (type: `object`):

Optional filters to apply to job results

## `ats_override` (type: `string`):

Force a specific ATS for all companies. Leave empty for auto-detect.

## `include_description` (type: `boolean`):

Include full job descriptions in output. Disabling speeds up scraping.

## `include_salary` (type: `boolean`):

Include salary data where available (Greenhouse, Lever, Ashby). May increase API calls.

## `max_jobs_per_company` (type: `integer`):

Maximum number of jobs to return per company. 0 = unlimited.

## Actor input object example

```json
{
  "companies": [
    {
      "name": "Stripe",
      "domain": "stripe.com"
    }
  ],
  "ats_override": "",
  "include_description": true,
  "include_salary": false,
  "max_jobs_per_company": 100
}
```

# Actor output Schema

## `jobs` (type: `string`):

All extracted job postings with standardized schema including title, department, location, salary, and description

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

Execution statistics including total jobs, companies processed, ATS breakdown, and runtime metadata

# 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": [
        {
            "name": "Stripe",
            "domain": "stripe.com"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("enosgb/ats-job-scraper").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": [{
            "name": "Stripe",
            "domain": "stripe.com",
        }] }

# Run the Actor and wait for it to finish
run = client.actor("enosgb/ats-job-scraper").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": [
    {
      "name": "Stripe",
      "domain": "stripe.com"
    }
  ]
}' |
apify call enosgb/ats-job-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ATS Job Scraper",
        "description": "Extract job postings from Greenhouse, Lever, Ashby, Workday, and Rippling with automatic ATS detection and standardized JSON output.",
        "version": "1.0",
        "x-build-id": "WYQuisj8wg5Wadn9G"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/enosgb~ats-job-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-enosgb-ats-job-scraper",
                "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/enosgb~ats-job-scraper/runs": {
            "post": {
                "operationId": "runs-sync-enosgb-ats-job-scraper",
                "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/enosgb~ats-job-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-enosgb-ats-job-scraper",
                "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 to Scrape",
                        "minItems": 1,
                        "type": "array",
                        "description": "List of companies with domain or careers URL. At least one company is required.",
                        "items": {
                            "type": "object",
                            "properties": {
                                "name": {
                                    "type": "string",
                                    "title": "Company Name",
                                    "description": "Optional company name"
                                },
                                "domain": {
                                    "type": "string",
                                    "title": "Domain",
                                    "description": "Company domain (e.g., stripe.com)"
                                },
                                "careers_url": {
                                    "type": "string",
                                    "title": "Careers URL",
                                    "description": "Full URL to careers page (optional)"
                                }
                            }
                        },
                        "default": [
                            {
                                "name": "Stripe",
                                "domain": "stripe.com"
                            }
                        ]
                    },
                    "filters": {
                        "title": "Filters",
                        "type": "object",
                        "description": "Optional filters to apply to job results",
                        "properties": {
                            "keywords": {
                                "title": "Keywords",
                                "type": "string",
                                "description": "Comma-separated keywords to filter jobs (matches title and description)",
                                "default": ""
                            },
                            "location": {
                                "title": "Location",
                                "type": "string",
                                "description": "Filter jobs by location (e.g., 'remote', 'San Francisco')",
                                "default": ""
                            },
                            "department": {
                                "title": "Department",
                                "type": "string",
                                "description": "Filter jobs by department name",
                                "default": ""
                            },
                            "posted_within_days": {
                                "title": "Posted Within Days",
                                "type": "integer",
                                "description": "Only include jobs posted within this many days. 0 = no limit.",
                                "default": 0,
                                "minimum": 0,
                                "maximum": 365
                            }
                        }
                    },
                    "ats_override": {
                        "title": "ATS Override",
                        "enum": [
                            "",
                            "greenhouse",
                            "lever",
                            "ashby",
                            "workday",
                            "rippling"
                        ],
                        "type": "string",
                        "description": "Force a specific ATS for all companies. Leave empty for auto-detect.",
                        "default": ""
                    },
                    "include_description": {
                        "title": "Include Job Descriptions",
                        "type": "boolean",
                        "description": "Include full job descriptions in output. Disabling speeds up scraping.",
                        "default": true
                    },
                    "include_salary": {
                        "title": "Include Salary Data",
                        "type": "boolean",
                        "description": "Include salary data where available (Greenhouse, Lever, Ashby). May increase API calls.",
                        "default": false
                    },
                    "max_jobs_per_company": {
                        "title": "Max Jobs per Company",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of jobs to return per company. 0 = unlimited.",
                        "default": 100
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
