# ATS Jobs: Workday, Personio, Greenhouse, Lever & more (`jadelike_mustang/ats-jobs`) Actor

Input careers page URLs from Workday, Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Personio, Recruitee or Teamtailor. Output one item per job in one format: title, department, locations, remote, type, date, salary, links, clean description.

- **URL**: https://apify.com/jadelike_mustang/ats-jobs.md
- **Developed by:** [Ernesto Privato](https://apify.com/jadelike_mustang) (community)
- **Categories:** Jobs, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 jobs

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## ATS Jobs: Workday, Greenhouse, Lever, Ashby, Personio, Recruitee, Teamtailor, Workable, SmartRecruiters

Get **all open jobs from any company's careers page** in one clean, consistent format, whatever applicant tracking system (ATS) the company uses. Paste careers page URLs, get jobs with title, department, locations, remote status, employment type, posting date, salary (when published), links and a clean plain-text description.

**9 ATS in one Actor**, including Workday and the ones European companies actually use:

| ATS | Typical users | Example URL |
|---|---|---|
| **Workday** | Large enterprises worldwide | `https://company.wd5.myworkdayjobs.com/Site` |
| **Personio** | DACH SMEs and scale-ups | `https://company.jobs.personio.de` |
| **Recruitee** | Netherlands, Europe | `https://company.recruitee.com` |
| **Teamtailor** | Nordics, Europe | `https://company.teamtailor.com` (or `teamtailor:https://careers.company.com`) |
| **Workable** | Europe, global SMEs | `https://apply.workable.com/company` |
| **SmartRecruiters** | Large enterprises | `https://jobs.smartrecruiters.com/Company` |
| **Greenhouse** | US tech | `https://boards.greenhouse.io/company` |
| **Lever** (US and EU) | US/EU tech | `https://jobs.lever.co/company` |
| **Ashby** | Startups | `https://jobs.ashbyhq.com/company` |

### Use cases

- **Job boards and aggregators**: feed your site with fresh jobs from a list of companies
- **Sales intelligence**: hiring signals (who is hiring data engineers in Berlin this month?)
- **Recruiting and market research**: track roles, locations and salaries across competitors
- **Job seekers**: monitor your dream companies with a daily schedule

### Data source

Jobs are read from the **public job board endpoints each ATS provides for publishing their customers' openings** (Greenhouse Job Board API, Lever Postings API, Ashby Posting API, SmartRecruiters Posting API, Workday careers site endpoints, Workable widget API, Personio XML feed, Recruitee careers API, Teamtailor RSS). No login, no proxies, no browser: fast and reliable. Only job data is returned: no personal data of recruiters or candidates.

### Input example

```json
{
  "companies": [
    "https://1komma5grad.jobs.personio.de",
    "https://bunq.recruitee.com",
    "https://boards.greenhouse.io/stripe"
  ],
  "keywords": "engineer",
  "locations": ["Berlin", "Amsterdam", "remote"],
  "postedWithinDays": 30
}
```

### Output example

```json
{
  "ats": "personio",
  "company": "1KOMMA5° Commercial GmbH",
  "jobId": "2793311",
  "title": "Software Engineer - Edge & Cloud (m/w/d)",
  "department": "Tech",
  "locations": ["Remote", "Hamburg", "Berlin"],
  "country": null,
  "remote": true,
  "workplaceType": null,
  "employmentType": "permanent full-time",
  "postedAt": "2026-10-30T09:12:44+00:00",
  "url": "https://1komma5grad.jobs.personio.de/job/2793311",
  "applyUrl": "https://1komma5grad.jobs.personio.de/job/2793311#apply",
  "salary": null,
  "descriptionText": "…",
  "source": "https://1komma5grad.jobs.personio.de"
}
```

Fields are the same for every ATS; when an ATS does not publish a field (e.g. salary) it is `null`.

### Filters

- **Title keywords** (all must match) and **exclude keywords**
- **Locations**: city or country as text; add `remote` to also keep remote jobs
- **Remote only**, **posted within N days**
- **Max jobs per company** (most recent first) and **max jobs in total**

### Input reference

| Field | Type | Default | Description |
|---|---|---|---|
| `companies` *(required)* | array |  | **Company careers pages**. Careers page URLs, one per company. The job board is detected automatically: boards.greenhouse.io/…, jobs.lever.co/…, jobs.eu.lever.co/…, jobs.ashbyhq.com/…, jobs.smartrecruiters.com/…, apply.workable.com/…, …myworkdayjobs.com/…, …jobs.personio.de, …recruitee.com, …teamtailor.com. You can also write 'ats:slug' (e.g. 'greenhouse:stripe', 'personio:1komma5grad') or, for Teamtailor careers sites on a custom domain, 'teamtailor:https://careers.example.com'. |
| `keywords` | string |  | **Title keywords**. Keep only jobs whose title contains all these words (e.g. 'data engineer'). |
| `excludeKeywords` | string |  | **Exclude title keywords**. Drop jobs whose title contains any of these words (e.g. 'intern senior'). |
| `locations` | array |  | **Locations**. Keep only jobs in any of these places (city or country, matched as text). Add 'remote' to also keep remote jobs. |
| `remoteOnly` | boolean | `false` | **Remote only**. Keep only jobs marked as remote by the company. |
| `postedWithinDays` | integer |  | **Posted within (days)**. Keep only jobs published in the last N days. Leave empty for all. |
| `includeDescription` | boolean | `true` | **Include description**. Add the job description as clean plain text. |
| `includeHtml` | boolean | `false` | **Include description HTML**. Also add the original description HTML. |
| `maxJobsPerCompany` | integer |  | **Max jobs per company**. Most recent jobs kept per company. 0 or empty = all. |
| `maxJobs` | integer |  | **Max jobs in total**. Stop after this many jobs. 0 or empty = no limit. |

### Tips

- A company that is not found (wrong URL or slug) does not stop the run: check the **Per-company report** in the Output tab.
- Schedule the Actor daily with *Posted within 1 day* to get only new jobs.
- Teamtailor careers sites often use the company's own domain: write `teamtailor:https://careers.company.com`.

### Pricing

Pay per event, only for results you get:

- **$0.002** per job returned.
- Apify subscribers pay less: **10% off on Bronze, 20% on Silver, 30% on Gold** and higher plans.
- Set a maximum charge per run in the run options: the Actor stops cleanly when it is reached.

### Privacy

The Actor sends the developer an anonymous end-of-run notice (number of results, amount charged, duration, success or error) to monitor reliability. Your input, your results and your identity are never sent.

### Feedback

Missing an ATS your target companies use, or a field you need? Open an issue on the Actor page.

# Actor input Schema

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

Careers page URLs, one per company. The job board is detected automatically: boards.greenhouse.io/…, jobs.lever.co/…, jobs.eu.lever.co/…, jobs.ashbyhq.com/…, jobs.smartrecruiters.com/…, apply.workable.com/…, …myworkdayjobs.com/…, …jobs.personio.de, …recruitee.com, …teamtailor.com. You can also write 'ats:slug' (e.g. 'greenhouse:stripe', 'personio:1komma5grad') or, for Teamtailor careers sites on a custom domain, 'teamtailor:https://careers.example.com'.

## `keywords` (type: `string`):

Keep only jobs whose title contains all these words (e.g. 'data engineer').

## `excludeKeywords` (type: `string`):

Drop jobs whose title contains any of these words (e.g. 'intern senior').

## `locations` (type: `array`):

Keep only jobs in any of these places (city or country, matched as text). Add 'remote' to also keep remote jobs.

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

Keep only jobs marked as remote by the company.

## `postedWithinDays` (type: `integer`):

Keep only jobs published in the last N days. Leave empty for all.

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

Add the job description as clean plain text.

## `includeHtml` (type: `boolean`):

Also add the original description HTML.

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

Most recent jobs kept per company. 0 or empty = all.

## `maxJobs` (type: `integer`):

Stop after this many jobs. 0 or empty = no limit.

## Actor input object example

```json
{
  "companies": [
    "https://boards.greenhouse.io/stripe",
    "https://1komma5grad.jobs.personio.de",
    "https://bunq.recruitee.com"
  ],
  "remoteOnly": false,
  "includeDescription": true,
  "includeHtml": false,
  "maxJobsPerCompany": 10
}
```

# Actor output Schema

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

Overview table of the jobs found.

## `fullData` (type: `string`):

All fields, including descriptions.

## `report` (type: `string`):

Status of each company: ok with number of jobs, not found, or error.

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "companies": [
        "https://boards.greenhouse.io/stripe",
        "https://1komma5grad.jobs.personio.de",
        "https://bunq.recruitee.com"
    ],
    "maxJobsPerCompany": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("jadelike_mustang/ats-jobs").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "companies": [
        "https://boards.greenhouse.io/stripe",
        "https://1komma5grad.jobs.personio.de",
        "https://bunq.recruitee.com",
    ],
    "maxJobsPerCompany": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("jadelike_mustang/ats-jobs").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companies": [
    "https://boards.greenhouse.io/stripe",
    "https://1komma5grad.jobs.personio.de",
    "https://bunq.recruitee.com"
  ],
  "maxJobsPerCompany": 10
}' |
apify call jadelike_mustang/ats-jobs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jadelike_mustang/ats-jobs"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/oAHBOGESQ2dbT7ZUz/builds/4WuqYuxdxwAeZnY0j/openapi.json
