# Personio Jobs Scraper & API: Any Company's Board, 30 Fields (`dododata/personio-jobs-scraper`) Actor

Any company's public Personio career site as JSON. 30 fields, salary as numbers, no key, no browser. Monitor mode returns only what changed. $1 per 1,000.

- **URL**: https://apify.com/dododata/personio-jobs-scraper.md
- **Developed by:** [Dodo Data](https://apify.com/dododata) (community)
- **Categories:** Jobs, Automation, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 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

## Personio Jobs Scraper & API: Any Company's Board, 30 Fields

Get every open job from any company's **Personio** career page as clean JSON. **30 fields per job, 310 jobs from 2 companies in 3 seconds**: title, department, locations, remote / hybrid flag, pay range as numbers, dates, apply URL and the full description as plain text.

Paste career-page URLs or company names. Jobs come straight from the employer's own Personio board: no aggregator, no duplicates, no expired listings. Every Personio career site publishes its open positions as one public XML feed, documented by Personio and readable without credentials, so that employers can show their jobs on their own websites. This Actor reads that feed: one request per company, full descriptions included, no key and no login; both .jobs.personio.de and .jobs.personio.com answer. Pay comes from Personio's own salary field when the employer fills it, and from the job text when it is only written there; `salary_source` tells you which.

### In one minute

- **What you get:** every open job on the career pages you give it, one JSON row per job: title, company, locations, remote flag, pay range as numbers when published, dates, the employer's apply link and the full text.
- **What it costs:** $1.00 per 1,000 jobs, plus a $0.00005 start fee per run. The measured sample run (310 jobs) cost about $0.31. Apify's free plan includes $5 of usage every month.
- **Try it:** click **Start**. The prefilled input reads 2 sample companies in about 3 seconds; then paste your own career-page URLs or company names.
- **No URLs?** Turn on **Search every Personio company** and search 14,997 open jobs from 1,513 companies at once, by title, place and date (index of 4 November 2026, refreshed daily).

One real row from that run (description shortened):

```json
{
  "title": "Assistenz der Geschäftsführung / Chief of Staff (m/w/d) - Fokus Recht, Fuhrpark & Finanzen",
  "company": "1komma5grad",
  "company_name": "1KOMMA5° Münster GmbH",
  "department": "Management",
  "location": "Münster",
  "employment_type": "permanent, full-time",
  "salary_min": 36000,
  "salary_max": 50000,
  "salary_currency": "EUR",
  "salary_period": "year",
  "posted_at": "2026-07-14T17:08:03.000Z",
  "apply_url": "https://1komma5grad.jobs.personio.de/job/2712319",
  "description": "1KOMMA5°\nBei 1KOMMA5° bauen wir Europas führende Energie-Software-Plattform “Heartbeat” und schaffen so ein virtuelle…"
}
```

### Search every Personio company, no URLs

Turn on **Search every Personio company (no URLs)** and the Actor searches Dodo Data's index of every Personio career site we know, 14,997 open jobs from 1,513 companies, instead of reading the career sites you list. Title keywords, Locations, Companies, Posted within and Max jobs work as usual, the newest jobs come first, no company takes more than a tenth of the run while others match, and the full text and pay of each job you get is read live from the employer's Personio feed. Same 30 fields, same price per job.

Measured on 27 October 2026: jobs posted in the last 7 days matched 543; the 100 newest came from 64 companies in 26 seconds, 72 with full text and 11 with a pay range. The other 28 come from employers whose Personio feed publishes no job text; their title, offices, department, contract type and link are there as usual.

```json
{ "searchAllCompanies": true, "postedWithinDays": 7, "maxItems": 100 }
```

Monitor mode does not apply in this mode: for a daily feed, schedule it with Posted within 3 days and keep the `id`s you have not seen. The index lists the career sites found in public web data, so a company missing from it can still be read by its career-site URL.

### What people use it for

- **Track who is hiring, and for what**. For example, "every new engineering role at my target accounts since yesterday" as a sales or recruiting signal. Set **Posted within (days)** to 1 and schedule it daily.
- **Feed a job board, a newsletter or an AI agent with first-party jobs**. For example, "remote data roles from these 300 companies", without scraping aggregators.
- **Benchmark pay and hiring plans**. For example, "published pay ranges and open headcount by department across my competitors".

### Why not build it yourself

Building this yourself: the Personio source, its pagination and quirks, HTML descriptions, pay formats, de-duplication between runs: about a day of work, then upkeep each time a field changes. This Actor: **$1.00 per 1,000 jobs**, and when something changes we fix it within 48 hours. Every Apify account includes $5 of free usage a month, so your first 4,900 jobs cost nothing.

**Price:** $1.00 per 1,000 jobs. Any change is announced 14 days ahead through Apify, as its rules require, and applies to every user alike.

### Proof

| | |
|---|---|
| Success rate (staging runs on Apify) | 100%, 0 failures |
| Last verified against live boards | 2026-10-21 |
| Typical run | 310 jobs from 2 companies in 3 seconds |
| Issues answered within | 6 hours |
| Changes fixed within | 48 hours |

Changelog at the bottom of this page, and every fix is dated.

### Pay ranges

Personio has its own salary field, and employers fill it only sometimes. Measured on 21 October 2026 over six Personio companies (thermondo, 1KOMMA5°, ottonova, everphone, CLARK, tado; 513 open jobs): **44 carried pay**, 40 from Personio's salary field (35 monthly, 3 yearly, 2 hourly, all in euros) and 4 read from the job text, written the German way ("zwischen 55.000 € und 75.000 €", "von 67.300,00 € bis 74.400,00 €"). `salary_source` says which: `structured` or `description`. A single figure ("ab 70.000 €") is left out rather than turned into a range, and so are bonuses and commission. Most German job ads say "attraktive Vergütung" with no figure; those rows carry no pay rather than a guess.

### Monitor Personio career pages: only new, changed and closed jobs

Most people do not want the whole board every day. They want to know what changed. Give the run a **Monitor name** and put it on a schedule:

- every job comes back with `change_status` (`new`, `updated`, `unchanged`) and `first_seen_at`, the date the monitor first saw it, which survives later edits and tells you how long a role has been open. Without a monitor name these three fields are empty, as in the rows above
- with **Only changes** on, unchanged jobs are left out and **not billed**. Measured on 1KOMMA5°'s board: the first run returned 300 jobs, the next run 0 rows and nothing billed, in 3 seconds
- **closed jobs are reported too**. A job that was listed last time and is gone now comes back once with `change_status: "removed"`, its title, URL and `last_seen_at`

### What we deliberately do not collect

- No personal data. Recruiter and creator fields are never read. E-mail addresses, phone numbers and the names of contact people that an employer prints in its job text are replaced with `[email removed]`, `[phone removed]` and `[name removed]`.
- Public sources only: what the career page itself shows to any visitor. No logins, no candidate data, nothing behind authentication.
- Rate-limited: at most 5 requests a second.
- This Actor declares **limited permissions**: it can only write to its own storages on your account.

### How to run it

1. Click **Run**. The defaults read two sample boards.
2. Replace them with your own **Personio career page URLs**, for example `https://1komma5grad.jobs.personio.de`, or list **Companies** by name (`1komma5grad`). Hundreds of companies per run are fine.
3. Narrow with **Title keywords**, **Locations** (`remote`, `berlin`, `united kingdom`) and **Posted within (days)**. Jobs that do not match are never saved and never charged.
4. Set **Max rows** to cap the run. That is also your spend cap.
5. Download as JSON, CSV or Excel, or call it from the API or from an AI agent through the Apify MCP server. The `id` field is stable, so de-duplicating between runs is one line.

A company name that does not exist is reported in the log and skipped; it does not fail the run. Need several systems in one run (Greenhouse, Lever, Ashby, Workday, SmartRecruiters and five more)? Use the Career Page Jobs Scraper below: same rows, same price.

### Ten real rows

Ten real rows from the run of 2026-10-21 (descriptions shortened here to 160 characters; the dataset carries them in full):

```json
[
  {
    "id": "personio:1komma5grad.de:2712319",
    "ats": "personio",
    "company": "1komma5grad",
    "company_name": "1KOMMA5° Münster GmbH",
    "title": "Assistenz der Geschäftsführung / Chief of Staff (m/w/d) - Fokus Recht, Fuhrpark & Finanzen",
    "department": "Management",
    "team": "1K5° Münster (Voltark)",
    "location": "Münster",
    "locations": [
      "Münster"
    ],
    "country": null,
    "workplace_type": null,
    "remote": null,
    "employment_type": "permanent, full-time",
    "experience_level": "entry-level",
    "salary_min": 36000,
    "salary_max": 50000,
    "salary_currency": "EUR",
    "salary_period": "year",
    "salary_text": null,
    "salary_source": "structured",
    "posted_at": "2026-07-14T17:08:03.000Z",
    "updated_at": null,
    "requisition_id": null,
    "description": "1KOMMA5°\nBei 1KOMMA5° bauen wir Europas führende Energie-Software-Plattform “Heartbeat” und schaffen so ein virtuelles Kraftwerk, das Photovoltaik, Stromspei…",
    "apply_url": "https://1komma5grad.jobs.personio.de/job/2712319",
    "url": "https://1komma5grad.jobs.personio.de/job/2712319",
    "change_status": null,
    "first_seen_at": null,
    "last_seen_at": null,
    "scraped_at": "2026-10-21T09:59:23.540Z"
  },
  {
    "id": "personio:1komma5grad.de:2800938",
    "ats": "personio",
    "company": "1komma5grad",
    "company_name": "1KOMMA5° GmbH",
    "title": "(Junior) SEO & AI Marketing Manager (m/w/d)",
    "department": "Marketing",
    "team": "1K5° Holding Marketing",
    "location": "Berlin",
    "locations": [
      "Berlin",
      "Berlin (Remote)"
    ],
    "country": null,
    "workplace_type": "remote",
    "remote": true,
    "employment_type": "permanent, full-time",
    "experience_level": "entry-level",
    "salary_min": null,
    "salary_max": null,
    "salary_currency": null,
    "salary_period": null,
    "salary_text": null,
    "salary_source": null,
    "posted_at": "2026-09-17T07:57:12.000Z",
    "updated_at": null,
    "requisition_id": null,
    "description": "1KOMMA5°\nBei 1KOMMA5° verfolgen wir eine Vision: Living on wind and sunlight forever for free. Dafür bauen wir mit Heartbeat AI das Energiesystem der Zukunft…",
    "apply_url": "https://1komma5grad.jobs.personio.de/job/2800938",
    "url": "https://1komma5grad.jobs.personio.de/job/2800938",
    "change_status": null,
    "first_seen_at": null,
    "last_seen_at": null,
    "scraped_at": "2026-10-21T09:59:23.465Z"
  },
  {
    "id": "personio:1komma5grad.de:2762189",
    "ats": "personio",
    "company": "1komma5grad",
    "company_name": "1KOMMA5° Technology GmbH",
    "title": "(Senior) Category Manager IT & Software",
    "department": "Purchasing & Logistics",
    "team": "1K5° Holding Technology",
    "location": "Remote",
    "locations": [
      "Remote"
    ],
    "country": null,
    "workplace_type": "remote",
    "remote": true,
    "employment_type": "permanent, full-time",
    "experience_level": "experienced",
    "salary_min": null,
    "salary_max": null,
    "salary_currency": null,
    "salary_period": null,
    "salary_text": null,
    "salary_source": null,
    "posted_at": "2026-08-20T15:58:01.000Z",
    "updated_at": null,
    "requisition_id": null,
    "description": "",
    "apply_url": "https://1komma5grad.jobs.personio.de/job/2762189",
    "url": "https://1komma5grad.jobs.personio.de/job/2762189",
    "change_status": null,
    "first_seen_at": null,
    "last_seen_at": null,
    "scraped_at": "2026-10-21T09:59:23.467Z"
  },
  {
    "id": "personio:1komma5grad.de:2625533",
    "ats": "personio",
    "company": "1komma5grad",
    "company_name": "1KOMMA5° Riederich GmbH",
    "title": "(Junior) Technisches Auftragsmanagement / Projektkoordination / Disposition (m/w/d) - Photovoltaik, Wärmepumpen & Energiesysteme - 1KOMMA5° Riederich",
    "department": "Projektkoordination",
    "team": "1K5° Riederich",
    "location": "Riederich",
    "locations": [
      "Riederich"
    ],
    "country": null,
    "workplace_type": null,
    "remote": null,
    "employment_type": "permanent, full-time",
    "experience_level": "entry-level",
    "salary_min": null,
    "salary_max": null,
    "salary_currency": null,
    "salary_period": null,
    "salary_text": null,
    "salary_source": null,
    "posted_at": "2026-05-06T09:48:17.000Z",
    "updated_at": null,
    "requisition_id": null,
    "description": "1KOMMA5°\nBei 1KOMMA5° verfolgen wir eine Vision: Living on wind and sunlight forever for free. Dafür bauen wir mit Heartbeat AI das Energiesystem der Zukunft…",
    "apply_url": "https://1komma5grad.jobs.personio.de/job/2625533",
    "url": "https://1komma5grad.jobs.personio.de/job/2625533",
    "change_status": null,
    "first_seen_at": null,
    "last_seen_at": null,
    "scraped_at": "2026-10-21T09:59:23.467Z"
  },
  {
    "id": "personio:1komma5grad.de:2816818",
    "ats": "personio",
    "company": "1komma5grad",
    "company_name": "1KOMMA5° GmbH",
    "title": "(Senior) Content Manager (m/w/d)",
    "department": "Marketing",
    "team": "1K5° Holding Marketing",
    "location": "Remote",
    "locations": [
      "Remote",
      "Hamburg",
      "Berlin",
      "München"
    ],
    "country": null,
    "workplace_type": "remote",
    "remote": true,
    "employment_type": "permanent, full-time",
    "experience_level": "experienced",
    "salary_min": null,
    "salary_max": null,
    "salary_currency": null,
    "salary_period": null,
    "salary_text": null,
    "salary_source": null,
    "posted_at": "2026-09-28T10:32:23.000Z",
    "updated_at": null,
    "requisition_id": null,
    "description": "1KOMMA5°\nBei 1KOMMA5° verfolgen wir eine Vision: Living on wind and sunlight forever for free. Dafür bauen wir mit Heartbeat AI das Energiesystem der Zukunft…",
    "apply_url": "https://1komma5grad.jobs.personio.de/job/2816818",
    "url": "https://1komma5grad.jobs.personio.de/job/2816818",
    "change_status": null,
    "first_seen_at": null,
    "last_seen_at": null,
    "scraped_at": "2026-10-21T09:59:23.471Z"
  },
  {
    "id": "personio:ottonova.de:2573573",
    "ats": "personio",
    "company": "ottonova",
    "company_name": "ottonova Krankenversicherung AG",
    "title": "(Senior) Aktuar (m/w/d) mit Schwerpunkt Solvency II (20h) (m/w/d)",
    "department": "Risk Management & Actuary",
    "team": "Versicherung",
    "location": "München",
    "locations": [
      "München",
      "Köln"
    ],
    "country": null,
    "workplace_type": null,
    "remote": null,
    "employment_type": "permanent, full-or-part-time",
    "experience_level": "experienced",
    "salary_min": null,
    "salary_max": null,
    "salary_currency": null,
    "salary_period": null,
    "salary_text": null,
    "salary_source": null,
    "posted_at": "2026-03-23T15:24:29.000Z",
    "updated_at": null,
    "requisition_id": null,
    "description": "DEIN TEAM\nottonova ist eine rein digitale private Krankenversicherung - innovativ, zeitgemäß und anders. An unseren Standorten München und Köln entwickeln wi…",
    "apply_url": "https://ottonova.jobs.personio.de/job/2573573",
    "url": "https://ottonova.jobs.personio.de/job/2573573",
    "change_status": null,
    "first_seen_at": null,
    "last_seen_at": null,
    "scraped_at": "2026-10-21T09:59:22.748Z"
  },
  {
    "id": "personio:ottonova.de:2807356",
    "ats": "personio",
    "company": "ottonova",
    "company_name": "ottonova Holding AG",
    "title": "Head of Finance & Controlling (m/w/d)",
    "department": "Finance",
    "team": "Corporate Functions",
    "location": "München",
    "locations": [
      "München"
    ],
    "country": null,
    "workplace_type": null,
    "remote": null,
    "employment_type": "permanent, full-time",
    "experience_level": "experienced",
    "salary_min": null,
    "salary_max": null,
    "salary_currency": null,
    "salary_period": null,
    "salary_text": null,
    "salary_source": null,
    "posted_at": "2026-09-22T11:03:32.000Z",
    "updated_at": null,
    "requisition_id": null,
    "description": "DEIN TEAM\nottonova ist eine digitale private Krankenversicherung - innovativ, zeitgemäß und anders. An unseren Standorten entwickeln wir zukunftsweisende Lös…",
    "apply_url": "https://ottonova.jobs.personio.de/job/2807356",
    "url": "https://ottonova.jobs.personio.de/job/2807356",
    "change_status": null,
    "first_seen_at": null,
    "last_seen_at": null,
    "scraped_at": "2026-10-21T09:59:22.753Z"
  },
  {
    "id": "personio:1komma5grad.de:2850992",
    "ats": "personio",
    "company": "1komma5grad",
    "company_name": "1KOMMA5° GmbH",
    "title": "Werkstudent:in CEO Office (m/w/d)",
    "department": "Management",
    "team": "1K5° Global Holding",
    "location": "Hamburg",
    "locations": [
      "Hamburg",
      "Remote"
    ],
    "country": null,
    "workplace_type": "remote",
    "remote": true,
    "employment_type": "intern, part-time",
    "experience_level": "student",
    "salary_min": null,
    "salary_max": null,
    "salary_currency": null,
    "salary_period": null,
    "salary_text": null,
    "salary_source": null,
    "posted_at": "2026-10-20T14:52:32.000Z",
    "updated_at": null,
    "requisition_id": null,
    "description": "1KOMMA5°\nBei 1KOMMA5° verfolgen wir eine Vision: Living on wind and sunlight forever for free. Dafür bauen wir mit Heartbeat AI das Energiesystem der Zukunft…",
    "apply_url": "https://1komma5grad.jobs.personio.de/job/2850992",
    "url": "https://1komma5grad.jobs.personio.de/job/2850992",
    "change_status": null,
    "first_seen_at": null,
    "last_seen_at": null,
    "scraped_at": "2026-10-21T09:59:23.854Z"
  },
  {
    "id": "personio:1komma5grad.de:2850933",
    "ats": "personio",
    "company": "1komma5grad",
    "company_name": "1KOMMA5° Riederich GmbH",
    "title": "Sales Manager (m/w/d) – Photovoltaik, Wärmepumpe & intelligente Energiesysteme - 1KOMMA5° Stockach",
    "department": "Sales & Vertriebsaußendienst",
    "team": "1K5° Sales Standorte - DE",
    "location": "Stockach",
    "locations": [
      "Stockach"
    ],
    "country": null,
    "workplace_type": null,
    "remote": null,
    "employment_type": "permanent, full-time",
    "experience_level": "experienced",
    "salary_min": null,
    "salary_max": null,
    "salary_currency": null,
    "salary_period": null,
    "salary_text": null,
    "salary_source": null,
    "posted_at": "2026-10-20T14:16:30.000Z",
    "updated_at": null,
    "requisition_id": null,
    "description": "1KOMMA5°\nBei 1KOMMA5° verfolgen wir eine Vision: Living on wind and sunlight forever for free. Dafür bauen wir mit Heartbeat AI das Energiesystem der Zukunft…",
    "apply_url": "https://1komma5grad.jobs.personio.de/job/2850933",
    "url": "https://1komma5grad.jobs.personio.de/job/2850933",
    "change_status": null,
    "first_seen_at": null,
    "last_seen_at": null,
    "scraped_at": "2026-10-21T09:59:23.777Z"
  },
  {
    "id": "personio:1komma5grad.de:2849560",
    "ats": "personio",
    "company": "1komma5grad",
    "company_name": "1KOMMA5° Berlin GmbH",
    "title": "Teamleitung (m/w/d) Auftragsmanagement / Projektkoordination / Disposition - Photovoltaik, Wärmepumpen & Energiesysteme - 1KOMMA5° Berlin",
    "department": "Projektkoordination",
    "team": "1K5° Berlin",
    "location": "Berlin",
    "locations": [
      "Berlin"
    ],
    "country": null,
    "workplace_type": null,
    "remote": null,
    "employment_type": "permanent, full-time",
    "experience_level": "entry-level",
    "salary_min": null,
    "salary_max": null,
    "salary_currency": null,
    "salary_period": null,
    "salary_text": null,
    "salary_source": null,
    "posted_at": "2026-10-19T17:02:29.000Z",
    "updated_at": null,
    "requisition_id": null,
    "description": "1KOMMA5°\nBei 1KOMMA5° verfolgen wir eine Vision: Living on wind and sunlight forever for free. Dafür bauen wir mit Heartbeat AI das Energiesystem der Zukunft…",
    "apply_url": "https://1komma5grad.jobs.personio.de/job/2849560",
    "url": "https://1komma5grad.jobs.personio.de/job/2849560",
    "change_status": null,
    "first_seen_at": null,
    "last_seen_at": null,
    "scraped_at": "2026-10-21T09:59:23.822Z"
  }
]
```

In that run 1 of 310 jobs (under 1%) carried a published pay range, parsed into `salary_min`, `salary_max`, `salary_currency` and `salary_period`.

### Related Actors

- [Career Page Jobs Scraper](https://apify.com/dododata/career-site-jobs-scraper): the same rows from ten career-page systems in one run

### Input reference

| Field | Default | Meaning |
|---|---|---|
| `startUrls` | sample boards | Personio career-page URLs |
| `companies` | none | Company names as they appear in the career-page URL |
| `keywords` | none | Keep jobs whose title contains one of these words |
| `locations` | none | Keep jobs whose location, country or workplace type contains one of these |
| `postedWithinDays` | none | Keep jobs published in the last N days |
| `includeDescription` | true | Turn off for lighter rows; pay is still read before the text is dropped |
| `monitorName` | none | Turns on change tracking between runs; use the same name every run |
| `onlyChanges` | false | With a monitor name: leave out, and do not bill, unchanged jobs |
| `includeRemoved` | true | With a monitor name: report jobs that are gone since the previous run |
| `maxItems` | 500 | Stop after this many rows |
| `maxConcurrency` | 5 | Parallel requests |
| `useProxy` | false | Off by default: the source answers faster without it. Turn on only if a run reports being rate-limited or blocked |

### Questions and feedback

Something missing, wrong or unclear? Open an Issue on this page: we answer within a day, and fixes usually ship within 48 hours. If the Actor saved you time, a short review here helps other people find it.

### Changelog

- 2026-10-21, v0.1: first release. Verified against live boards on 2026-10-21.

# Actor input Schema

## `searchAllCompanies` (type: `boolean`):

Turn on to search Dodo Data's index of every Personio company we know instead of reading the career pages below: 14,997 open jobs from 1,513 companies on 4 November 2026, refreshed daily. Title keywords, Locations, Companies, Posted within and Max jobs apply; full text is fetched live for the jobs returned. Monitor mode does not apply here. Same rows, same price per job.

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

Career pages hosted on Personio, for example https://1komma5grad.jobs.personio.de. Any page of the board works; the company is read from the URL. Leave empty to try the Actor on sample boards.

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

Alternative to URLs: the company's name on Personio, as it appears in the career-page URL, for example 1komma5grad

## `keywords` (type: `array`):

Keep only jobs whose title has a word starting with one of these (case and accents ignored), e.g. engineer, data, product: engineer finds Engineering Manager, art does not find Part-Time. Filtered-out jobs are not saved and not charged.

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

Keep only jobs whose location, country or workplace type contains one of these as a whole word, e.g. london, germany, remote. UK, US and USA are understood both ways, and UK never matches Ukraine.

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

Keep only jobs first published (or updated, when no publish date exists) in the last N days. Use 1 with a daily schedule to get only new jobs.

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

Turn off for lighter rows when you only need titles, locations and pay.

## `monitorName` (type: `string`):

Turns on change tracking. Pick any name, for example my-job-watch, and use the same name on every run. Each job then says whether it is new, updated or unchanged since the previous run under that name, with the date it was first seen. The first run marks everything as new. State is kept in a key-value store on your own account. Leave empty to switch tracking off.

## `onlyChanges` (type: `boolean`):

Needs a monitor name. Unchanged jobs are left out of the results and are not billed.

## `includeRemoved` (type: `boolean`):

Needs a monitor name. A job that was listed in the previous run and is gone now is returned once, with change_status "removed", its title, URL and the dates it was first and last seen. Only reported when the board was read completely, so a filter or a row cap never produces a false alarm.

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

Stop after this many jobs across all boards. You pay per row, so this is also your budget cap.

## `maxConcurrency` (type: `integer`):

Parallel requests. 5 is polite and fast enough for most sites.

## `useProxy` (type: `boolean`):

Off by default: these job board APIs and career sites are public and answered four to eight times faster without a proxy in our measurements (25 Sept 2026). Turn it on only if a run reports being rate-limited or blocked.

## Actor input object example

```json
{
  "searchAllCompanies": false,
  "startUrls": [
    {
      "url": "https://1komma5grad.jobs.personio.de"
    },
    {
      "url": "https://ottonova.jobs.personio.de"
    }
  ],
  "companies": [],
  "keywords": [],
  "locations": [],
  "includeDescription": true,
  "onlyChanges": false,
  "includeRemoved": true,
  "maxItems": 500,
  "maxConcurrency": 5,
  "useProxy": 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 = {
    "startUrls": [
        {
            "url": "https://1komma5grad.jobs.personio.de"
        },
        {
            "url": "https://ottonova.jobs.personio.de"
        }
    ],
    "companies": [],
    "keywords": [],
    "locations": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("dododata/personio-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://1komma5grad.jobs.personio.de" },
        { "url": "https://ottonova.jobs.personio.de" },
    ],
    "companies": [],
    "keywords": [],
    "locations": [],
}

# Run the Actor and wait for it to finish
run = client.actor("dododata/personio-jobs-scraper").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 '{
  "startUrls": [
    {
      "url": "https://1komma5grad.jobs.personio.de"
    },
    {
      "url": "https://ottonova.jobs.personio.de"
    }
  ],
  "companies": [],
  "keywords": [],
  "locations": []
}' |
apify call dododata/personio-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

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/cwbl06LiKPyQ57rRJ/builds/MKyAw3dCdwJKg5sV7/openapi.json
