# Kaufland.de Scraper - Marketplace Price, Deals & Reviews (`abotapi/kaufland-de-scraper`) Actor

Scrape Kaufland.de, Germany's hypermarket and online marketplace: keyword/category/brand search or paste links. Current price, UVP was-price and discount on Angebote deals, grocery unit price, brand, breadcrumb path, EAN, marketplace seller, variant matrix, per-category specs, and native reviews.

- **URL**: https://apify.com/abotapi/kaufland-de-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 product results

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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## Kaufland.de Scraper

Pull rich product data from Kaufland.de, Germany's hypermarket and online marketplace. Search by keyword, category, and brand with real site filters, browse Kaufland's own Angebote (deals) collection, or paste product, category, and search links directly. Every record includes current price, the strike-through UVP original price with computed discount when an item is a deal, grocery unit price (EUR per kg/l), and a full native customer review history.

### Why This Scraper?

- **UVP was-price and discount, structured from the real deals facet.** When a product is reduced against its manufacturer's recommended price (UVP), both the current price and the strike-through original price come back, plus the computed discount amount and percentage, never fabricated.
- **A dedicated deals mode.** `specialsOnly` maps to Kaufland's own Angebote facet, store-wide or scoped to a keyword/category.
- **Grocery unit pricing.** EUR per kg/l/100ml comes back structured, not buried in a price string, matching German price-per-unit disclosure rules.
- **Marketplace-aware.** Kaufland.de is a multi-seller marketplace: every record includes the selling partner (name, id, return period), plus the number of competing offers on the same listing.
- **Rich product identity.** Brand/manufacturer, full breadcrumb category path, EAN/GTIN, manufacturer part number, and flattened per-category technical specifications (varies per product type, never hardcoded to one vertical).
- **Per-variant matrix.** Size/colour/pack siblings of the same listing come back as a linked matrix when the product has them.
- **Complete native review history.** Overall rating, review count, and every individual review with author, date, rating, title, and body text, Kaufland's own reviews, no third-party vendor.
- **Two ways in.** Keyword search with real filters (brand, price range, deals, sort), or paste any product/category/search URL and let pagination continue automatically.
- **Optional export to your apps.** Send results into Notion, Linear, Airtable, or any Apify MCP connector alongside the dataset.

### Data You Get

| Field | Example value |
|---|---|
| productId | `500000001` |
| title | `Sample Coffee Machine, 1200W, Black` |
| url | `https://www.kaufland.de/product/500000001/` |
| price / currency | `54.95`, `EUR` |
| originalPrice | `79.90` |
| discountAmount / discountPercent | `24.95`, `31.2` |
| isOnSpecial | `true` |
| promoLabel | `Hammer-Preis` |
| unitPrice | `{"value": 54.95, "unit": "1kg"}` |
| seller | `Sample-Handel` |
| rating / reviewCount | `4.7`, `331` |
| image | `https://media.cdn.kaufland.de/product-images/400x400/sample.webp` |
| brand *(fetchDetails)* | `Sample Brand` |
| breadcrumb *(fetchDetails)* | `["Startseite", "Küche & Haushalt", "Haushaltsgeräte", "Kaffeevollautomaten"]` |
| ean / gtin *(fetchDetails)* | `4000000000001` |
| specifications *(fetchDetails)* | `{"Gewicht": "3.5 kg", "Lautstärke": "65 dB", "Fernbedienung": "Ja"}` |
| variants *(fetchDetails)* | `[{"title": "Schwarz", "url": "https://..."}, {"title": "Weiß", "url": "https://..."}]` |
| seller *(fetchDetails)* | `{"name": "Sample-Handel", "id": "90000001", "returnPeriod": "P14D"}` |
| otherOffersInfo *(fetchDetails)* | `{"totalNewOffers": 5, "totalUsedOffers": 3, "lowestPrice": 49.99}` |
| reviews.averageRating / reviews.totalReviewCount | `4.7`, `331` |
| reviews.items[] | `[{"reviewId": 7000001, "author": "hm-1234567890", "rating": 5, "date": "23.06.2026", "title": "Sample review title", "body": "Sample review text.", "isVerifiedPurchase": true}]` |

> Sample shape: values above are illustrative placeholders, not from a live product.

#### Deals, UVP was-price & discount

Kaufland's deals surface is a single real facet, **Angebote** (all_deals), not a multi-tier promo taxonomy. `specialsOnly: true` scrapes that facet directly (store-wide, or scoped to a keyword/category). On any item genuinely reduced against its UVP (manufacturer's recommended price), `originalPrice`/`discountAmount`/`discountPercent` are populated straight from the site's own strike-through price; on a full-price item they are `null`, never fabricated. Separately, some listings also carry a voucher-style coupon discount (`voucher`, *fetchDetails*), which is independent of the UVP comparison.

