# ATS Job Scraper — Greenhouse, Lever & Ashby Careers (`chilly_damask/company-careers-job-scraper`) Actor

Scrape live job postings straight from Greenhouse, Lever, and Ashby public careers APIs, normalized into one schema. No login, no API keys, no browser. Pay per job.

- **URL**: https://apify.com/chilly\_damask/company-careers-job-scraper.md
- **Developed by:** [Jaxx](https://apify.com/chilly_damask) (community)
- **Categories:** Jobs, Lead generation, Business
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 job scrapeds

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

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 — Greenhouse, Lever & Ashby Careers, One Schema

**Pull live job postings straight from companies' own careers pages — Greenhouse, Lever, and Ashby — normalized into one clean, deduplicated table. No login, no API keys, no browser. You pay per job.**

Most job scrapers point at Indeed or LinkedIn and fight anti-bot walls all day. This one goes to the **source**: the official, public job-board APIs that Greenhouse, Lever, and Ashby publish so companies can embed their own careers page. That means clean structured data, no CAPTCHAs, no breakage — and the **same schema whether a job came from Greenhouse, Lever, or Ashby**, so you never reconcile three different scrapers again.

- 🏢 **Straight from the company** — the ATS the employer actually uses, not a noisy aggregator
- 🔀 **Three ATSs, one schema** — Greenhouse + Lever + Ashby normalized together, deduplicated by source + job ID across the whole run
- 💰 **Salary where it's public** — Ashby (and some Lever) postings include compensation
- 🌍 **Remote flag, department, team, location, apply URL, posted date, full description**
- 💵 **Pay per job** — a board that returns nothing costs you nothing

***

### 🎯 Best for

- **Recruiters & sourcers** — track exactly what target companies are hiring for, in real time.
- **Sales & GTM teams** — hiring signals are buying signals; find companies staffing up a function you sell to.
- **Job boards & aggregators** — ingest clean, structured postings direct from the source ATS.
- **Labor-market & comp analytics** — postings + salary data across hundreds of companies, one schema.
- **Candidates & career tools** — monitor a set of dream companies and get new roles the day they post.

***

### ⚙️ How it works

Plain HTTP against each ATS's **official public job-board endpoint** — no login, no key, no browser:

- **Greenhouse** — `boards-api.greenhouse.io/v1/boards/<token>/jobs` (with full descriptions).
- **Lever** — `api.lever.co/v0/postings/<company>?mode=json`.
- **Ashby** — `api.ashbyhq.com/posting-api/job-board/<org>` (with compensation where published).

Every posting is normalized into one schema and deduplicated by source + job ID.

***

### ▶️ How to use (no code)

1. Find each company's ATS slug from its careers-page URL:
   - Greenhouse → the token in `boards.greenhouse.io/`**`stripe`** (or a `greenhouse.io` embed).
   - Lever → the name in `jobs.lever.co/`**`gopuff`**.
   - Ashby → the name in `jobs.ashbyhq.com/`**`ramp`**.
2. Put those slugs into **Greenhouse board tokens**, **Lever company slugs**, and/or **Ashby org slugs**.
3. (Optional) filter by title keywords, location, department, remote-only, or posted-since date.
4. Click **Start**, then export as JSON, CSV, Excel, XML, or HTML — or pull it via the API.

***

### 📥 Input

| Field | Type | Notes |
|---|---|---|
| `greenhouseTokens` | array | Greenhouse board tokens, e.g. `["stripe","gitlab"]`. |
| `leverCompanies` | array | Lever company slugs, e.g. `["gopuff"]`. |
| `ashbyOrgs` | array | Ashby org slugs, e.g. `["ramp"]`. |
| `titleIncludes` | array | Keep only titles containing any of these (case-insensitive). |
| `locationIncludes` | array | Keep only locations containing any of these. |
| `departmentIncludes` | array | Keep only jobs whose department/team match. |
| `remoteOnly` | boolean | Only postings flagged remote. Default `false`. |
| `postedSince` | ISO date | Only jobs posted on/after this date — cheap incremental re-runs. |
| `maxJobsPerCompany` | integer | Cap per company after filters. `0` = no cap. |
| `includeDescription` | boolean | Include full description (text + HTML). Default `true`. |

#### Example input

```json
{
  "greenhouseTokens": ["stripe", "gitlab"],
  "leverCompanies": ["gopuff"],
  "ashbyOrgs": ["ramp"],
  "titleIncludes": ["engineer", "designer"],
  "remoteOnly": true
}
```

***

### 📤 Output — one record per job

```json
{
  "source": "ashby",
  "company": "ramp",
  "jobId": "03e2d4e1-73ad-4f09-a058-2eb9ce...",
  "title": "Technical Consultant, Mid-Market",
  "department": "Sales",
  "team": "Mid-Market",
  "location": "Remote (US); San Francisco, CA; New York, NY",
  "isRemote": true,
  "employmentType": "FullTime",
  "compensation": "$151K – $231K • Offers Equity",
  "postedAt": "2026-07-07T20:47:09.753+00:00",
  "updatedAt": null,
  "applyUrl": "https://jobs.ashbyhq.com/ramp/03e2d4e1-...",
  "jobUrl": "https://jobs.ashbyhq.com/ramp/03e2d4e1-...",
  "descriptionText": "ABOUT RAMP Ramp is building the smart infrastructure...",
  "descriptionHtml": "<p>ABOUT RAMP...</p>",
  "scrapedAt": "2026-07-10T18:00:00.000Z"
}
```

`source` is `greenhouse`, `lever`, or `ashby`. Fields a given ATS doesn't expose come back `null` — the schema stays identical across all three.

***

### 💰 Pricing (pay-per-event)

You are charged a **fixed price per result**, not for compute.

| Event | Price | When you're charged |
|---|---|---|
| `job-scraped` | **$0.001** | Once per unique job posting returned. |
| `company-resolved` | **$0.005** | Once per company board that returns at least one job. A board that yields nothing is free. |

**Worked example:** 5 companies returning 800 jobs total = 800 × $0.001 = **$0.80**, plus 5 × $0.005 = **$0.025**. Total ≈ **$0.83**.

***

### ❓ FAQ

**Which companies can I scrape?** Any company whose careers page runs on **Greenhouse, Lever, or Ashby** — that's a large share of tech and startup hiring. You supply the ATS slug; the actor does the rest.

**Is this legal / is it personal data?** It reads only **public job postings** an employer chose to publish, from the ATS's own public API. The **structured fields it extracts are company and role information only** — never applicant or candidate data. Note that the free-text **job description** (returned when `includeDescription` is on) is the employer's own text and can occasionally include an incidental recruiter name or contact email; if you need a strictly PII-free dataset, set **`includeDescription: false`** and descriptions are omitted. Use the data lawfully (GDPR/CCPA, each ATS's terms).

**Why not Indeed / LinkedIn?** Those are anti-bot aggregators of second-hand data. Going to the source ATS is cleaner, more reliable, and more complete for the companies you care about.

**Can I run it on a schedule?** Yes — schedule it in the Console, call it via API, or wire the output into Make, Zapier, Slack, Google Sheets, or a webhook for real-time hiring alerts.

**Workday / other ATSs?** Greenhouse, Lever, and Ashby ship first. Workday and others are on the roadmap.

***

### 🔌 API-ready

Apify auto-generates integration snippets — JavaScript, Python, CLI, REST, OpenAPI, and an MCP server — so you can drop this into your stack or an agent workflow. See the **API** tab.

***

### Maintainer

Published by **Jaxx**. Want another ATS supported (Workday, SmartRecruiters, Workable) or a field added? Open an issue on the **Issues** tab — requests and edge cases are actively reviewed.

# Actor input Schema

## `greenhouseTokens` (type: `array`):

Greenhouse job-board tokens — the company slug in boards.greenhouse.io/<THIS> or in a careers page's Greenhouse embed (e.g. "stripe", "gitlab"). Leave empty to skip Greenhouse.

## `leverCompanies` (type: `array`):

Lever company slugs — the name in jobs.lever.co/<THIS> (e.g. "gopuff"). Leave empty to skip Lever.

## `ashbyOrgs` (type: `array`):

Ashby organization slugs — the name in jobs.ashbyhq.com/<THIS> (e.g. "ramp"). Leave empty to skip Ashby.

## `titleIncludes` (type: `array`):

Only keep jobs whose title contains at least one of these (case-insensitive), e.g. \["engineer","designer"]. Empty = all titles.

## `locationIncludes` (type: `array`):

Only keep jobs whose location contains at least one of these (case-insensitive), e.g. \["New York","London","remote"]. Empty = all locations.

## `departmentIncludes` (type: `array`):

Only keep jobs whose department or team contains at least one of these (case-insensitive), e.g. \["sales","marketing"]. Empty = all.

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

If on, return only postings flagged remote (Lever workplaceType / Ashby isRemote / "remote" in the location).

## `postedSince` (type: `string`):

Only return jobs posted on or after this date, e.g. 2026-01-01. Enables cheap incremental re-runs. Leave empty for all.

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

Cap jobs returned per company board (after filters). 0 = no cap (all matching jobs).

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

Also return each job's full description (plain text + HTML). Turn off for a lighter, cheaper dataset of just titles, locations, and links.

## Actor input object example

```json
{
  "greenhouseTokens": [
    "stripe",
    "gitlab"
  ],
  "leverCompanies": [
    "gopuff"
  ],
  "ashbyOrgs": [
    "ramp"
  ],
  "remoteOnly": false,
  "maxJobsPerCompany": 0,
  "includeDescription": true
}
```

# Actor output Schema

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

Every scraped job in the overview table — ATS, company, title, location, remote flag, compensation, apply URL.

## `jobsCsv` (type: `string`):

All scraped jobs exported as a CSV file.

# 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 = {
    "greenhouseTokens": [
        "stripe"
    ],
    "leverCompanies": [
        "gopuff"
    ],
    "ashbyOrgs": [
        "ramp"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("chilly_damask/company-careers-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 = {
    "greenhouseTokens": ["stripe"],
    "leverCompanies": ["gopuff"],
    "ashbyOrgs": ["ramp"],
}

# Run the Actor and wait for it to finish
run = client.actor("chilly_damask/company-careers-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 '{
  "greenhouseTokens": [
    "stripe"
  ],
  "leverCompanies": [
    "gopuff"
  ],
  "ashbyOrgs": [
    "ramp"
  ]
}' |
apify call chilly_damask/company-careers-job-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/G3PUAndzb2pM6rbZv/builds/aSK4vqlY6R0LOjE8V/openapi.json
