# Company Jobs Scraper - Greenhouse, Lever, Ashby & 7 more (`zmei-automations/company-jobs-scraper`) Actor

Pull every live job from the exact companies you choose, across 10 ATS (Greenhouse, Lever, Ashby, Workable, Personio & more), normalized into one dataset with structured salary. Export to JSON, CSV, or Excel, schedule runs, monitor new postings.

- **URL**: https://apify.com/zmei-automations/company-jobs-scraper.md
- **Developed by:** [ZMEI Automations](https://apify.com/zmei-automations) (community)
- **Categories:** Jobs, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

Give it a list of companies and it pulls **every job they currently have open**, straight from the hiring software each company runs on. It reads ten applicant tracking systems (ATS): Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, Workable, Personio, Teamtailor, BambooHR, and Breezy, and returns them as one clean dataset.

Everything comes from each platform's public job-board API. No API keys or logins, and nothing that breaks when a careers page gets restyled. Around 2,750 company boards are built in and kept current, or you can point a run at your own list.

### What does Company Jobs Scraper do?

It calls each platform's job-board API, flattens all ten formats into a single schema, and writes rows you can download as JSON, CSV, Excel, or HTML. The difference from a keyword job-search API is that this one is company-first: you give it companies, not search terms, and get back all of their open roles, fetched live the moment the run starts. Where a platform publishes pay, it captures structured salary too (min, max, currency): Greenhouse pay-transparency roles, plus Lever, Ashby, Recruitee, and Breezy.

### Why use Company Jobs Scraper?

Most job APIs are keyword search engines: you type "data scientist, Berlin" and get a firehose of everything that matches. This is the opposite. You pick the companies, and you get every role they have open right now. That makes it useful for tracking specific employers, sourcing candidates, or watching who your target accounts are hiring.

Because the data is fetched at run time, there's no stale database sitting behind it and no model guessing at fields. You get the real posting or you get nothing. Salary, where the employer actually publishes it, arrives as numbers you can sort and filter on rather than a string you have to parse.

Switch on "Only new jobs", put it on a schedule, and it becomes a monitor: each run returns only what's been posted since the last one. People run it for candidate sourcing, competitor hiring intelligence, building job boards, and labor-market research.

### Which ATS and job boards does it scrape?

One run covers all ten. It works as a Greenhouse scraper, a Lever scraper, an Ashby scraper, a Workable scraper, and six more. To target a company, copy its token out of the careers-page URL:

| ATS                 | Careers-page URL pattern             | Structured salary?             |
| ------------------- | ------------------------------------ | ------------------------------ |
| **Greenhouse**      | `boards.greenhouse.io/{token}`       | ✅ on pay-transparency roles   |
| **Lever**           | `jobs.lever.co/{client}`             | ✅ where the employer posts it |
| **Ashby**           | `jobs.ashbyhq.com/{client}`          | ✅ where the employer posts it |
| **Recruitee**       | `{company}.recruitee.com`            | ✅ where the employer posts it |
| **Breezy**          | `{company}.breezy.hr`                | ✅ where the employer posts it |
| **SmartRecruiters** | `jobs.smartrecruiters.com/{Company}` | — (not in the public API)      |
| **Workable**        | `apply.workable.com/{account}`       | — (not in the public API)      |
| **Personio**        | `{company}.jobs.personio.com`        | — (not in the public feed)     |
| **Teamtailor**      | `{company}.teamtailor.com`           | — (not in the public feed)     |
| **BambooHR**        | `{company}.bamboohr.com`             | — (no salary or posting date)  |

### How to use Company Jobs Scraper

1. Hit **Start** (or **Try for free**).
2. Keep the prefilled example companies, paste your own tokens into the relevant ATS lists, or tick **Scan ALL boards** to sweep everything built in.
3. Optionally narrow the results with filters (keyword, location, employment type, remote, posted-after) and a **Max total results** cap.
4. Run it, then export the dataset as JSON, CSV, or Excel from the **Output** tab.

### Input

The input form is grouped into sections: **Companies & boards**, **Filters**, **Output & limits**, and **Advanced**.

| Field                                                                                                               | What it does                                                                                                                                                          |
| ------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Scan ALL boards**                                                                                                 | Sweep all ~2,750 built-in boards (the whole market, not a list). Can return **100,000+ jobs** and is **not capped** — scope it with filters or **Max total results**. |
| **Greenhouse / Lever / Ashby / Recruitee / SmartRecruiters / Workable / Personio / Breezy / Teamtailor / BambooHR** | One list per ATS. Paste the company tokens you want (see _Find a board token_ below). Fill any list to scope the run to exactly those companies.                      |
| **Keyword**                                                                                                         | Keep only jobs whose **title or department** contains this text.                                                                                                      |
| **Location**                                                                                                        | Keep only jobs whose location contains this text (e.g. `London`).                                                                                                     |
| **Employment type**                                                                                                 | Keep only jobs whose type contains this text (e.g. `Full`, `Intern`).                                                                                                 |
| **Posted after**                                                                                                    | Keep only jobs posted/updated on or after this date.                                                                                                                  |
| **Remote only**                                                                                                     | Keep only jobs that look remote.                                                                                                                                      |
| **With salary only**                                                                                                | Keep only jobs that have a structured salary (handy for comp analysis).                                                                                               |
| **Only new jobs**                                                                                                   | Output only jobs not seen on previous runs. Turns the Actor into a **monitoring tool**.                                                                               |
| **Include full description**                                                                                        | Add a `descriptionText` field with the full job description (off by default; increases dataset size, not the per-result price).                                       |
| **Max jobs per company**                                                                                            | Cap per board (0 = no limit).                                                                                                                                         |
| **Max total results**                                                                                               | Stop after this many total results (0 = no limit). Recommended when **Scan ALL boards** is on.                                                                        |
| **Concurrency**                                                                                                     | How many boards to fetch in parallel (default 12).                                                                                                                    |

Fill any board list and the run is scoped to exactly those boards. Leave them all empty for a small curated sample, or turn on **Scan ALL boards** for the whole market.

### Output

![Company Jobs Scraper output — the Apify Console Output tab showing live jobs scraped across multiple ATS, with structured salary on the rows that expose it](https://raw.githubusercontent.com/zmei-systems/public/main/company-jobs-scraper-output.jpg)

One row per job, normalized across all ten platforms. Here's a row with structured salary (Ashby) and one without (Personio, which doesn't expose salary in its public feed):

```json
[
    {
        "source": "ashby",
        "company": "ramp",
        "companyName": "Ramp",
        "title": "Director, Performance Marketing",
        "location": "New York, NY (HQ)",
        "department": "Marketing",
        "employmentType": "FullTime",
        "remote": false,
        "salary": "$191K – $291K • Offers Equity",
        "salaryMin": 191000,
        "salaryMax": 291000,
        "salaryCurrency": "USD",
        "salaryInterval": "year",
        "url": "https://jobs.ashbyhq.com/ramp/…",
        "postedAt": "2026-06-20T12:00:00.000Z"
    },
    {
        "source": "personio",
        "company": "k15t",
        "companyName": "K15t",
        "title": "Senior Backend Engineer (m/f/d)",
        "location": "Stuttgart, Germany",
        "department": "Engineering",
        "employmentType": "Full-time / Permanent",
        "remote": false,
        "salary": "",
        "salaryMin": null,
        "salaryMax": null,
        "salaryCurrency": "",
        "salaryInterval": "",
        "url": "https://k15t.jobs.personio.com/job/…",
        "postedAt": "2026-06-18T09:30:00.000Z"
    }
]
````

Export it as JSON, CSV, Excel, or HTML.

#### Every result is a complete row

You don't pick fields one at a time, because there's no reason to. One fetch returns the whole record (company, title, location, salary, dates, links), and you're billed per result, not per field. A row where you only read one column costs exactly what a row where you read all of them costs. The only field that's off by default is the full job description, and that's not a pricing thing (every row is the same price); it just makes the dataset much heavier, so it sits behind a toggle (`includeDescription`).

#### Data fields

| Field                           | Description                                                                                                       |
| ------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| source                          | `greenhouse`/`lever`/`ashby`/`recruitee`/`smartrecruiters`/`workable`/`personio`/`breezy`/`teamtailor`/`bamboohr` |
| company                         | board token (stable join key)                                                                                     |
| companyName                     | human-readable company name                                                                                       |
| title                           | job title                                                                                                         |
| location                        | location text                                                                                                     |
| department                      | department / team                                                                                                 |
| employmentType                  | full-time, contract, intern… (where the platform exposes it)                                                      |
| remote                          | boolean                                                                                                           |
| salary                          | raw salary text as shown on the board                                                                             |
| salaryMin / salaryMax           | structured numbers (Greenhouse, Lever, Ashby, Recruitee, Breezy, where posted)                                    |
| salaryCurrency / salaryInterval | e.g. `USD`, `year`                                                                                                |
| url                             | direct link to the job                                                                                            |
| postedAt                        | ISO date (BambooHR listings don't include a date)                                                                 |
| descriptionText                 | full job description (only with `includeDescription`)                                                             |

### How much does it cost?

You pay per result: one flat price per job returned, never per field. Apify adds a tiny start fee of about $0.00005 per run, which you can ignore. Billing goes through Apify, so there's nothing to wire up.

| What you pay     | Price                                 |
| ---------------- | ------------------------------------- |
| To start a run   | ~$0.00005 (Apify default, negligible) |
| Per job returned | $0.0013 = **$1.30 per 1,000 results** |

What that works out to:

| Jobs returned | Approx. total |
| ------------- | ------------- |
| 100           | ~$0.13        |
| 1,000         | ~$1.30        |
| 10,000        | ~$13.00       |

How big is a run? A single company is usually tens to a few hundred jobs. The curated sample (an empty run) is a few thousand. **Scan ALL boards** sweeps the whole market and can pull **100,000+ jobs** — it's **not capped**, so set **Max total results** (or a max cost-per-run in Apify) if you want to bound the spend.

You only pay for the rows you keep, so the filters, `maxItems`, and scoping to specific boards are your cost controls.

### Tips & advanced options

- **Finding a board token.** Open a company's careers page and take the token out of the URL: `boards.greenhouse.io/{token}`, `jobs.lever.co/{client}`, `jobs.ashbyhq.com/{client}`, `{company}.recruitee.com`, `jobs.smartrecruiters.com/{Company}`, `apply.workable.com/{account}`, `{company}.jobs.personio.com`, `{company}.breezy.hr`, `{company}.teamtailor.com`, or `{company}.bamboohr.com`. SmartRecruiters IDs are case-sensitive, and Teamtailor tokens sometimes carry a region part like `unspun.na`.
- **Salary coverage.** Structured salary comes from Greenhouse (pay-transparency roles), Lever, Ashby, Recruitee, and Breezy. The other five (SmartRecruiters, Workable, Personio, Teamtailor, BambooHR) don't expose pay in their public APIs, so those rows leave the salary fields empty; they're there for coverage. BambooHR listings also don't carry a posting date.
- **Monitoring.** Turn on `onlyNewJobs` and schedule the Actor. Each run returns only newly posted jobs, so you can watch your target companies without paying again for jobs you've already seen.
- **Compensation analysis.** Combine `salaryOnly` with the **Salary** view on the Output tab for a clean comp table.
- **Freshness.** The built-in board set is refreshed regularly, so dead boards drop off and new ones get added.

### FAQ, disclaimers & support

- **Is this legal?** The Actor only reads each platform's official, public job-board API, the same data shown on a company's public careers page. It doesn't log in, bypass protections, or collect personal data. You're responsible for following the platforms' terms and applicable law in how you use the data.
- **Not affiliated** with Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, Workable, Personio, Teamtailor, BambooHR, or Breezy.
- **Coverage.** This is the broadest multi-ATS coverage we can verify, not *every* company on earth. None of these platforms publish a master directory, so the board set is discovered, verified, and refreshed over time.
- **Missing a company, or hit a bug?** Use the **Issues** tab. Requests for specific boards are welcome.

# Actor input Schema

## `scanAllBoards` (type: `boolean`):

Sweep the entire built-in set of ~2,750 verified company boards across all ten ATS — the whole market, not a specific list. HEADS UP: a full sweep can return 100,000+ jobs and cost $100+ at the per-result price, and it is NOT capped. Use the filters and 'Max total results' below to bound it (or set a max cost-per-run in Apify). When off, an empty run uses a small curated sample. Ignored if you fill any board list below.

## `greenhouse` (type: `array`):

Company board tokens from boards.greenhouse.io/{token} (e.g. stripe, figma). Fill this to scope the run to just these boards. Leave all board lists empty to use the curated sample, or turn on 'Scan ALL boards'.

## `lever` (type: `array`):

Client names from jobs.lever.co/{client} (e.g. spotify).

## `ashby` (type: `array`):

Client names from jobs.ashbyhq.com/{client} (e.g. ramp, notion).

## `recruitee` (type: `array`):

Subdomains from {company}.recruitee.com (e.g. channable, duckduckgo). Recruitee exposes structured salary.

## `smartrecruiters` (type: `array`):

Company IDs from jobs.smartrecruiters.com/{Company} (e.g. Sportradar, ServiceNow). CASE-SENSITIVE. Large enterprise boards; no salary in the public API.

## `workable` (type: `array`):

Account names from apply.workable.com/{account} (e.g. activtrak). No salary in the public API.

## `personio` (type: `array`):

Subdomains from {company}.jobs.personio.com (e.g. stark, k15t). Common across Europe. No salary in the public feed.

## `breezy` (type: `array`):

Subdomains from {company}.breezy.hr (e.g. cariina, vetsez). Often exposes structured salary.

## `teamtailor` (type: `array`):

Subdomains from {company}.teamtailor.com (e.g. luminorbank, iqm; include any region part such as 'unspun.na'). No salary.

## `bamboohr` (type: `array`):

Subdomains from {company}.bamboohr.com (e.g. rednucleus). Listings only — no salary, description, or posting date.

## `keyword` (type: `string`):

Only keep jobs whose title or department contains this text (optional).

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

Only keep jobs whose location contains this text, e.g. 'London', 'Germany', 'New York' (optional).

## `employmentType` (type: `string`):

Only keep jobs whose employment type contains this text, e.g. 'Full', 'Intern', 'Contract'. Note: Greenhouse does not expose employment type, so this excludes Greenhouse jobs.

## `postedAfter` (type: `string`):

Only keep jobs posted/updated on or after this date (YYYY-MM-DD). Jobs without a date are excluded when this is set.

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

Keep only jobs that look remote.

## `salaryOnly` (type: `boolean`):

Keep only jobs that have a structured salary (salaryMin/salaryMax). Great for compensation analysis.

## `onlyNewJobs` (type: `boolean`):

Output only jobs not seen on previous runs (remembers them in the `ats-seen` key-value store). Turn this Actor into a monitoring tool: schedule it and each run returns just the newly posted jobs.

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

Add a descriptionText field with the full job description as plain text. Increases dataset size (not the per-result price) — off by default.

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

Cap how many jobs are taken from each board. Leave at 0 (the default) to fetch EVERY open job from each company. Set a number only if you want to limit per-company volume or cost.

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

Stop after this many jobs across the whole run (cost control). 0 = no limit (default). Strongly recommended when 'Scan ALL boards' is on, since a full sweep can be 100,000+ jobs.

## `concurrency` (type: `integer`):

How many company boards to fetch in parallel. Higher is faster; lower is gentler on the source APIs. Default 12.

## Actor input object example

```json
{
  "scanAllBoards": false,
  "greenhouse": [
    "figma",
    "stripe"
  ],
  "lever": [
    "spotify"
  ],
  "ashby": [
    "ramp",
    "notion"
  ],
  "remoteOnly": false,
  "salaryOnly": false,
  "onlyNewJobs": false,
  "includeDescription": false,
  "maxJobsPerCompany": 0,
  "maxItems": 0,
  "concurrency": 12
}
```

# Actor output Schema

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

All scraped job postings, one row per job. In the Output tab, switch between the Jobs and Salary views; export as JSON, CSV, Excel, or HTML.

# 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 = {
    "greenhouse": [
        "figma",
        "stripe"
    ],
    "lever": [
        "spotify"
    ],
    "ashby": [
        "ramp",
        "notion"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zmei-automations/company-jobs-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 = {
    "greenhouse": [
        "figma",
        "stripe",
    ],
    "lever": ["spotify"],
    "ashby": [
        "ramp",
        "notion",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("zmei-automations/company-jobs-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 '{
  "greenhouse": [
    "figma",
    "stripe"
  ],
  "lever": [
    "spotify"
  ],
  "ashby": [
    "ramp",
    "notion"
  ]
}' |
apify call zmei-automations/company-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Company Jobs Scraper - Greenhouse, Lever, Ashby & 7 more",
        "description": "Pull every live job from the exact companies you choose, across 10 ATS (Greenhouse, Lever, Ashby, Workable, Personio & more), normalized into one dataset with structured salary. Export to JSON, CSV, or Excel, schedule runs, monitor new postings.",
        "version": "1.0",
        "x-build-id": "3Y5k3XrIfchKGenQx"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/zmei-automations~company-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-zmei-automations-company-jobs-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/zmei-automations~company-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-zmei-automations-company-jobs-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/zmei-automations~company-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-zmei-automations-company-jobs-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",
                "properties": {
                    "scanAllBoards": {
                        "title": "Scan ALL boards (whole market)",
                        "type": "boolean",
                        "description": "Sweep the entire built-in set of ~2,750 verified company boards across all ten ATS — the whole market, not a specific list. HEADS UP: a full sweep can return 100,000+ jobs and cost $100+ at the per-result price, and it is NOT capped. Use the filters and 'Max total results' below to bound it (or set a max cost-per-run in Apify). When off, an empty run uses a small curated sample. Ignored if you fill any board list below.",
                        "default": false
                    },
                    "greenhouse": {
                        "title": "Greenhouse boards",
                        "type": "array",
                        "description": "Company board tokens from boards.greenhouse.io/{token} (e.g. stripe, figma). Fill this to scope the run to just these boards. Leave all board lists empty to use the curated sample, or turn on 'Scan ALL boards'.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "lever": {
                        "title": "Lever boards",
                        "type": "array",
                        "description": "Client names from jobs.lever.co/{client} (e.g. spotify).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ashby": {
                        "title": "Ashby boards",
                        "type": "array",
                        "description": "Client names from jobs.ashbyhq.com/{client} (e.g. ramp, notion).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "recruitee": {
                        "title": "Recruitee boards",
                        "type": "array",
                        "description": "Subdomains from {company}.recruitee.com (e.g. channable, duckduckgo). Recruitee exposes structured salary.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "smartrecruiters": {
                        "title": "SmartRecruiters boards",
                        "type": "array",
                        "description": "Company IDs from jobs.smartrecruiters.com/{Company} (e.g. Sportradar, ServiceNow). CASE-SENSITIVE. Large enterprise boards; no salary in the public API.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "workable": {
                        "title": "Workable boards",
                        "type": "array",
                        "description": "Account names from apply.workable.com/{account} (e.g. activtrak). No salary in the public API.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "personio": {
                        "title": "Personio boards",
                        "type": "array",
                        "description": "Subdomains from {company}.jobs.personio.com (e.g. stark, k15t). Common across Europe. No salary in the public feed.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "breezy": {
                        "title": "Breezy boards",
                        "type": "array",
                        "description": "Subdomains from {company}.breezy.hr (e.g. cariina, vetsez). Often exposes structured salary.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "teamtailor": {
                        "title": "Teamtailor boards",
                        "type": "array",
                        "description": "Subdomains from {company}.teamtailor.com (e.g. luminorbank, iqm; include any region part such as 'unspun.na'). No salary.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "bamboohr": {
                        "title": "BambooHR boards",
                        "type": "array",
                        "description": "Subdomains from {company}.bamboohr.com (e.g. rednucleus). Listings only — no salary, description, or posting date.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "keyword": {
                        "title": "Keyword filter",
                        "type": "string",
                        "description": "Only keep jobs whose title or department contains this text (optional)."
                    },
                    "location": {
                        "title": "Location filter",
                        "type": "string",
                        "description": "Only keep jobs whose location contains this text, e.g. 'London', 'Germany', 'New York' (optional)."
                    },
                    "employmentType": {
                        "title": "Employment type filter",
                        "type": "string",
                        "description": "Only keep jobs whose employment type contains this text, e.g. 'Full', 'Intern', 'Contract'. Note: Greenhouse does not expose employment type, so this excludes Greenhouse jobs."
                    },
                    "postedAfter": {
                        "title": "Posted after",
                        "type": "string",
                        "description": "Only keep jobs posted/updated on or after this date (YYYY-MM-DD). Jobs without a date are excluded when this is set."
                    },
                    "remoteOnly": {
                        "title": "Remote only",
                        "type": "boolean",
                        "description": "Keep only jobs that look remote.",
                        "default": false
                    },
                    "salaryOnly": {
                        "title": "With salary only",
                        "type": "boolean",
                        "description": "Keep only jobs that have a structured salary (salaryMin/salaryMax). Great for compensation analysis.",
                        "default": false
                    },
                    "onlyNewJobs": {
                        "title": "Only new jobs (incremental)",
                        "type": "boolean",
                        "description": "Output only jobs not seen on previous runs (remembers them in the `ats-seen` key-value store). Turn this Actor into a monitoring tool: schedule it and each run returns just the newly posted jobs.",
                        "default": false
                    },
                    "includeDescription": {
                        "title": "Include full description",
                        "type": "boolean",
                        "description": "Add a descriptionText field with the full job description as plain text. Increases dataset size (not the per-result price) — off by default.",
                        "default": false
                    },
                    "maxJobsPerCompany": {
                        "title": "Max jobs per company",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Cap how many jobs are taken from each board. Leave at 0 (the default) to fetch EVERY open job from each company. Set a number only if you want to limit per-company volume or cost.",
                        "default": 0
                    },
                    "maxItems": {
                        "title": "Max total results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Stop after this many jobs across the whole run (cost control). 0 = no limit (default). Strongly recommended when 'Scan ALL boards' is on, since a full sweep can be 100,000+ jobs.",
                        "default": 0
                    },
                    "concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 30,
                        "type": "integer",
                        "description": "How many company boards to fetch in parallel. Higher is faster; lower is gentler on the source APIs. Default 12.",
                        "default": 12
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