### How to Use

**Basic keyword search**

```json
{
  "mode": "search",
  "searchTerm": "kaffee",
  "maxItems": 20
}
````

**Search narrowed by category, brand and price, with deals**

```json
{
  "mode": "search",
  "searchTerm": "kaffee",
  "category": "5921",
  "brand": "Melitta",
  "minPrice": 5,
  "maxPrice": 40,
  "specialsOnly": true,
  "sortBy": "price-asc",
  "maxItems": 30
}
```

**Category browse with full detail and review enrichment**

```json
{
  "mode": "search",
  "category": "31851",
  "fetchDetails": true,
  "fetchReviews": true,
  "maxReviewsPerProduct": 0,
  "maxItems": 50
}
```

**Paste product, category, or search links**

```json
{
  "mode": "url",
  "urls": [
    "https://www.kaufland.de/product/496448760/",
    "https://www.kaufland.de/c/klimaanlagen/~31851/",
    "https://www.kaufland.de/s/?search_value=kaffee&all_deals=true"
  ],
  "maxItems": 40
}
```

### Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` (keyword/category with filters) or `url` (paste links). |
| `searchTerm` | string | - | Free-text keyword for search mode. |
| `category` | string | - | A category id, e.g. `31851`. Narrows a keyword search or browses a whole category alone. |
| `brand` | string | - | Only this brand/manufacturer, matched against Kaufland's own brand filter for the search. |
| `specialsOnly` | boolean | `false` | Only Angebote (deals) items, UVP strike-through price + discount, voucher/best-price badges. |
| `minPrice` / `maxPrice` | integer | - | Price range in EUR. |
| `sortBy` | string | `natural` | `natural` (recommended), `price-asc`/`price-desc`, `customer-reviews`, `newest-arrivals`, `bestsellers`. |
| `urls` | array | sample URL | Product, category, or search links for URL mode. |
| `fetchDetails` | boolean | `false` | Adds brand, breadcrumb path, EAN/GTIN, part number, flattened specifications, energy label, media gallery, variant matrix, and marketplace seller detail. |
| `fetchReviews` | boolean | `false` | Fetches each product's full native review history when enabled. |
| `maxReviewsPerProduct` | integer | `20` | Cap on reviews per product; `0` = all. |
| `maxPages` | integer | unlimited | Cap on result pages per search/URL entry. |
| `maxItems` | integer | `20` | Cap on total products; `0` = unlimited. |
| `proxy` | object | Residential (DE) | Connection configuration; a German residential connection is required and preset. |
| `mcpConnectors` | array | `[]` | Optional MCP connectors to also receive results. |
| `notionParentPageUrl` | string | - | Required only when a Notion connector is selected. |
| `maxNotifyListings` | integer | `50` | Cap on items sent to each connector. |

### Output Example

```json
{
  "productId": "500000001",
  "title": "Sample Coffee Machine, 1200W, Black",
  "url": "https://www.kaufland.de/product/500000001/",
  "image": "https://media.cdn.kaufland.de/product-images/400x400/sample.webp",
  "price": 54.95,
  "currency": "EUR",
  "originalPrice": 79.90,
  "discountAmount": 24.95,
  "discountPercent": 31.2,
  "isOnSpecial": true,
  "unitPrice": { "value": 54.95, "unit": "1kg" },
  "seller": "Sample-Handel",
  "rating": 4.7,
  "reviewCount": 331,
  "brand": "Sample Brand",
  "breadcrumb": ["Startseite", "Küche & Haushalt", "Haushaltsgeräte", "Kaffeevollautomaten"],
  "ean": "4000000000001",
  "gtin": "4000000000001",
  "specifications": {
    "Gewicht": "3.5 kg",
    "Lautstärke": "65 dB",
    "Fernbedienung": "Ja"
  },
  "reviews": {
    "averageRating": 4.7,
    "totalReviewCount": 331,
    "items": [
      {
        "reviewId": 7000001,
        "author": "hm-1234567890",
        "rating": 5,
        "date": "23.06.2026",
        "title": "Sample review title",
        "body": "Sample review text describing the purchase experience.",
        "isVerifiedPurchase": true
      }
    ]
  }
}
```

### Send results into your apps (MCP connectors)

Optionally pipe results into an app you already use through a Model Context Protocol connector. Authorize a connector once under your account's Integrations settings, then select it in the input; for Notion, also set the parent page. Each connector receives a condensed, human-readable summary per item (a title plus key fields), not the full JSON record; the complete data always stays in the dataset.

