# Kununu Scraper — DACH Employer Reviews, Salaries & Jobs (`crawloop/kununu-scraper`) Actor

Scrape Kununu employer profiles across Germany, Austria and Switzerland. Export scores, employee and applicant reviews, salary medians, Kulturkompass, and jobs with each employer's rating. Resolve company names or profile URLs.

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

## Pricing

from $1.99 / 1,000 employee or applicant reviews

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

## Kununu Scraper — DACH Employer Reviews, Salaries & Jobs

> **Disclaimer:** Unofficial tool for publicly accessible Kununu employer profiles. **Kununu**, **New Work**, and related names are trademarks of their respective owners. Not affiliated with, sponsored by, or endorsed by Kununu / New Work SE. For informational, research, and recruiting-intelligence use only. Respect applicable terms of use and law.

Scrape **kununu.com** across **Germany, Austria & Switzerland** — employer scores, employee reviews, interview reviews, salary medians, Kulturkompass, and **open job postings with each employer's Kununu score attached**. Resolve plain **company names** or paste **profile URLs**. Export clean JSON for recruiting intelligence, employer branding, compensation research, and DACH job pipelines.

> **Crawloop DACH Jobs Suite** — public BA Jobsuche + Kununu employer intelligence (+ Stepstone board listings).

| Arbeitsagentur (BA Jobsuche) | Kununu (employer intel) | Stepstone (commercial board) |
| :--- | :--- | :--- |
| [Arbeitsagentur Jobs Scraper](https://apify.com/crawloop/arbeitsagentur-jobs-scraper) | **Kununu Scraper** ◄── you are here | [Stepstone Jobs Scraper](https://apify.com/crawloop/stepstone-jobs-scraper) |

### Key Features

- **Company-centric DACH coverage** — `de` / `at` / `ch` from one Actor
- **Typed dataset rows** — `company`, `review`, `applicantReview`, `salary`, `culture`, `job`
- **Jobs with reputation** — every job row can carry `employerScore` / Kununu rating
- **Name resolve** — pass `["SAP", "Bosch"]` without hunting for URLs
- **Incremental monitor mode** — KV watermarks; emit only new reviews/jobs / changed scores
- **Fail-fast WAF handling** — Camoufox solves AWS WAF once (no residential proxy); abort on interactive captcha instead of burning CU
- **Compact mode** — token-efficient rows for MCP / LLM pipelines
- **Suite chain** — enrich employers discovered via Arbeitsagentur Jobs Scraper

### Use Cases

| Use case | What you get |
| :--- | :--- |
| **Employer due diligence** | Score, recommendation rate, score ranges / yearly trend, review snippets |
| **Recruiting market research** | That employer’s own Kununu jobs + rating when the profile lists any |
| **Compensation analysis** | Salary medians / ranges with sample size |
| **Interview prep** | Applicant reviews with questions and outcomes |
| **BA enrichment** | Take unique `employer` names from BA runs → resolve on Kununu |
| **HR monitoring** | Incremental mode for score / review deltas |

### When to use this Actor

- You need **Kununu scores / reviews / salaries** as structured data
- You want **that employer’s own Kununu jobs with rating attached** (not a global job board)
- You chain **Arbeitsagentur → Kununu** for Germany public jobs + reputation

### When not to use this Actor

- **Keyword job search across all of Kununu** — use per-employer `includeJobs`, or [Stepstone Jobs Scraper](https://apify.com/crawloop/stepstone-jobs-scraper) / [Arbeitsagentur Jobs Scraper](https://apify.com/crawloop/arbeitsagentur-jobs-scraper) for board search
- **Guaranteed contacts** — this Actor does not do email enrichment
- **Login-walled content** — public profiles only

### Quick Start

```json
{
  "companyNames": ["SAP", "Deutsche Telekom"],
  "countryCode": "de",
  "maxItems": 50,
  "includeReviews": true,
  "maxReviewsPerCompany": 20,
  "includeJobs": true,
  "maxJobsPerCompany": 20,
  "preferBrowser": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

### Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `companyNames` | Array | — | Plain company names to resolve |
| `startUrls` | Array | — | Kununu profile / search URLs |
| `countryCode` | String | `de` | `de` / `at` / `ch` |
| `maxItems` | Integer | `100` | Hard cap on all row types (`0` = unlimited) |
| `includeReviews` | Boolean | `false` | Employee reviews |
| `maxReviewsPerCompany` | Integer | `50` | Cap per employer |
| `includeApplicantReviews` | Boolean | `false` | Interview / applicant reviews |
| `includeSalaries` | Boolean | `false` | Salary table rows |
| `includeCulture` | Boolean | `false` | Kulturkompass row |
| `includeJobs` | Boolean | `false` | Open positions with score |
| `incrementalMode` | Boolean | `false` | Emit only deltas vs KV baseline |
| `compact` | Boolean | `false` | Core fields only |
| `awsWafToken` | String | — | Optional `aws-waf-token` / Cookie header (usually unused) |
| `preferBrowser` | Boolean | `true` | Camoufox WAF solve + BFF JSON (fail-fast on interactive captcha) |
| `proxyConfiguration` | Object | off | Not required. Leave Apify Proxy disabled unless your IP is blocked |

### Output Format

Each dataset item has a `type` discriminator.

| Type | Key fields |
| :--- | :--- |
| `company` | `slug`, `name`, `kununuScore`, `reviewCount`, `recommendationRate`, `scoreRanges`, `yearlyScores`, `url` |
| `review` / `applicantReview` | `rating`, `pros`, `cons`, `department`, `interviewQuestions`, `interviewOutcome` |
| `salary` | `jobTitle`, `median`, `min`, `max`, `sampleSize`, `currency` |
| `job` | `title`, `location`, `datePosted`, `employerScore`, `url` (own listings only) |
| `culture` | `verdict`, `dimensions` |

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/kununu-scraper').call({
  companyNames: ['SAP'],
  countryCode: 'de',
  maxItems: 30,
  includeJobs: true,
  preferBrowser: true,
  proxyConfiguration: { useApifyProxy: false },
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 5));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token)
run = client.actor("crawloop/kununu-scraper").call(
    run_input={
        "companyNames": ["SAP"],
        "includeReviews": True,
        "maxReviewsPerCompany": 10,
        "maxItems": 30,
        "preferBrowser": True,
        "proxyConfiguration": {"useApifyProxy": False},
    }
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get("type"), item.get("name") or item.get("title"))
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~kununu-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companyNames":["SAP"],"includeJobs":true,"maxItems":20}'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call `crawloop/kununu-scraper`.

Example prompts:

- "Run Kununu Scraper for SAP and Deutsche Telekom, include jobs, return company scores and job titles"
- "Scrape Kununu reviews for Bosch (max 20) and summarize pros/cons"
- "Chain Arbeitsagentur Jobs Scraper for Pflege in Berlin, take unique employers, enrich via Kununu Scraper, then search Stepstone Jobs Scraper for the same titles"

### Suite next step

1. Discover Germany openings with [Arbeitsagentur Jobs Scraper](https://apify.com/crawloop/arbeitsagentur-jobs-scraper)
2. Enrich employers here (scores / reviews / salaries)
3. Add commercial board coverage with [Stepstone Jobs Scraper](https://apify.com/crawloop/stepstone-jobs-scraper) when you need keyword × city search at volume

### FAQ

**Do I need a Kununu login?**\
No — public profile data only.

**Why Camoufox / awsWafToken?**\
Kununu fronts AWS WAF. The Actor solves it with Camoufox (no proxy required) and then reads the JSON BFF. Interactive captcha → fail-fast, no CU burn. Paste `awsWafToken` only if the stealth browser cannot pass.

**Can I search all Kununu jobs by keyword?**\
Not as a global keyword board. Enable `includeJobs` per employer, or use [Arbeitsagentur Jobs Scraper](https://apify.com/crawloop/arbeitsagentur-jobs-scraper) / [Stepstone Jobs Scraper](https://apify.com/crawloop/stepstone-jobs-scraper) for search-style listing scrapes.

**Why are job rows empty for some employers?**\
`includeJobs` keeps only listings whose nested profile slug matches that employer. Some companies (SAP is a common example) have **no own jobs** on Kununu — the jobs tab may show competitor ads, which this Actor skips.

**Where are category scores?**\
Kununu’s public BFF often omits factor-level averages. Company rows include `kununuScore`, `recommendationRate`, `scoreRanges`, and `yearlyScores`. Per-review `ratings` (atmosphere, career, …) still appear on review rows. `categoryScores` is present when Kununu exposes it.

### Related Actors

| Actor | Focus |
| :--- | :--- |
| **Kununu Scraper** ◄── you are here | DACH employer scores, reviews, salaries, jobs-with-score |
| [Arbeitsagentur Jobs Scraper](https://apify.com/crawloop/arbeitsagentur-jobs-scraper) | Germany BA Jobsuche listings |
| [Stepstone Jobs Scraper](https://apify.com/crawloop/stepstone-jobs-scraper) | DACH commercial job board |
| [WLW Scraper](https://apify.com/crawloop/wlw-scraper) | DACH B2B supplier directory |
| [Trustpilot Scraper](https://apify.com/crawloop/trustpilot-scraper) | Review monitoring (global) |

# Actor input Schema

## `companyNames` (type: `array`):

Plain employer names to resolve on Kununu (e.g. SAP, Bosch, Deutsche Telekom).

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

Kununu company profile URLs (and optional search URLs). Example: https://www.kununu.com/de/sap

## `countryCode` (type: `string`):

Default DACH market used when resolving company names.

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

Hard cap on dataset rows (all types). 0 = unlimited.

## `includeReviews` (type: `boolean`):

Also scrape employee reviews for each resolved employer.

## `maxReviewsPerCompany` (type: `integer`):

Cap employee review rows per employer.

## `includeApplicantReviews` (type: `boolean`):

Also scrape applicant reviews (interview questions & outcomes).

## `maxApplicantReviewsPerCompany` (type: `integer`):

Cap applicant / interview review rows per employer.

## `includeSalaries` (type: `boolean`):

Emit salary median/range rows from the employer Gehaelter tab.

## `includeCulture` (type: `boolean`):

Emit a culture verdict row when available.

## `includeJobs` (type: `boolean`):

Scrape this employer's own Kununu job postings (each row carries employerScore). Skips competitor ads on the jobs tab; some employers have none.

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

Cap open job posting rows per employer.

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

Return core fields only (token-efficient for MCP / LLM pipelines).

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

Emit only new reviews/jobs and changed company fingerprints since the last run.

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

KV key inside the monitor store for this watchlist baseline.

## `monitorStoreName` (type: `string`):

Named Apify Key-Value Store for incremental watermarks.

## `awsWafToken` (type: `string`):

Optional. Paste aws-waf-token value (or full Cookie header) from a real browser session. Usually not needed — Camoufox solves WAF without a proxy.

## `preferBrowser` (type: `boolean`):

On by default. Camoufox solves AWS WAF once, then reads Kununu BFF JSON. Fail-fast on interactive Human Verification (no retry loops). Turn off only if you supply a fresh awsWafToken.

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

Leave Apify Proxy off. Kununu WAF is solved in-browser; residential proxy is not required and only increases cost. Enable only if your runs are IP-blocked.

## Actor input object example

```json
{
  "companyNames": [
    "SAP",
    "Deutsche Telekom"
  ],
  "startUrls": [
    {
      "url": "https://www.kununu.com/de/sap"
    }
  ],
  "countryCode": "de",
  "maxItems": 100,
  "includeReviews": false,
  "maxReviewsPerCompany": 50,
  "includeApplicantReviews": false,
  "maxApplicantReviewsPerCompany": 50,
  "includeSalaries": false,
  "includeCulture": false,
  "includeJobs": false,
  "maxJobsPerCompany": 50,
  "compact": false,
  "incrementalMode": false,
  "stateKey": "MONITOR_STATE",
  "monitorStoreName": "kununu-monitor-store",
  "preferBrowser": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Default dataset items.

# 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 = {
    "companyNames": [
        "SAP",
        "Deutsche Telekom"
    ],
    "startUrls": [
        {
            "url": "https://www.kununu.com/de/sap"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/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 = {
    "companyNames": [
        "SAP",
        "Deutsche Telekom",
    ],
    "startUrls": [{ "url": "https://www.kununu.com/de/sap" }],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/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 '{
  "companyNames": [
    "SAP",
    "Deutsche Telekom"
  ],
  "startUrls": [
    {
      "url": "https://www.kununu.com/de/sap"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call crawloop/kununu-scraper --silent --output-dataset

```

## MCP server setup

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