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

Export live public jobs from six ATS platforms with descriptions, remote signals, salary fields, locations, filters, and normalized data for AI and hiring intelligence.

- **URL**: https://apify.com/fetch\_cat/ats-jobs-scraper.md
- **Developed by:** [Hanna Nosova](https://apify.com/fetch_cat) (community)
- **Categories:** Jobs, Lead generation, Developer tools
- **Stats:** 3 total users, 0 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 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 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.

### At a glance

- **Input:** Public Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, or Personio board URLs or source-specific slugs.
- **Output:** One normalized dataset row per public job posting, including descriptions, remote/workplace signals, locations, salary fields, apply links, dates, and source metadata where published.
- **Best for:** Recruiting market maps, hiring-signal lead generation, job-board refreshes, and warehouse-ready job data.
- **Pricing unit:** A start event per run plus one `item` event for each saved job posting.
- **Login required:** No. The Actor supports public ATS job boards only.

### Ready-to-run examples

Use these saved Store examples as starting points. Open any example to prefill the Actor input, then adjust URLs, keywords, limits, or filters for your own run.

- **[ATS Jobs Quick Smoke Test](https://apify.com/fetch_cat/ats-jobs-scraper/examples/ats-quick-smoke-test)**
- **[Europe Jobs Across ATS Boards](https://apify.com/fetch_cat/ats-jobs-scraper/examples/ats-europe-jobs-monitor)**
- **[Marketing Roles Across ATS Boards](https://apify.com/fetch_cat/ats-jobs-scraper/examples/ats-marketing-roles-search)**
- **[Sales Roles Across ATS Boards](https://apify.com/fetch_cat/ats-jobs-scraper/examples/ats-sales-roles-search)**
- **[Data Roles Across ATS Boards](https://apify.com/fetch_cat/ats-jobs-scraper/examples/ats-data-roles-search)**
- **[Remote Engineering Jobs Across ATS Boards](https://apify.com/fetch_cat/ats-jobs-scraper/examples/ats-remote-engineering-monitor)**
- **[View all ready-to-run examples](https://apify.com/fetch_cat/ats-jobs-scraper/examples)** (24 examples)

### What can it 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:** Official public bulk Job Postings API, including descriptions and disclosed compensation.
- **Recruitee:** Public careers pages.
- **SmartRecruiters:** Public company pages.
- **Personio:** Public job boards.

It saves one normalized dataset so every row has the same job fields regardless of source.

### Weekly competitor hiring intelligence with AI

Use this Actor when your target-company list spans Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio:

1. Add the public career-board URLs for the companies you track and run the same input weekly with an Apify schedule.
2. Enable `includeDescriptions` when your AI analysis needs skills, responsibilities, seniority, or product signals; leave it off for a faster posting-count monitor.
3. Deliver the dataset through the Apify API or a run-finished webhook to n8n, your warehouse, or an AI workflow.
4. Compare snapshots by `source`, `companyName`, `jobId`, `title`, and `location`; summarize newly opened and removed roles, hiring themes, and geographic expansion.
5. Require the brief to retain `jobUrl` or `applyUrl` citations so analysts can verify each signal against the public posting.

**Portfolio routing:** This is the best starting point for a mixed list of employer-hosted ATS boards because it normalizes six sources into one schema. Use [LinkedIn Jobs Scraper](https://apify.com/fetch_cat/linkedin-jobs-scraper) for broad keyword/location discovery, and [Workday Jobs Scraper](https://apify.com/fetch_cat/workday-jobs-scraper) for companies hosted on Workday, which is not one of this Actor's six supported ATS sources. Combine those separate datasets downstream; field names are not identical.

### Who is it for?

- **Recruiting teams:** Monitor hiring activity across target companies.
- **Sales teams:** Find companies hiring for roles related to their product.
- **Market researchers:** Track demand for skills, locations, departments, or seniority levels.
- **Job aggregators:** Collect public postings from many employer-hosted boards.
- **Data teams:** 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.

### ATS platforms

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

Recruitee boards include URLs such as `https://jobs.recruitee.com/example-company`.

SmartRecruiters boards include URLs such as `https://jobs.smartrecruiters.com/SmartRecruiters`.

Personio boards include URLs such as `https://egym.jobs.personio.de`.

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 |
| `compensationMin` / `compensationMax` | Numeric disclosed salary range where the ATS provides it |
| `compensationCurrency` / `compensationInterval` | Currency and pay interval for normalized compensation |
| `remote` | Explicit or inferred remote-work boolean when the public posting supports it |
| `secondaryLocations` | Additional published locations |
| `experienceLevel` | Published seniority or experience level 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 |

### Pricing

This Actor uses Apify pay-per-event pricing. The prices below come from the current Actor pricing configuration. Apify public plans map to Store discount tiers, so the table shows both the user-facing plan context and the pricing tier name. The final price shown in Apify depends on the user account plan and any custom agreement.

| Event | What is charged | Free / no discount | Starter / Bronze | Scale / Silver | Business / Gold | Custom / Platinum | Custom / Diamond |
| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: |
| `start` | Once, after valid board input is confirmed | $0.005 | $0.005 | $0.005 | $0.005 | $0.005 | $0.005 |
| `item` | Per job posting successfully saved | $0.115 / 1,000 | $0.100 / 1,000 | $0.078 / 1,000 | $0.060 / 1,000 | $0.040 / 1,000 | $0.028 / 1,000 |

Invalid input fails before the `start` event. Failed requests and filtered-out jobs do not create `item` charges.

Apify may also charge platform usage for compute, storage, proxies, or data transfer outside this Actor pricing. Check the Actor run and the Apify Pricing tab for the exact cost shown to your account.

### 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 configuration

| Setting | JSON key | Type | Description |
| --- | --- | --- | --- |
| Mixed ATS board URLs | `startUrls` | array | Public board URLs for any supported source; the Actor auto-detects the ATS. |
| Greenhouse board tokens or URLs | `greenhouseBoards` | array | Greenhouse board tokens such as `airbnb`, or full public board URLs. |
| Lever company slugs or URLs | `leverCompanies` | array | Lever company slugs such as `spotify`, or full public Lever URLs. |
| Ashby board slugs or URLs | `ashbyBoards` | array | Ashby hosted jobs page slugs such as `openai`, or public Ashby URLs. |
| Recruitee company slugs or URLs | `recruiteeCompanies` | array | Recruitee company subdomains or public careers URLs. |
| SmartRecruiters identifiers or URLs | `smartRecruitersCompanies` | array | SmartRecruiters company identifiers or public company job URLs. |
| Personio company subdomains or URLs | `personioCompanies` | array | Personio company subdomains or public Personio job board URLs. |
| Maximum jobs | `maxItems` | integer | Maximum saved job postings across all sources. |
| Include descriptions | `includeDescriptions` | boolean | Fetch full descriptions where public sources expose them. |
| Department or team filter | `departmentFilter` | string | Case-insensitive match against department or team text. |
| Location filter | `locationFilter` | string | Case-insensitive match against location text. |
| Title/description keyword filter | `keywordFilter` | string | Case-insensitive match against title and description text. |
| Safe run-time limit | `runTimeSecs` | integer | Stop before the platform timeout, preserve saved jobs, and write `RUN_SUMMARY`; default 270 seconds. |

### Input notes

#### 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`

#### Recruitee company slugs or URLs

Use `recruiteeCompanies` for Recruitee-only inputs.

Examples:

- `example-company`
- `https://jobs.recruitee.com/example-company`

#### SmartRecruiters company slugs or URLs

Use `smartRecruitersCompanies` for SmartRecruiters-only inputs.

Examples:

- `SmartRecruiters`
- `https://jobs.smartrecruiters.com/SmartRecruiters`

#### Personio company slugs or URLs

Use `personioCompanies` for Personio-only inputs.

Examples:

- `egym`
- `https://egym.jobs.personio.de`

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

When `includeDescriptions` is `false`, `keywordFilter` checks the title because description text was intentionally not requested.

### Example input

```json
{
  "startUrls": [
    { "url": "https://boards.greenhouse.io/airbnb" },
    { "url": "https://jobs.lever.co/spotify" },
    { "url": "https://jobs.ashbyhq.com/openai" },
    { "url": "https://jobs.recruitee.com/example-company" },
    { "url": "https://jobs.smartrecruiters.com/SmartRecruiters" },
    { "url": "https://egym.jobs.personio.de" }
  ],
  "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 source URLs:** Use public company career board URLs, not search engine result URLs.
- **Confirm empty boards:** If one board returns no jobs, confirm the company still uses that ATS.
- **Choose specific inputs when known:** Use source-specific fields when you already know the ATS type.
- **Speed up count checks:** Set `includeDescriptions` to `false` for fast job-count monitoring.
- **Enrich text workflows:** 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);
```

#### 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'])
```

#### 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 and AI agents

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

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

- **Public boards only:** v1 covers Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio where the tenant exposes public listings without login or private data.
- **Career pages can move:** Some companies customize or migrate career pages, which can cause empty results.
- **Fields vary by ATS:** Descriptions and metadata depend on the source system and 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 increase response size and SmartRecruiters may require bounded detail requests. Ashby descriptions now come from its official bulk API in the same request as the board, avoiding the former one-page-per-job slowdown. Disable descriptions for the fastest listing-only checks.

#### How do I diagnose a partial or empty run?

Open the run's key-value store and inspect `RUN_SUMMARY`. It records invalid inputs, each attempted source, saved counts, upstream errors, and whether the safe deadline was reached. The legacy `RUN-SUMMARY` key remains available for existing integrations.

### Automation and data handling

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

### 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)
- [SmartRecruiters Jobs Scraper](https://apify.com/fetch_cat/smartrecruiters-jobs-scraper)
- [Workday Jobs Scraper](https://apify.com/fetch_cat/workday-jobs-scraper)

### Support

If a run fails, returns no data, or a field looks wrong, open an issue from the Actor page.

Please include the Apify run ID or run URL, input JSON, one reproducible public URL, the expected output, and the actual output returned in the dataset or `RUN_SUMMARY`. Small reproducible inputs make source issues much faster to fix.

### Privacy and data handling

This Actor only requests the permissions needed to run the input you provide. It uses your input (such as URLs, search terms, identifiers, filters, and limits) only to fetch the requested public data from the relevant source site or API for this Actor, then writes results to your Apify dataset/key-value store.

Data may pass through Apify platform services and Apify Proxy during the run, and requests are sent only to the target site or public data provider required for this Actor's results. FetchCat does not send your inputs or outputs to advertising networks, data brokers, or model-training services, and does not retain run data outside Apify storage after the run except when you explicitly share run details for transient support debugging.

You are responsible for using this Actor lawfully, respecting the target site's terms, and avoiding unnecessary personal or sensitive data in inputs. Review the output before storing, sharing, or combining it with other data.

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

## `runTimeSecs` (type: `integer`):

Stop starting new ATS requests after this many seconds, preserve already saved jobs, and write diagnostic run summaries before the platform timeout.

## 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,
  "runTimeSecs": 270
}
```

# Actor output Schema

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

No description

## `runSummary` (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

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