### A Note on Access

Kaufland.de is reachable only over a residential connection, which this actor selects by default (Germany). Because a residential connection is a paid Apify feature, running this actor requires a paid Apify plan; free-tier runs cannot reach the site.

# Actor input Schema

## `mode` (type: `string`):

'search' finds products by keyword and/or category with Kaufland's own filters, including Angebote/deals items. 'url' scrapes any product, category, or search-result page URL you paste, walking pagination forward automatically.

## `searchTerm` (type: `string`):

Free-text keyword, e.g. 'kaffee' or 'klimaanlage'. Combine with Category below to narrow, or leave empty and set only Category (and/or Specials only) to browse a whole department.

## `category` (type: `string`):

A Kaufland category id, e.g. '31851' (Klimaanlagen). Find it as the trailing number in a category page URL: kaufland.de/c/<name>/~<id>/. Narrows a keyword search, or browses the whole category when Search keyword is left empty.

## `brand` (type: `string`):

Only return products from this brand, e.g. 'Jacobs' or 'Bosch'. Matched against Kaufland's own brand filter for this search (exact match preferred, falls back to a partial match); ignored if the brand has no matching results for this search/category.

## `specialsOnly` (type: `boolean`):

Only return items currently in Kaufland's own deals facet (Angebote) -- vouchers, best-price badges, and UVP strike-through discounts. Combine with a keyword and/or category, or leave those empty to browse all current deals.

## `minPrice` (type: `integer`):

Only return products priced at or above this amount.

## `maxPrice` (type: `integer`):

Only return products priced at or below this amount.

## `sortBy` (type: `string`):

Order of the returned results.

## `urls` (type: `array`):

Paste one or more Kaufland product pages (/product/<id>/), category pages (/c/<name>/~<id>/), or search-result pages (/s/?search\_value=<term>). Pagination continues forward automatically from any page number already in the URL. Filter fields above are ignored in this mode.

## `fetchDetails` (type: `boolean`):

Adds brand, full breadcrumb category path, EAN/GTIN, manufacturer part number, flattened technical specifications (varies per category), energy label, media gallery, per-variant matrix, marketplace seller detail, and competing-offer count. Current price, UVP was-price/discount, grocery unit price, and rating are already included without this toggle on search/category results.

## `fetchReviews` (type: `boolean`):

Fetch each product's full native review history: overall rating, review count, and per-review author/date/rating/title/body. Products with no reviews simply return an empty list.

## `maxReviewsPerProduct` (type: `integer`):

Cap on reviews kept per product when 'Fetch reviews' is on. 0 = all available reviews.

## `maxPages` (type: `integer`):

Stop after this many result pages per search/category/URL entry. Leave empty for as many pages as needed (bounded by Max products total).

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

Hard cap on total products returned across every search/category/URL entry. 0 = unlimited (still bounded by Max pages per search).

## `proxy` (type: `object`):

