# kununu Company Profile Scraper — DACH Ratings & Awards (`corvuslab/kununu-scraper`) Actor

Scrape kununu company profiles across Germany, Austria and Switzerland — overall score, the full rating-factor breakdown, review counts, recommendation rate, score trend and awards. One record per company, with built-in incremental monitoring and change alerts.

- **URL**: https://apify.com/corvuslab/kununu-scraper.md
- **Developed by:** [Corvuslab](https://apify.com/corvuslab) (community)
- **Categories:** Lead generation, Automation, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

### What does the kununu Company Profile Scraper do?

The kununu Company Profile Scraper turns any kununu company profile into a single, structured record — one clean row per company across the DACH region (Germany, Austria and Switzerland). Paste profile URLs or bare company slugs and get back the **overall kununu score**, the **full rating-factor breakdown** (up to 14 factors such as Gehalt/Benefits, Work-Life-Balance and Vorgesetztenverhalten), **salary ranges by job title** (min / max / median / average), the **benefits list** with the share of employees reporting each, **total and segmented review counts**, the **recommendation rate**, the **recent-vs-older score trend**, and the company's **awards and Top Company badges** — plus location, industry and claimed/verified status. It runs with no code, exports to JSON, CSV, Excel or the API, and can watch employers on a schedule and ping you only when their numbers move.

**Why this scraper**

- ⚡ **Fast & low-cost** — one compact record per company, so large DACH watchlists finish quickly and stay cheap.
- 🧾 **Rich, typed records** — 40+ structured fields per company, not raw HTML.
- ♻️ **Cheap to monitor** — incremental mode re-emits only the companies whose score or review counts changed (see below).
- 🔔 **Notifications built in** — Telegram, Slack, Discord or any webhook (n8n / Make / Zapier).
- 🤖 **AI- & API-ready** — compact and drop-empty output modes keep payloads small for LLMs and MCP.

***

### ✨ Key features

- 🏢 **One record per company** — paste kununu profile URLs, `country/slug` paths or bare slugs; you get exactly one tidy employer snapshot back per company.
- 🌍 **Full DACH coverage** — Germany, Austria and Switzerland (de / at / ch), with a default country for bare slugs and graceful skipping of company slugs that no longer exist.
- ⭐ **Complete rating breakdown** — overall kununu score, rounded score, applicants' score, industry-average score, and the full rating-factor list (up to 14 factors, each with its own name and score).
- 💶 **Salary & benefits** — salary ranges per job title (min / max / median / average with the number of data points), a salary-satisfaction split, and the full benefits list with the share of employees reporting each perk.
- 🗣️ **Review depth** — total reviews, reviews with text, employee vs. candidate reviews, reviews in the last two years, reviews with an employer response, and the year of the first review.
- 👍 **Recommendation signal** — recommendation rate plus the raw recommended / not-recommended counts.
- 📈 **Score trend** — recent-period vs. older-period scores and the delta, so you can see whether an employer's rating is rising or falling.
- 🏆 **Awards & badges** — Top Company years, award names with year, and whether each badge was paid.
- ♻️ **Incremental monitoring** — schedule it and get only what changed (NEW / UPDATED / UNCHANGED / EXPIRED); unchanged companies are skipped so a daily watch costs a fraction of a full re-scan.
- 🔔 **Notifications** — push matched changes to Telegram, Slack, Discord or any webhook.
- 🤖 **AI-ready** — compact output plus a drop-empty mode for lean LLM and MCP payloads.

***

### 📚 What data can you extract?

- **Company identity** — `name`, `simpleName`, `slug`, `countryCode`, `url`, `website`, `profileType`, `isClaimed`, `isVerified`, `logo`, `industryId`, plus stable `id` / `profileUuid`.
- **Location** — `city`, `state`, `companyCountryCode`, `totalLocations`.
- **Scores** — `kununuScore`, `roundedScore`, `applicantsScore`, `industryAverageScore`, and the trend triple `scoreTrendRecent` / `scoreTrendOlder` / `scoreTrendDelta`.
- **Reviews** — `totalReviews`, `totalReviewsWithText`, `totalReviewsEmployees`, `totalReviewsCandidates`, `totalReviewsLastTwoYears`, `totalReviewsWithResponse`, `firstReviewYear`.
- **Recommendation** — `recommendationRate`, `recommendedCount`, `notRecommendedCount`.
- **Rating factors** — `factorRatings` (each factor's name and score).
- **Salary** — `salaryRanges` (per job title: `min`, `max`, `median`, `average`, number of `entries`) and `salarySatisfaction` (positive / neutral / negative split).
- **Benefits** — `benefits` (each perk with the `percentage` of employees reporting it and the raw `count`) plus `benefitsTotalReviews`.
- **Awards & badges** — `awards`, `topCompanyYears`, `isTopCompanyPaid`.
- **Run metadata** — `source`, `scrapedAt`, `contentHash`, `changeType` (in incremental mode).

Every field is present in standard mode (missing values are `null`); **compact mode** returns the core fields only — `profileUuid`, `name`, `url`, `countryCode`, `kununuScore`, `roundedScore`, `totalReviews`, `recommendationRate` (plus `changeType` in incremental mode) — for lean AI/MCP payloads.

***

### ⚙️ Input & output

Configure it in the visual editor — no code needed — or pass JSON via the API.

| Field | What it does |
|---|---|
| `companies` | The kununu companies to scrape — full profile URLs, `country/slug` paths, or bare slugs. |
| `country` | Default country (`de` / `at` / `ch`) for bare slugs that don't include one. |
| `maxResults` | Cap the number of company profiles (0 = no limit). |
| `ignoreUrlFailures` | Skip slugs that don't exist instead of failing the run. |
| `includeFactorRatings` | Include the per-factor rating breakdown; turn off for a faster, cheaper run when you only need the overall score. |
| `includeSalaryBenefits` | Include salary ranges by job title and the benefits list; turn off for leaner records. |
| `compact` | Emit only the core fields — ideal for AI agents and MCP. |
| `incrementalMode` | Emit only companies whose score or review counts changed since the last run. |
| `proxyConfiguration` | Optional proxy settings for reliable high-volume runs. |

…and **21 inputs** in total — the table shows the essentials; the rest cover the drop-empty output mode, incremental state and unchanged/expired handling, notification channels (Telegram / Slack / Discord / webhook) and advanced tuning, all in the visual editor.

#### 📥 Example input

Basic — two German companies by URL:

```json
{ "companies": ["https://www.kununu.com/de/sap", "https://www.kununu.com/de/bmwgroup"], "maxResults": 25 }
```

Mixed DACH — slugs and country paths with a default country:

```json
{ "companies": ["sap", "at/red-bull-gmbh", "ch/swisscom"], "country": "de" }
```

Incremental monitoring with a Telegram alert on every change:

```json
{ "companies": ["https://www.kununu.com/de/sap"], "incrementalMode": true, "telegramToken": "123456:ABC", "telegramChatId": "@yourchannel" }
```

#### 📤 Example output

```json
{
  "id": "a558284b-93ad-4015-a649-a1e152c479c8",
  "profileUuid": "a558284b-93ad-4015-a649-a1e152c479c8",
  "name": "SAP SE",
  "simpleName": "SAP",
  "slug": "sap",
  "countryCode": "de",
  "url": "https://www.kununu.com/de/sap",
  "website": "https://jobs.sap.com",
  "profileType": "Claimed",
  "isClaimed": true,
  "isVerified": true,
  "industryId": 6,
  "city": "Walldorf / Baden-Württemb.",
  "state": "Baden-Württemberg",
  "companyCountryCode": "de",
  "totalLocations": 42,
  "kununuScore": 4.3,
  "roundedScore": 4.5,
  "applicantsScore": 3.1,
  "industryAverageScore": 4.0,
  "scoreTrendRecent": 4.1,
  "scoreTrendOlder": 4.4,
  "scoreTrendDelta": -0.3,
  "totalReviews": 4918,
  "totalReviewsWithText": 2638,
  "totalReviewsEmployees": 4658,
  "totalReviewsCandidates": 260,
  "totalReviewsLastTwoYears": 631,
  "totalReviewsWithResponse": 9,
  "firstReviewYear": 2007,
  "recommendationRate": 84.0,
  "recommendedCount": 502,
  "notRecommendedCount": 96,
  "factorRatings": [
    { "name": "Gehalt/Benefits", "score": 4.2 },
    { "name": "Work-Life-Balance", "score": 4.1 },
    { "name": "Vorgesetztenverhalten", "score": 4.3 },
    { "name": "Kollegenzusammenhalt", "score": 4.5 }
  ],
  "topCompanyYears": [2026, 2025, 2024, 2023, 2022],
  "awards": [
    { "name": "Top Company 2026", "group": "kununu Top Company", "year": 2026, "wasPaid": false },
    { "name": "Top Rated-Siegel Gehaltszufriedenheit 2026", "group": "kununu Top Rated-Siegel Gehaltszufriedenheit", "year": 2026, "wasPaid": false }
  ],
  "isTopCompanyPaid": false,
  "salaryRanges": [
    { "jobTitle": "Softwareentwickler:in", "jobTitleSlug": "softwareentwickler-in", "min": 43500, "max": 109500, "median": 70000, "average": 71800, "entries": 428 },
    { "jobTitle": "SAP-Berater:in", "jobTitleSlug": "sap-berater-in", "min": 46800, "max": 123700, "median": 75000, "average": 78100, "entries": 150 }
  ],
  "salarySatisfaction": { "positivePercentage": 80, "neutralPercentage": 11, "negativePercentage": 9, "totalReviews": 4573 },
  "benefits": [
    { "id": "flexWorkingHours", "percentage": 83, "count": 3855 },
    { "id": "homeOffice", "percentage": 79, "count": 3689 },
    { "id": "pensionPlan", "percentage": 72, "count": 3338 }
  ],
  "benefitsTotalReviews": 4665,
  "source": "kununu.com",
  "scrapedAt": "2026-08-12T20:14:12.827667+00:00"
}
```

The `factorRatings`, `salaryRanges`, `benefits` and `awards` arrays are trimmed above for readability — a real record returns every rating factor, salary band, benefit and award for the company.

***

### 💡 Use cases

- **Employer benchmarking** — compare score, recommendation rate and rating factors across a set of competitors or your own subsidiaries in one sheet.
- **Employer-brand & HR monitoring** — watch how your kununu score, review volume and awards move over time and get alerted when they do.
- **Recruiting & talent intelligence** — score prospective employers for candidates, or size up a market before you enter it.
- **Market & competitive research** — pull rating and review data for a whole industry or region across Germany, Austria and Switzerland.
- **Enrichment & aggregation** — feed clean employer data into your own CRM, dashboard, sheet or warehouse.
- **AI agents & pipelines** — compact output plugs straight into LLM / MCP workflows.

***

### ♻️ Incremental monitoring — pay for changes, not repeats

Schedule the actor and turn on **incremental mode**: each run compares against the last and emits only **NEW / UPDATED / EXPIRED** companies — those whose kununu score or review counts actually moved. Unchanged companies are skipped, so a daily watch over a large employer list costs a fraction of a full re-scan.

| Daily churn | of 1,000 tracked | billable records | you save |
|---|---|---|---|
| 5 % | 1,000 | 50 | **95 %** |
| 15 % | 1,000 | 150 | **85 %** |
| 30 % | 1,000 | 300 | **70 %** |

The first run seeds the baseline and bills in full; every run after that bills only the delta. Pair it with a notification channel to get a live change feed straight into Telegram, Slack, Discord or your own webhook.

***

### 🚀 How to run it

1. Open the actor and paste your **company URLs or slugs** (e.g. `https://www.kununu.com/de/sap` or `at/red-bull-gmbh`).
2. Pick a **default country** for bare slugs and set **Max companies**.
3. (Optional) Turn on **compact** or **drop-empty** output for AI pipelines.
4. (Optional) Turn on **incremental mode** and a **notification** channel, then **Schedule** it.
5. Click **Start**, then download the data as **JSON, CSV or Excel**, or pull it from the **API**.

New to Apify? Create a free account — it comes with monthly credit, no credit card required.

***

### 🔌 Integrations & export

Export to **JSON, CSV, Excel** or an HTML table, or pull from the **REST API** and the **JavaScript / Python** clients. Runs on a **schedule**, connects to **Google Sheets, Slack, Make, Zapier and n8n**, and works as an **MCP tool** for AI agents — compact mode keeps token usage small.

***

### ❓ FAQ

**What do I give it — search terms or URLs?** A list of companies: full kununu profile URLs, `country/slug` paths, or bare slugs. You get one record per company.

**Which countries are covered?** The whole DACH region — Germany (`de`), Austria (`at`) and Switzerland (`ch`).

**Does it return the individual review texts?** No — it returns the company-level snapshot: overall and factor scores, salary ranges by job title, benefits, review counts, recommendation rate, score trend and awards. It's the fastest, most complete way to track employers at the company level.

**Can I get only companies that changed on a schedule?** Yes — turn on incremental mode and schedule it; each run emits only what changed and can notify your channel.

**What happens if a company slug doesn't exist?** With "Skip missing companies" on (the default), it's skipped and the run continues instead of failing.

**What formats can I export?** JSON, CSV, Excel, HTML table, or via the API.

**Is it good for AI agents?** Yes — enable compact mode; the output is MCP-friendly and drop-empty keeps payloads lean.

**Is scraping this legal?** The actor collects only **publicly available** data. You are responsible for how you use it, including any personal data and GDPR-style obligations.

***

### ⚖️ Disclaimer

This actor accesses only publicly available data on kununu. You are responsible for how you use the extracted data — in particular any personal information — and for complying with the site's terms and applicable law (including the GDPR where it applies). Not affiliated with, endorsed by, or sponsored by kununu or New Work SE.

***

**Keywords:** kununu scraper · kununu api · kununu.com scraper · kununu company scraper · employer rating scraper · company reviews scraper · kununu salary scraper · Gehalt scraper · salary range data · company benefits data · DACH employer data · Germany company ratings · Austria company reviews · Switzerland employer ratings · Arbeitgeberbewertung scraper · employer branding monitoring · company score api · recommendation rate scraper · export to CSV Excel JSON · no-code scraper · MCP tool for AI agents

# Actor input Schema

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

Each entry can be a full profile URL (https://www.kununu.com/de/sap), a country/slug path (at/red-bull-gmbh) or a bare slug (sap). A bare slug uses the default country below.

## `country` (type: `string`):

Country to assume for bare slugs that don't include one. kununu covers the DACH region.

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

Alternative to 'Company URLs' — accepts the same values. Useful when chaining from another actor.

## `maxResults` (type: `integer`):

Maximum number of company profiles to return. Set 0 for no limit (bounded by how many you provide).

## `ignoreUrlFailures` (type: `boolean`):

Skip company slugs that don't exist instead of failing the whole run.

## `compact` (type: `boolean`):

Emit only the core fields (name, URL, score, review count, recommendation rate). Ideal for AI agents and MCP clients.

## `excludeEmptyFields` (type: `boolean`):

Remove null, empty-string and empty-array fields from each record.

## `includeFactorRatings` (type: `boolean`):

Include the per-factor score breakdown (work atmosphere, work-life balance, management, salary, etc.). Turning this off is faster and cheaper when you only need the overall score, review counts and recommendation rate.

## `includeSalaryBenefits` (type: `boolean`):

Include salary ranges by job title (min/max/median/average), salary-satisfaction split and the benefits list with the share of employees reporting each. Read from the same page, so this only shapes the output — turn off for leaner records.

## `incrementalMode` (type: `boolean`):

Track state between runs and tag every record with a changeType (NEW / UPDATED / UNCHANGED / EXPIRED).

## `stateKey` (type: `string`):

Stable name for the tracked company set. Leave empty to derive one automatically from your inputs.

## `emitUnchanged` (type: `boolean`):

Also emit companies that have not changed since the previous run.

## `emitExpired` (type: `boolean`):

Emit records for companies present last run but not in this one.

## `telegramToken` (type: `string`):

Bot token from @BotFather.

## `telegramChatId` (type: `string`):

Chat or channel ID, e.g. "-100123456789" or "@yourchannel".

## `slackWebhookUrl` (type: `string`):

Slack incoming-webhook URL.

## `discordWebhookUrl` (type: `string`):

Discord incoming-webhook URL.

## `webhookUrl` (type: `string`):

Any HTTPS endpoint. Receives a JSON POST with the matched records — works with n8n, Make and Zapier.

## `webhookHeaders` (type: `object`):

Extra headers for the webhook request, e.g. {"Authorization": "Bearer xyz"}.

## `notificationLimit` (type: `integer`):

How many records to include in each notification message.

## `proxyConfiguration` (type: `object`):

Runs fine with no proxy by default. For very large runs, or if you start seeing blocks, enable Apify Proxy (residential) as a fallback.

## Actor input object example

```json
{
  "companies": [
    "https://www.kununu.com/de/sap",
    "https://www.kununu.com/de/bmwgroup"
  ],
  "country": "de",
  "maxResults": 25,
  "ignoreUrlFailures": true,
  "compact": false,
  "excludeEmptyFields": false,
  "includeFactorRatings": true,
  "includeSalaryBenefits": true,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "notificationLimit": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

## `allItems` (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": [
        "https://www.kununu.com/de/sap",
        "https://www.kununu.com/de/bmwgroup"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("corvuslab/kununu-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 = { "companies": [
        "https://www.kununu.com/de/sap",
        "https://www.kununu.com/de/bmwgroup",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("corvuslab/kununu-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 '{
  "companies": [
    "https://www.kununu.com/de/sap",
    "https://www.kununu.com/de/bmwgroup"
  ]
}' |
apify call corvuslab/kununu-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corvuslab/kununu-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/xRHoaagVUQeFXLiqz/builds/LFOvhkdKojRUQCuJy/openapi.json
