# ATS Job Postings Scraper (Greenhouse, Lever, Ashby, Workable) (`lowfieldlabs/ats-job-postings-scraper`) Actor

- **URL**: https://apify.com/lowfieldlabs/ats-job-postings-scraper.md
- **Developed by:** [LowfieldLabs](https://apify.com/lowfieldlabs) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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/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 Postings Scraper — Greenhouse, Lever, Ashby, Workable

### What does ATS Job Postings Scraper do?

Give it a list of companies — as careers-page URLs, `provider:slug` pairs, or even bare
company slugs — and it returns **one clean, identically-shaped JSON record per job
posting**, no matter which of the four supported applicant-tracking systems (ATS) the
company uses: **Greenhouse, Lever, Ashby, or Workable**. It auto-detects the ATS when you
don't specify one, so you don't need to know which system each company runs.

Typical uses: job-board aggregation, hiring-signal lead generation ("which of these 200
companies are hiring sales engineers right now?"), recruiting market research, competitor
hiring intel, and feeding structured job data to AI agents and workflows. Because every
provider is normalized to the same schema, downstream code handles one format instead of
four.

### Input

| Field | Type | Description |
|---|---|---|
| `companies` | array (required) | One entry per company: careers URL (`https://boards.greenhouse.io/stripe`, `https://jobs.lever.co/…`, `https://jobs.ashbyhq.com/…`, `https://apply.workable.com/…`), explicit `provider:slug` (`greenhouse:stripe`, `lever:plaid`, `ashby:ramp`, `workable:blueground`), or a bare slug to auto-detect. |
| `keywords` | array | Keep only jobs whose title (or description, if fetched) contains ANY of these, case-insensitive. |
| `locationContains` | string | Keep only jobs whose location contains this text, e.g. `"new york"` or `"remote"`. |
| `remoteOnly` | boolean | Keep only jobs the board explicitly marks remote. |
| `maxAgeDays` | integer | Drop postings older than this many days (jobs with no date are kept). |
| `maxJobsPerCompany` | integer | Safety cap per company (default 200). |
| `includeDescription` | boolean | Also fetch the full job description where the ATS provides it. |

Example input:

```json
{
  "companies": ["greenhouse:stripe", "https://jobs.ashbyhq.com/ramp"],
  "keywords": ["engineer"],
  "remoteOnly": false,
  "maxJobsPerCompany": 100
}
````

### Output

One dataset record per job posting, always in this shape (download as JSON, CSV or Excel
from the run's **Dataset** tab, or via the Apify API):

```json
{
  "provider": "greenhouse",
  "company": "stripe",
  "id": "7954688",
  "title": "Backend Engineer, Payments",
  "url": "https://stripe.com/jobs/search?gh_jid=7954688",
  "location": "New York, NY",
  "remote": null,
  "department": "Engineering",
  "employment_type": null,
  "published_at": "2026-06-12T18:30:00+00:00",
  "description_html": null,
  "description_text": null
}
```

Fields the source board doesn't expose are `null` rather than guessed. `remote` is `true`
or `false` only when the board says so explicitly.

### Is it legal to scrape these job boards? (ToS position)

This Actor reads **only the public, documented job-board APIs** that Greenhouse, Lever,
Ashby and Workable themselves publish for exactly this purpose — the same postings shown
on each company's public careers page. There are no logins, no paywalls, no personal
data, and no bot-evasion tricks: it makes a single request per company per run. If a
company's board is private or removed, the Actor simply reports it as unresolved.

### Pricing

Pay-per-event: a small flat **Actor start** fee per run plus a per-job **job result** fee
— you pay only for jobs actually returned, never for unresolved companies or filtered-out
postings. Exact prices are shown on this Actor's page.

### FAQ

**Which ATS platforms are supported?** Greenhouse, Lever, Ashby and Workable. More
(SmartRecruiters, Recruitee) are planned — tell us via the Issues tab if you need one.

**How do I find a company's slug?** From its careers-page URL: in
`https://boards.greenhouse.io/stripe` the slug is `stripe`. Or just pass the whole URL.

**A company comes back "unresolved" — why?** Its board may be private, empty, hosted on
an unsupported ATS, or use a different slug than you guessed. The run's status message
and log list every unresolved entry.

**Can I run this on a schedule?** Yes — use Apify Schedules to run it hourly/daily and
diff new postings downstream.

**Who maintains this?** [Lowfield Labs](https://lowfieldlabs.com) — a small automation
studio. This Actor is built and maintained with AI-assisted engineering; issues filed on
the Actor's Issues tab are triaged continuously.

# Actor input Schema

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

One entry per company: a careers URL (https://boards.greenhouse.io/stripe, https://jobs.lever.co/…, https://jobs.ashbyhq.com/…, https://apply.workable.com/…), an explicit provider:slug (greenhouse:stripe, lever:plaid, ashby:ramp, workable:blueground), or a bare slug to auto-detect across all four ATSs.

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

Keep only jobs whose title (or description, if fetched) contains ANY of these, case-insensitive. Empty = keep all.

## `locationContains` (type: `string`):

Keep only jobs whose location contains this text, e.g. "new york" or "remote".

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

Keep only jobs the board explicitly marks remote.

## `maxAgeDays` (type: `integer`):

Drop postings older than this many days (kept when the board exposes no date).

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

Safety cap per company.

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

Fetch the full job description (HTML and/or plain text) where the ATS provides it.

## Actor input object example

```json
{
  "companies": [
    "greenhouse:stripe",
    "https://jobs.ashbyhq.com/ramp"
  ],
  "remoteOnly": false,
  "maxJobsPerCompany": 200,
  "includeDescription": false
}
```

# 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",
        "https://jobs.ashbyhq.com/ramp"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lowfieldlabs/ats-job-postings-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": [
        "greenhouse:stripe",
        "https://jobs.ashbyhq.com/ramp",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("lowfieldlabs/ats-job-postings-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": [
    "greenhouse:stripe",
    "https://jobs.ashbyhq.com/ramp"
  ]
}' |
apify call lowfieldlabs/ats-job-postings-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ATS Job Postings Scraper (Greenhouse, Lever, Ashby, Workable)",
        "version": "0.1",
        "x-build-id": "BLDHsUpQv9AFHIr8r"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/lowfieldlabs~ats-job-postings-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-lowfieldlabs-ats-job-postings-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/lowfieldlabs~ats-job-postings-scraper/runs": {
            "post": {
                "operationId": "runs-sync-lowfieldlabs-ats-job-postings-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/lowfieldlabs~ats-job-postings-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-lowfieldlabs-ats-job-postings-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",
                        "type": "array",
                        "description": "One entry per company: a careers URL (https://boards.greenhouse.io/stripe, https://jobs.lever.co/…, https://jobs.ashbyhq.com/…, https://apply.workable.com/…), an explicit provider:slug (greenhouse:stripe, lever:plaid, ashby:ramp, workable:blueground), or a bare slug to auto-detect across all four ATSs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "keywords": {
                        "title": "Keywords (any match)",
                        "type": "array",
                        "description": "Keep only jobs whose title (or description, if fetched) contains ANY of these, case-insensitive. Empty = keep all.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "locationContains": {
                        "title": "Location contains",
                        "type": "string",
                        "description": "Keep only jobs whose location contains this text, e.g. \"new york\" or \"remote\"."
                    },
                    "remoteOnly": {
                        "title": "Remote only",
                        "type": "boolean",
                        "description": "Keep only jobs the board explicitly marks remote.",
                        "default": false
                    },
                    "maxAgeDays": {
                        "title": "Max posting age (days)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Drop postings older than this many days (kept when the board exposes no date)."
                    },
                    "maxJobsPerCompany": {
                        "title": "Max jobs per company",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Safety cap per company.",
                        "default": 200
                    },
                    "includeDescription": {
                        "title": "Include full description",
                        "type": "boolean",
                        "description": "Fetch the full job description (HTML and/or plain text) where the ATS provides it.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