Kaufland.de requires a residential connection, which is selected by default (Germany). Residential proxy is a paid Apify feature, so this Actor needs a paid Apify plan; free-tier runs cannot reach this site.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify -> Settings -> Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerm": "kaffee",
  "specialsOnly": false,
  "sortBy": "natural",
  "urls": [
    "https://www.kaufland.de/s/?search_value=kaffee"
  ],
  "fetchDetails": false,
  "fetchReviews": false,
  "maxReviewsPerProduct": 20,
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  },
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (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 = {
    "mode": "search",
    "searchTerm": "kaffee",
    "urls": [
        "https://www.kaufland.de/s/?search_value=kaffee"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/kaufland-de-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 = {
    "mode": "search",
    "searchTerm": "kaffee",
    "urls": ["https://www.kaufland.de/s/?search_value=kaffee"],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/kaufland-de-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "search",
  "searchTerm": "kaffee",
  "urls": [
    "https://www.kaufland.de/s/?search_value=kaffee"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call abotapi/kaufland-de-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=abotapi/kaufland-de-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Kaufland.de Scraper - Marketplace Price, Deals & Reviews",
        "description": "Scrape Kaufland.de, Germany's hypermarket and online marketplace: keyword/category/brand search or paste links. Current price, UVP was-price and discount on Angebote deals, grocery unit price, brand, breadcrumb path, EAN, marketplace seller, variant matrix, per-category specs, and native reviews.",
        "version": "1.1",
        "x-build-id": "bwunxjBgeNOy6w2uf"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/abotapi~kaufland-de-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-abotapi-kaufland-de-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/abotapi~kaufland-de-scraper/runs": {
            "post": {
                "operationId": "runs-sync-abotapi-kaufland-de-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/abotapi~kaufland-de-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-abotapi-kaufland-de-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",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "url"
                        ],
                        "type": "string",
                        "description": "'search' finds products by keyword and/or category with Kaufland's own filters, including Angebote/deals items. 'url' scrapes any product, category, or search-result page URL you paste, walking pagination forward automatically.",
                        "default": "search"
                    },
                    "searchTerm": {
                        "title": "Search keyword",
                        "type": "string",
                        "description": "Free-text keyword, e.g. 'kaffee' or 'klimaanlage'. Combine with Category below to narrow, or leave empty and set only Category (and/or Specials only) to browse a whole department."
                    },
                    "category": {
                        "title": "Category ID (optional)",
                        "type": "string",
                        "description": "A Kaufland category id, e.g. '31851' (Klimaanlagen). Find it as the trailing number in a category page URL: kaufland.de/c/<name>/~<id>/. Narrows a keyword search, or browses the whole category when Search keyword is left empty."
                    },
                    "brand": {
                        "title": "Brand / manufacturer (optional)",
                        "type": "string",
                        "description": "Only return products from this brand, e.g. 'Jacobs' or 'Bosch'. Matched against Kaufland's own brand filter for this search (exact match preferred, falls back to a partial match); ignored if the brand has no matching results for this search/category."
                    },
                    "specialsOnly": {
                        "title": "Specials only (Angebote / deals)",
                        "type": "boolean",
                        "description": "Only return items currently in Kaufland's own deals facet (Angebote) -- vouchers, best-price badges, and UVP strike-through discounts. Combine with a keyword and/or category, or leave those empty to browse all current deals.",
                        "default": false
                    },
                    "minPrice": {
                        "title": "Minimum price (EUR)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only return products priced at or above this amount."
                    },
                    "maxPrice": {
                        "title": "Maximum price (EUR)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only return products priced at or below this amount."
                    },
                    "sortBy": {
                        "title": "Sort order",
                        "enum": [
                            "natural",
                            "price-asc",
                            "price-desc",
                            "customer-reviews",
                            "newest-arrivals",
                            "bestsellers"
                        ],
                        "type": "string",
                        "description": "Order of the returned results.",
                        "default": "natural"
                    },
                    "urls": {
                        "title": "URLs to scrape",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Paste one or more Kaufland product pages (/product/<id>/), category pages (/c/<name>/~<id>/), or search-result pages (/s/?search_value=<term>). Pagination continues forward automatically from any page number already in the URL. Filter fields above are ignored in this mode.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "fetchDetails": {
                        "title": "Fetch full product detail",
                        "type": "boolean",
                        "description": "Adds brand, full breadcrumb category path, EAN/GTIN, manufacturer part number, flattened technical specifications (varies per category), energy label, media gallery, per-variant matrix, marketplace seller detail, and competing-offer count. Current price, UVP was-price/discount, grocery unit price, and rating are already included without this toggle on search/category results.",
                        "default": false
                    },
                    "fetchReviews": {
                        "title": "Fetch reviews",
                        "type": "boolean",
                        "description": "Fetch each product's full native review history: overall rating, review count, and per-review author/date/rating/title/body. Products with no reviews simply return an empty list.",
                        "default": false
                    },
                    "maxReviewsPerProduct": {
                        "title": "Max reviews per product",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Cap on reviews kept per product when 'Fetch reviews' is on. 0 = all available reviews.",
                        "default": 20
                    },
                    "maxPages": {
                        "title": "Max pages per search",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Stop after this many result pages per search/category/URL entry. Leave empty for as many pages as needed (bounded by Max products total)."
                    },
                    "maxItems": {
                        "title": "Max products total",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Hard cap on total products returned across every search/category/URL entry. 0 = unlimited (still bounded by Max pages per search).",
                        "default": 20
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Kaufland.de requires a residential connection, which is selected by default (Germany). Residential proxy is a paid Apify feature, so this Actor needs a paid Apify plan; free-tier runs cannot reach this site.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "DE"
                        }
                    },
                    "mcpConnectors": {
                        "title": "Pipe results into your apps (optional)",
                        "type": "array",
                        "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify -> Settings -> Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
                    },
                    "notionParentPageUrl": {
                        "title": "Notion parent page (Notion connector only)",
                        "type": "string",
                        "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
                    },
                    "maxNotifyListings": {
                        "title": "Max items to export per connector",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Cap on items written to each connector per run. Does not affect the dataset.",
                        "default": 50
                    }
                }
            },
            "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
                                    }
                                }
                            },
                            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
