# ATS Jobs Scraper for Greenhouse, Lever, Ashby & More (`fetch_cat/ats-jobs-scraper`) Actor

Scrape public Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio job boards into one normalized dataset with titles, locations, departments, apply URLs, dates, and optional descriptions.

- **URL**: https://apify.com/fetch\_cat/ats-jobs-scraper.md
- **Developed by:** [Hanna Nosova](https://apify.com/fetch_cat) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.06 / 1,000 job posting saveds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are 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 Jobs Scraper: Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio Jobs in One Dataset

Scrape public ATS job boards from Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio with a single Apify Actor and export normalized job postings.

Use this actor when you need normalized jobs from multiple applicant tracking systems in one recruiting dataset.

### What does ATS Jobs Scraper do?

ATS Jobs Scraper extracts public ATS job postings from Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio job boards for recruiting, sales, market research, and job-data workflows.

It returns normalized job posting output such as title, location, department, company, apply URL, published date, and description.

- ✅ Greenhouse public job boards
- ✅ Lever public job boards
- ✅ Ashby public hosted job pages
- ✅ Recruitee public career sites
- ✅ SmartRecruiters public job pages
- ✅ Personio public job portals

It saves one normalized dataset so every row has the same job fields regardless of source. The `source` field can be `greenhouse`, `lever`, `ashby`, `recruitee`, `smartrecruiters`, or `personio`.

### Who is it for?

Recruiting teams use it to monitor hiring activity across target companies.

Sales teams use it to find companies that are hiring for roles related to their product.

Market researchers use it to track demand for specific skills, locations, departments, or seniority levels.

Job aggregators use it to collect public postings from many employer-hosted boards.

Data teams use it to standardize Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio data before loading it into a warehouse.

### Why use one combined scraper?

Many company lists contain a mix of Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio boards.

Running one combined actor is simpler than maintaining separate workflows for each ATS.

The actor detects the source from URLs when possible and also accepts source-specific slugs.

### Supported sources

Greenhouse boards include URLs such as `https://boards.greenhouse.io/airbnb`.

Lever boards include URLs such as `https://jobs.lever.co/spotify`.

Ashby boards include URLs such as `https://jobs.ashbyhq.com/openai`.

Only public, no-login job boards are supported.

### What data can you extract?

Each job posting can include:

| Field | Description |
| --- | --- |
| `source` | `greenhouse`, `lever`, `ashby`, `recruitee`, `smartrecruiters`, or `personio` |
| `companySlug` | Board slug or company identifier |
| `companyName` | Public company name when available |
| `jobId` | Source job id |
| `title` | Job title |
| `location` | Primary location text |
| `department` | Department when available |
| `team` | Team when available |
| `workplaceType` | Remote / hybrid / onsite signal when available |
| `employmentType` | Full-time, part-time, contract, or commitment text |
| `compensation` | Public compensation summary when available |
| `jobUrl` | Public job page URL |
| `applyUrl` | Public apply URL when available |
| `description` | Plain text job description when requested |
| `descriptionHtml` | HTML description when requested |
| `publishedAt` | Public creation or published date |
| `updatedAt` | Public updated date |
| `sourceRawMetadata` | Useful source-specific extras |
| `scrapedAt` | Timestamp for this run |

### How much does it cost to scrape ATS job boards?

The actor uses pay-per-event pricing.

There is a small run-start charge plus a per-job charge for each saved job posting.

Keep the first run small by using the default `maxItems` value.

Large monitoring jobs are cheaper to run as one batch than as many tiny runs.

### Quick start

1. Open the actor on Apify.
2. Add public Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, or Personio URLs in **Mixed ATS board URLs**.
3. Set **Maximum jobs**.
4. Choose whether to include descriptions.
5. Run the actor.
6. Export the dataset as JSON, CSV, Excel, XML, or via API.

### Input options

#### Mixed ATS board URLs

Use `startUrls` when you have a mixed list of public board URLs.

The actor auto-detects Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, or Personio from each URL.

#### Greenhouse board tokens or URLs

Use `greenhouseBoards` for Greenhouse-only inputs.

Examples:

- `airbnb`
- `https://boards.greenhouse.io/airbnb`

#### Lever company slugs or URLs

Use `leverCompanies` for Lever-only inputs.

Examples:

- `spotify`
- `https://jobs.lever.co/spotify`

#### Ashby board slugs or URLs

Use `ashbyBoards` for Ashby-only inputs.

Examples:

- `openai`
- `https://jobs.ashbyhq.com/openai`

#### Maximum jobs

`maxItems` limits saved jobs across all sources.

Set it low for tests and higher for production jobs.

#### Include descriptions

Turn on `includeDescriptions` when you need full job descriptions.

Turn it off when you only need listings and want faster runs.

### Filtering jobs

Use `departmentFilter` to match department or team text.

Use `locationFilter` to match location text.

Use `keywordFilter` to match title and description text.

Filters are case-insensitive.

### Example input

```json
{
  "startUrls": [
    { "url": "https://boards.greenhouse.io/airbnb" },
    { "url": "https://jobs.lever.co/spotify" },
    { "url": "https://jobs.ashbyhq.com/openai" }
  ],
  "maxItems": 30,
  "includeDescriptions": true,
  "locationFilter": "remote"
}
````

### Example output

```json
{
  "source": "lever",
  "companySlug": "spotify",
  "companyName": null,
  "jobId": "abc123",
  "title": "Data Engineer",
  "location": "New York",
  "department": "Engineering",
  "team": "Data Platform",
  "workplaceType": "hybrid",
  "employmentType": "Full-time",
  "compensation": null,
  "jobUrl": "https://jobs.lever.co/spotify/...",
  "applyUrl": "https://jobs.lever.co/spotify/.../apply",
  "description": "Plain text description...",
  "publishedAt": "2026-06-01T00:00:00.000Z",
  "updatedAt": null,
  "scrapedAt": "2026-06-24T00:00:00.000Z"
}
```

### Tips for best results

Use public company career board URLs, not search engine result URLs.

If one board returns no jobs, confirm the company still uses that ATS.

Use source-specific inputs when you already know the ATS type.

Set `includeDescriptions` to false for fast job-count monitoring.

Set `includeDescriptions` to true for keyword analysis and enrichment workflows.

### Integrations

Send the dataset to Google Sheets for recruiter review.

Load JSON into BigQuery, Snowflake, Postgres, or DuckDB.

Trigger the actor from Zapier or Make when a target-account list changes.

Use Apify webhooks to notify your team when new postings are scraped.

Combine with enrichment tools to classify roles, seniority, and skills.

### API usage: Node.js

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/ats-jobs-scraper').call({
  startUrls: [{ url: 'https://jobs.lever.co/spotify' }],
  maxItems: 20
});
console.log(run.defaultDatasetId);
```

### API usage: Python

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('fetch_cat/ats-jobs-scraper').call(run_input={
    'startUrls': [{'url': 'https://boards.greenhouse.io/airbnb'}],
    'maxItems': 20,
})
print(run['defaultDatasetId'])
```

### API usage: cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~ats-jobs-scraper/runs?token=YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"startUrls":[{"url":"https://jobs.ashbyhq.com/openai"}],"maxItems":20}'
```

### MCP usage

Use the actor from Claude Desktop or Claude Code through Apify MCP.

Use MCP or the Apify API to trigger scheduled career-board monitoring and send normalized datasets to Sheets, CRMs, BI tools, or warehouses.

MCP tool URL format:

`https://mcp.apify.com/?tools=fetch_cat/ats-jobs-scraper`

Claude Code setup example:

```bash
claude mcp add apify-ats-jobs "https://mcp.apify.com/?tools=fetch_cat/ats-jobs-scraper"
```

Claude Desktop JSON config example:

```json
{
  "mcpServers": {
    "apify-ats-jobs": {
      "url": "https://mcp.apify.com/?tools=fetch_cat/ats-jobs-scraper"
    }
  }
}
```

Example prompts:

- “Scrape these ten ATS boards and summarize remote engineering roles.”
- “Find companies hiring sales engineers in Europe.”
- “Compare new AI infrastructure job postings across this target account list.”

### Public data and legality

The actor collects publicly available job postings.

It does not log in, bypass private accounts, or access employer-only candidate data.

Always review source website terms and your local laws before using scraped data.

### Limitations

Only public ATS boards are supported. v1 covers Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio where the tenant exposes public listings without login or private data.

Some companies customize or migrate career pages, which can cause empty results.

Descriptions and metadata vary by ATS and by employer configuration.

### FAQ and troubleshooting

#### Why did a board return zero jobs?

The company may have no open roles, may use a different ATS, or may have changed its public board URL.

#### Why is a field null?

Not every ATS exposes every field. The actor keeps a stable schema and uses `null` when public data is unavailable.

#### Why are descriptions slower?

Descriptions can require more data per job, especially for Ashby detail pages. Disable descriptions for fast listing checks.

#### Can I scrape multiple ATS platforms in one run?

Yes. Add mixed Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio public board URLs to one run and the actor normalizes the results into one dataset.

#### Does this include private applicant data?

No. The actor collects public job postings only. It does not log in, access applicant tracking back offices, or collect candidate/applicant records.

#### Can I use it as an ATS jobs API?

Yes. Run it through the Apify API, schedules, webhooks, or MCP to refresh public career-board data and export the normalized dataset to your own tools.

### Related actors and scrapers

- [Greenhouse Jobs Scraper](https://apify.com/fetch_cat/greenhouse-jobs-scraper)
- [Lever Jobs Scraper](https://apify.com/fetch_cat/lever-jobs-scraper)
- [Ashby Jobs Scraper](https://apify.com/fetch_cat/ashby-jobs-scraper)
- [Workday Jobs Scraper](https://apify.com/fetch_cat/workday-jobs-scraper)

### Changelog

#### 0.1

Initial combined public jobs scraper for Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio.

### Support

If a public board fails, include the exact URL, input JSON, and run ID when requesting support.

### Data freshness

Each run fetches current public data and records `scrapedAt` for traceability.

### Export formats

Apify datasets can be exported as JSON, CSV, Excel, XML, RSS, or HTML.

### Scheduling

Use Apify schedules to monitor the same company list daily or weekly.

### Webhooks

Use Apify webhooks to trigger downstream workflows after each successful run.

### Storage

Results are saved to the default Apify dataset for the run.

### Privacy

The actor does not collect private applicant data or candidate profiles.

# Actor input Schema

## `startUrls` (type: `array`):

Public Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, or Personio board URLs. The actor auto-detects the source from each URL.

## `greenhouseBoards` (type: `array`):

Greenhouse board tokens such as airbnb, or public board URLs.

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

Lever company slugs such as spotify, or public Lever job board URLs.

## `ashbyBoards` (type: `array`):

Ashby hosted jobs page slugs such as openai, or public Ashby board URLs.

## `recruiteeCompanies` (type: `array`):

Recruitee company subdomains such as bunq, or public Recruitee careers URLs.

## `smartRecruitersCompanies` (type: `array`):

SmartRecruiters company identifiers such as SmartRecruiters, or public SmartRecruiters board URLs.

## `personioCompanies` (type: `array`):

Personio company subdomains such as egym, or public Personio job board URLs.

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

Maximum number of job postings to save across all sources.

## `includeDescriptions` (type: `boolean`):

Fetch and save full job descriptions where the public source exposes them. Turn off for faster listing-only runs.

## `departmentFilter` (type: `string`):

Optional case-insensitive match against department/team fields.

## `locationFilter` (type: `string`):

Optional case-insensitive match against location text.

## `keywordFilter` (type: `string`):

Optional case-insensitive match against job title and description.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://boards.greenhouse.io/airbnb"
    },
    {
      "url": "https://jobs.lever.co/spotify"
    },
    {
      "url": "https://jobs.ashbyhq.com/openai"
    },
    {
      "url": "https://bunq.recruitee.com"
    },
    {
      "url": "https://jobs.smartrecruiters.com/SmartRecruiters"
    },
    {
      "url": "https://egym.jobs.personio.de"
    }
  ],
  "greenhouseBoards": [
    "airbnb"
  ],
  "leverCompanies": [
    "spotify"
  ],
  "ashbyBoards": [
    "openai"
  ],
  "recruiteeCompanies": [
    "bunq"
  ],
  "smartRecruitersCompanies": [
    "SmartRecruiters"
  ],
  "personioCompanies": [
    "egym"
  ],
  "maxItems": 20,
  "includeDescriptions": true
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://boards.greenhouse.io/airbnb"
        },
        {
            "url": "https://jobs.lever.co/spotify"
        },
        {
            "url": "https://jobs.ashbyhq.com/openai"
        },
        {
            "url": "https://bunq.recruitee.com"
        },
        {
            "url": "https://jobs.smartrecruiters.com/SmartRecruiters"
        },
        {
            "url": "https://egym.jobs.personio.de"
        }
    ],
    "greenhouseBoards": [
        "airbnb"
    ],
    "leverCompanies": [
        "spotify"
    ],
    "ashbyBoards": [
        "openai"
    ],
    "recruiteeCompanies": [
        "bunq"
    ],
    "smartRecruitersCompanies": [
        "SmartRecruiters"
    ],
    "personioCompanies": [
        "egym"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetch_cat/ats-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 = {
    "startUrls": [
        { "url": "https://boards.greenhouse.io/airbnb" },
        { "url": "https://jobs.lever.co/spotify" },
        { "url": "https://jobs.ashbyhq.com/openai" },
        { "url": "https://bunq.recruitee.com" },
        { "url": "https://jobs.smartrecruiters.com/SmartRecruiters" },
        { "url": "https://egym.jobs.personio.de" },
    ],
    "greenhouseBoards": ["airbnb"],
    "leverCompanies": ["spotify"],
    "ashbyBoards": ["openai"],
    "recruiteeCompanies": ["bunq"],
    "smartRecruitersCompanies": ["SmartRecruiters"],
    "personioCompanies": ["egym"],
}

# Run the Actor and wait for it to finish
run = client.actor("fetch_cat/ats-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 '{
  "startUrls": [
    {
      "url": "https://boards.greenhouse.io/airbnb"
    },
    {
      "url": "https://jobs.lever.co/spotify"
    },
    {
      "url": "https://jobs.ashbyhq.com/openai"
    },
    {
      "url": "https://bunq.recruitee.com"
    },
    {
      "url": "https://jobs.smartrecruiters.com/SmartRecruiters"
    },
    {
      "url": "https://egym.jobs.personio.de"
    }
  ],
  "greenhouseBoards": [
    "airbnb"
  ],
  "leverCompanies": [
    "spotify"
  ],
  "ashbyBoards": [
    "openai"
  ],
  "recruiteeCompanies": [
    "bunq"
  ],
  "smartRecruitersCompanies": [
    "SmartRecruiters"
  ],
  "personioCompanies": [
    "egym"
  ]
}' |
apify call fetch_cat/ats-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ATS Jobs Scraper for Greenhouse, Lever, Ashby & More",
        "description": "Scrape public Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio job boards into one normalized dataset with titles, locations, departments, apply URLs, dates, and optional descriptions.",
        "version": "0.1",
        "x-build-id": "x8UUXM08t1s2s1Sus"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/fetch_cat~ats-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-fetch_cat-ats-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/fetch_cat~ats-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-fetch_cat-ats-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/fetch_cat~ats-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-fetch_cat-ats-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": {
                    "startUrls": {
                        "title": "Mixed ATS board URLs",
                        "type": "array",
                        "description": "Public Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, or Personio board URLs. The actor auto-detects the source from each URL.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "greenhouseBoards": {
                        "title": "Greenhouse board tokens or URLs",
                        "type": "array",
                        "description": "Greenhouse board tokens such as airbnb, or public board URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "leverCompanies": {
                        "title": "Lever company slugs or URLs",
                        "type": "array",
                        "description": "Lever company slugs such as spotify, or public Lever job board URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ashbyBoards": {
                        "title": "Ashby board slugs or URLs",
                        "type": "array",
                        "description": "Ashby hosted jobs page slugs such as openai, or public Ashby board URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "recruiteeCompanies": {
                        "title": "Recruitee company subdomains or URLs",
                        "type": "array",
                        "description": "Recruitee company subdomains such as bunq, or public Recruitee careers URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "smartRecruitersCompanies": {
                        "title": "SmartRecruiters company identifiers or URLs",
                        "type": "array",
                        "description": "SmartRecruiters company identifiers such as SmartRecruiters, or public SmartRecruiters board URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "personioCompanies": {
                        "title": "Personio company subdomains or URLs",
                        "type": "array",
                        "description": "Personio company subdomains such as egym, or public Personio job board URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Maximum jobs",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of job postings to save across all sources.",
                        "default": 20
                    },
                    "includeDescriptions": {
                        "title": "Include job descriptions",
                        "type": "boolean",
                        "description": "Fetch and save full job descriptions where the public source exposes them. Turn off for faster listing-only runs.",
                        "default": true
                    },
                    "departmentFilter": {
                        "title": "Department or team filter",
                        "type": "string",
                        "description": "Optional case-insensitive match against department/team fields."
                    },
                    "locationFilter": {
                        "title": "Location filter",
                        "type": "string",
                        "description": "Optional case-insensitive match against location text."
                    },
                    "keywordFilter": {
                        "title": "Title/description keyword filter",
                        "type": "string",
                        "description": "Optional case-insensitive match against job title and description."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
