# Personio Jobs Feed | Public Career Pages (`zinin/personio-jobs-feed`) Actor

Collect public Personio career feeds from supplied company tenants and return structured vacancies with titles, locations, dates and source URLs.

- **URL**: https://apify.com/zinin/personio-jobs-feed.md
- **Developed by:** [Tim Zinin](https://apify.com/zinin) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 result founds

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

## Personio Jobs Feed

Collect public vacancies from company career sites powered by Personio. Supply exact Personio tenants and receive one structured row per valid job, including title, department, office, employment type, date, and source URL. It is for recruiters, job aggregators, and hiring analysts who already know which employers they want to track.

### What you get

- One row per vacancy with a nonempty ID, title, and public job URL.
- XML feed first, with public JSON or HTML JobPosting fallback if the feed is unavailable.
- Department, office, employment type, schedule, seniority, keywords, and date when published.
- Descriptions off by default; the opt-in text is capped and contact-redacted.
- Free diagnostic rows for unsupported tenants, blocked sources, or unavailable feeds.
- On Apify, schedule runs, monitor them, call the API, and export datasets to JSON, CSV, or Excel.

### How to run it

1. Paste exact `*.jobs.personio.de` or `*.jobs.personio.com` tenant URLs into **Companies**.
2. Set **Maximum jobs per company** (default 50). Leave **Include description** off unless you have checked the employer's terms and need the text.
3. Start the Actor and read the default dataset through the UI or its `/items` API URL.

### Pricing

The Actor's PPE price was confirmed by API GET on 2026-11-01: **$0.001 per valid vacancy** (`result-found`), **$0 per start** and **$0 per diagnostic**. One delivered row and its charge are linked in a single dataset write. At that price, 100 vacancies cost **$0.10**. There is **no actor-specific free quota**. Apify's [Free plan](https://apify.com/pricing) lists $5 monthly usage credit (checked 2026-11-01), which may cover eligible runs subject to the user's other usage; Free-plan buyer behavior has not been measured for this Actor. See [ECONOMICS.md](ECONOMICS.md) for the usage-cost estimate.

The current `result-found` event price is $0.001 per useful row. The following are Actor event charges:

| Useful rows | Actor event charges |
|---:|---:|
| 10 | $0.010 |
| 100 | $0.100 |
| 1,000 | $1.000 |

These examples assume that many valid, billed rows across one or more runs. Input limits and source availability may require several runs. Apify platform compute usage is separate.

### Input

| Field | Required | Purpose |
|---|---|---|
| `companies` | Yes | Personio subdomains or full Personio career page URLs. |
| `maxItemsPerCompany` | No | Maximum number of jobs returned for each company. |
| `includeDescription` | No | Opt in to up to 2000 characters of plain-text job description after contact redaction. Off by default to avoid personal data. |
| `language` | No | Optional language code requested from the career page. |

```json
{
  "companies": [
    "open.jobs.personio.de",
    "cptx.jobs.personio.de"
  ]
}
```

### Output

This row comes from a successful Actor run completed 2026-11-01T15:20:47.489Z. Values are copied from its dataset.

```json
{
  "id": "2827772",
  "company": "open",
  "title": "Chief Product Officer",
  "department": "Product",
  "office": "Head Office - Dublin, Hybrid",
  "employmentType": "permanent",
  "url": "https://open.jobs.personio.de/job/2827772",
  "source": "xml"
}
```

| Field | Meaning |
|---|---|
| `id` | Public source identifier for this result. |
| `company` | Employer or board identifier. |
| `title` | Published job title. |
| `department` | Public hiring department. |
| `office` | Public office or workplace label. |
| `employmentType` | Employment type supplied by the source. |
| `url` | Direct source page for this result. |
| `source` | Source format or provider. |

### Other tools we built

#### Related tools

Related tools for adjacent workflows in jobs and hiring.

| Actor | What it does |
|---|---|
| [Teamtailor Jobs Feed | Public Career Sites](https://apify.com/zinin/teamtailor-jobs-feed) | Pair it in the jobs and hiring workflow: Extract job titles, locations, dates and URLs from supplied public Teamtailor career sites |
| [Greenhouse Jobs Feed | Public Job Board API](https://apify.com/zinin/greenhouse-jobs-feed) | Pair it in the jobs and hiring workflow: Collect published Greenhouse Job Board vacancies from supplied board tokens |
| [Recruitee Jobs Feed | Public Career Offers](https://apify.com/zinin/recruitee-jobs-feed) | Pair it in the jobs and hiring workflow: Collect public Recruitee career offers from company subdomains |
| [Ashby Jobs Feed | Public Posting API](https://apify.com/zinin/ashby-jobs-feed) | Pair it in the jobs and hiring workflow: Collect published Ashby jobs from supplied board names |
| [Lever Jobs Feed | Public Postings API](https://apify.com/zinin/lever-jobs-feed) | Pair it in the jobs and hiring workflow: Collect published Lever jobs from company boards |

### FAQ / Limitations

**Which sites work?** Only exact public `*.jobs.personio.de` and `*.jobs.personio.com` tenants. The Actor does not discover employers, log in, read candidate forms, or fetch individual job pages when the feed works. XML can be disabled by the employer. It checks each tenant's robots rules, skips disallowed paths, and stops a tenant on 401, 403, or 429.

**What this is not.** It is not an employer-discovery service, candidate database, or blanket redistribution license.

**Source terms and access.** Personio's [XML integration guide](https://support.personio.de/hc/en-us/articles/207576365-Integrate-jobs-from-Personio-into-your-website-via-XML) says: “When you publish a job, you can find it in XML format at youraccount.jobs.personio.com/xml.” Its [XML FAQ](https://support.personio.de/hc/en-us/articles/29375445597725-Frequently-asked-questions-on-XML-job-integration) says: “No, you don't need credentials.” Both checked 2026-11-01. These pages document a public company-website integration, not blanket commercial redistribution rights for every employer's listings.

Personio's [General Terms & Conditions, UK\&I §6.4.3](https://www.personio.com/terms/) say customers must not “Access all or part of the Software in order to build a product or service which competes with Personio”. Checked 2026-11-01. This is a customer restriction, not a direct statement about unauthenticated public feeds. Users must respect each employer's rights and applicable law. The Actor is not affiliated with Personio.

**What if a feed is blocked?** It returns a free diagnostic, never a fabricated vacancy. Descriptions are off by default because employer text can contain personal contact details; when enabled, the parser redacts common contact patterns, but users should review their own outputs.

Report source changes or bugs through the Actor's issue page when available.

# Changelog

This Actor's version history is a separate document: https://apify.com/zinin/personio-jobs-feed/changelog.md

# Actor input Schema

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

Personio subdomains or full Personio career page URLs.

## `maxItemsPerCompany` (type: `integer`):

Maximum number of jobs returned for each company.

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

Opt in to up to 2000 characters of plain-text job description after contact redaction. Off by default to avoid personal data.

## `language` (type: `string`):

Optional language code requested from the career page.

## Actor input object example

```json
{
  "companies": [
    "open.jobs.personio.de",
    "cptx.jobs.personio.de"
  ],
  "maxItemsPerCompany": 50,
  "includeDescription": false
}
```

# Actor output Schema

## `results` (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 = {
    "companies": [
        "open.jobs.personio.de",
        "cptx.jobs.personio.de"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zinin/personio-jobs-feed").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": [
        "open.jobs.personio.de",
        "cptx.jobs.personio.de",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("zinin/personio-jobs-feed").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": [
    "open.jobs.personio.de",
    "cptx.jobs.personio.de"
  ]
}' |
apify call zinin/personio-jobs-feed --silent --output-dataset

```

## MCP server setup

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

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/51fOTbFD1ALfKK4Rd/builds/UfNYGBhBYC7KHfsMC/openapi.json
