{
  "openapi": "3.0.1",
  "info": {
    "title": "Kununu Scraper · DACH Employer Reviews, Salaries & Jobs",
    "description": "Kununu scraper for Germany, Austria and Switzerland. Employer scores, employee reviews, interview questions and outcomes, salary medians and Kulturkompass. Job postings carry the employer's rating. Search by company name or profile URL. Incremental monitoring. JSON, CSV or Excel.",
    "version": "1.0",
    "x-build-id": "ETWDhWzWR4EgGenD2"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~kununu-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-kununu-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/memo23~kununu-scraper/runs": {
      "post": {
        "operationId": "runs-sync-memo23-kununu-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/memo23~kununu-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-kununu-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "companyNames": {
            "title": "🏢 Company names",
            "type": "array",
            "description": "Plain company names to look up (e.g. ['Bosch', 'SAP']). Each is resolved straight to its kununu profile, so you do not need to know the URL slug. This is the main way to feed the actor.",
            "items": {
              "type": "string"
            }
          },
          "query": {
            "title": "🔍 Employer search term",
            "type": "string",
            "description": "Search kununu's employer directory (e.g. 'software', 'Bosch', 'Krankenhaus'). Returns up to ~15 top matches, each as one company row. Leave blank if you are using company names, job search, or start URLs."
          },
          "industryId": {
            "title": "Industry filter (search only)",
            "type": "string",
            "description": "Narrow the employer search to one kununu industry. Only applies when a search term is set. Common ids: 1=Banking, 2=Construction, 3=Consulting, 4=Education, 5=Publishing, 6=Finance, 7=Healthcare, 8=Insurance, 9=Pharma, 10=IT/Software, 11=Engineering, 12=Automotive, 13=Chemicals, 14=Transport, 15=Retail, 16=Telecom, 17=Energy, 18=Media, 19=Public sector, 20=NGO, 43=Hotels, 44=Gastronomy. Other ids are in the industry= parameter on kununu.com/de/search."
          },
          "startUrls": {
            "title": "🔗 Start URLs",
            "type": "array",
            "description": "Paste kununu company profile URLs (https://www.kununu.com/de/bosch-gruppe). Country is read from each URL, so DE/AT/CH can be mixed in one run. Search and job-search URLs are accepted but currently blocked by kununu.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "countryCode": {
            "title": "🌍 Country",
            "enum": [
              "de",
              "at",
              "ch"
            ],
            "type": "string",
            "description": "Which kununu country site to search. Applies to searches and company-name lookups; pasted URLs keep their own country.",
            "default": "de"
          },
          "maxItems": {
            "title": "💯 Max results",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on rows written to the dataset — companies, reviews and jobs all count. This is your main cost control, since billing is per row.",
            "default": 100
          },
          "includeReviews": {
            "title": "⭐ Include employee reviews",
            "type": "boolean",
            "description": "Also scrape each employer's individual employee reviews. Every review becomes its own row with title, rating, department, pros, cons, suggestions and the per-category comments.",
            "default": false
          },
          "maxReviewsPerCompany": {
            "title": "Max employee reviews per company",
            "minimum": 0,
            "type": "integer",
            "description": "How many employee reviews to pull per employer (10 per page fetched). Large employers have thousands, so keep this bounded.",
            "default": 50
          },
          "includeApplicantReviews": {
            "title": "🎤 Include applicant (interview) reviews",
            "type": "boolean",
            "description": "Also scrape interview reviews: the outcome (offer / rejection), the year applied, and the interview questions candidates recalled being asked. Each becomes its own row.",
            "default": false
          },
          "maxApplicantReviewsPerCompany": {
            "title": "Max applicant reviews per company",
            "minimum": 0,
            "type": "integer",
            "description": "How many applicant reviews to pull per employer (10 per page fetched).",
            "default": 50
          },
          "includeSalaries": {
            "title": "💶 Include salary ranges",
            "type": "boolean",
            "description": "Add the employer's salary table — median pay and range per job title, with the sample size behind each figure. Uses the ranges on the profile summary (usually the top few titles).",
            "default": false
          },
          "includeFullSalary": {
            "title": "Include full salary table",
            "type": "boolean",
            "description": "Fetch the /gehalt table so you get every published job title (around 20) instead of the few shown on the profile. One extra request per employer. Turns on salary ranges automatically. Billed as additional data only when the longer table is actually returned.",
            "default": false
          },
          "includeRatingBuckets": {
            "title": "Include rating distribution buckets",
            "type": "boolean",
            "description": "Add star-rating buckets (excellent 4–5★, good 3–4★, satisfactory 2–3★, subpar 1–2★) with counts and percentages for employee and applicant reviews. Also keeps isClaimed / isTopCompanyPaid / employee vs candidate review counts that are already on the profile. Billed as additional data only when a distribution is found.",
            "default": false
          },
          "includeRichContent": {
            "title": "Include rich content (narratives, galleries, job Q&A)",
            "type": "boolean",
            "description": "Add the richContent block: slogan, narrative HTML (whatIsSpecial, benefitsStatement, whoWeAre, whoWeAreLookingFor, legalInformation), image/video galleries, and jobInsights Q&A. HTML is stored as the employer submitted it — sanitise before rendering. Can multiply payload size. Billed as additional data only when any of those fields are present.",
            "default": false
          },
          "includeCulture": {
            "title": "🧭 Include Kulturkompass",
            "type": "boolean",
            "description": "Add kununu's Kulturkompass — modern vs traditional for the employer and its industry, the 0-200 compass scores, and how many submissions it is based on. Billed as additional data.",
            "default": false
          },
          "includeJobs": {
            "title": "💼 Include the employer's job postings",
            "type": "boolean",
            "description": "Also scrape each employer's open jobs. Every job becomes its own row with title, location, contract type, posting date and salary range — plus the employer's kununu score. This is the reliable way to get kununu jobs; the keyword job search below is currently blocked by kununu.",
            "default": false
          },
          "maxJobsPerCompany": {
            "title": "Max jobs per company",
            "minimum": 0,
            "type": "integer",
            "description": "How many job postings to pull per employer (20 per page fetched). Large employers can have well over a thousand open roles.",
            "default": 50
          },
          "enrichEmails": {
            "title": "📧 Find employer contact emails",
            "type": "boolean",
            "description": "Discover the employer's own website and harvest a contact email from it. Billed as additional data, and only when an email is actually found.",
            "default": false
          },
          "includeContactData": {
            "title": "Include extracted emails & phones",
            "type": "boolean",
            "description": "Keep emails and phone numbers found in page text. Turn off to comply with stricter PII policies — those fields are then returned empty.",
            "default": true
          },
          "compact": {
            "title": "📦 Compact output",
            "type": "boolean",
            "description": "Return only the core fields per row. Smaller payloads for AI agents and dashboards.",
            "default": false
          },
          "flatten": {
            "title": "Flatten nested fields",
            "type": "boolean",
            "description": "Flatten nested objects into top-level keys so CSV exports stay readable.",
            "default": true
          },
          "incrementalMode": {
            "title": "♻️ Incremental mode",
            "type": "boolean",
            "description": "Track state across runs and emit only what changed — new jobs, new reviews, employers whose score or review count moved. Unchanged rows are dropped before they cost anything.",
            "default": false
          },
          "stateKey": {
            "title": "🔑 State key",
            "type": "string",
            "description": "Names the saved baseline for incremental mode (e.g. 'dach-employers-v1'). Use a different key per monitoring job."
          },
          "telegramToken": {
            "title": "Telegram bot token",
            "type": "string",
            "description": "Your own Telegram bot token from @BotFather, to receive a summary when a run finishes."
          },
          "telegramChatId": {
            "title": "Telegram chat ID",
            "type": "string",
            "description": "Chat or channel id the summary is sent to (e.g. -100123456789). Required when a Telegram token is set."
          },
          "slackWebhookUrl": {
            "title": "Slack webhook URL",
            "type": "string",
            "description": "Slack incoming webhook to post the run summary to."
          },
          "discordWebhookUrl": {
            "title": "Discord webhook URL",
            "type": "string",
            "description": "Discord incoming webhook to post the run summary to."
          },
          "webhookUrl": {
            "title": "Generic webhook URL",
            "type": "string",
            "description": "Receives a JSON POST with the run metadata and rows — for n8n, Make, Zapier or your own backend."
          },
          "webhookHeaders": {
            "title": "Webhook headers",
            "type": "object",
            "description": "Optional headers for the generic webhook, e.g. {\"Authorization\": \"Bearer ...\"}."
          },
          "notificationLimit": {
            "title": "Max rows per notification",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many rows to list inside each notification message.",
            "default": 10
          },
          "notifyOnlyChanges": {
            "title": "Notify only on new or updated rows",
            "type": "boolean",
            "description": "With incremental mode on, stay silent when a run finds nothing new.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "How many pages to fetch in parallel. Lower this if you hit rate limits.",
            "default": 8
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy used to reach kununu. Residential proxies are strongly recommended — kununu challenges datacenter IPs.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}