# MediaMarkt.de Scraper - Prices, Offers & Reviews (`abotapi/mediamarkt-de-scraper`) Actor

Scrape MediaMarkt Germany (mediamarkt.de) products: current price, strike-through original price + discount on offers, brand, EAN, category path, availability, image gallery, full spec sheet, other-seller offers, and reviews with ratings. Search keywords or paste links.

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

## Pricing

from $1.00 / 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.

- **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

## MediaMarkt.de Product Scraper

Pull rich product data from MediaMarkt Germany (mediamarkt.de), one of Germany's largest electronics retailers. Search by keyword and/or category with the site's own brand, price-range, and rating filters and native sort, or paste product, category, or search listing links directly. Every record includes the current price, and when a product genuinely carries a reduced original price, the strike-through price plus the computed discount amount and percentage.

### Why This Scraper?

- **Was-price and discount, gated on the site's own signal, never guessed.** When a product carries a struck-through original price, both prices are captured plus the discount amount and percentage. A full-price product simply carries `originalPrice: null` -- nothing is fabricated.
- **Real customer reviews.** Average rating, total review count, and each product's most recent reviews with rating, title, full text, date, and verified-purchaser flag.
- **Full spec sheet on demand.** The flattened characteristics MediaMarkt itself shows per product -- RAM/CPU/display for a laptop, panel type/resolution for a TV, and so on -- never hardcoded to one category's fields.
- **Marketplace-aware.** Distinguishes MediaMarkt's own retail offers from third-party marketplace sellers, including seller name and rating when a listing is a marketplace offer.
- **Real site filters.** Brand, price range, minimum rating, and MediaMarkt's own sort order (price, rating, topseller, newest, availability) -- all verified live against the site's own controls, not guessed query parameters.
- **Two ways in.** Keyword and/or category search, or paste any product/category/listing link and continue pagination 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 / sku | `2986202` |
| ean | `0198990974613` |
| name | `Sample Notebook 16 Zoll` |
| brand | `Sample Brand` |
| category / categoryPath | `16 Zoll Laptops`, `["Computer & Büro", "Laptops & Notebooks", "16 Zoll Laptops"]` |
| url | `https://www.mediamarkt.de/de/product/_sample-notebook-2986202.html` |
| price / currency | `749`, `EUR` |
| originalPrice / discountAmount / discountPercent | `1199`, `450`, `37` |
| isOnSpecial / strikePriceType | `true`, `RRP` |
| onlineAvailable / availabilityStatus | `true`, `ONLINE` |
| isMarketplace / marketplaceSeller | `false`, `{"sellerId": "...", "sellerName": "Sample Seller", "sellerRating": 4.4}` |
| image / images | `["https://assets.mmsrg.com/isr/.../ASSET_SAMPLE"]` |
| specs | `{"Bildschirmdiagonale": "16 Zoll", "Arbeitsspeicher (RAM)": "16 GB"}` (flattened, varies per category) |
| delivery / pickup | `{"status": "AVAILABLE", ...}`, `{"status": "AVAILABLE", "isPickable": true}` |
| otherOffers | other sellers' offers for the same product, when present |
| rating / reviewCount | `4.3`, `155` |
| reviews.averageRating / reviews.totalReviewCount | `4.3`, `155` |
| reviews.items\[] | `[{"rating": 5, "title": "Sample title", "text": "Sample review text.", "reviewerName": "Sample User", "date": "2026-07-01T21:49:37.000Z", "isVerifiedPurchaser": true}]` |

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

### How to Use

**1. Keyword search, first page, with reviews (default):**

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

**2. Category browse, filtered to a brand and price range, sorted by price:**

```json
{
  "mode": "search",
  "categoryId": "362",
  "brands": ["ASUS"],
  "minPrice": 300,
  "maxPrice": 900,
  "sortBy": "PRICE_ASC",
  "maxItems": 50,
  "maxPages": 5
}
```

**3. Full product detail + reviews for pasted product links:**

```json
{
  "mode": "url",
  "urls": ["https://www.mediamarkt.de/de/product/_sample-notebook-2986202.html"],
  "fetchDetails": true,
  "fetchReviews": true,
  "maxReviewsPerProduct": 10
}
```

**4. Paste a listing link and keep paginating forward:**

```json
{
  "mode": "url",
  "urls": ["https://www.mediamarkt.de/de/search.html?query=kaffeemaschine"],
  "maxItems": 100,
  "maxPages": 10
}
```

**5. Continue a previous run, collecting only new products:**

```json
{
  "mode": "search",
  "categoryId": "362",
  "resumeFromRunId": "<a previous run id or dataset id>"
}
```

### Input Parameters

| Parameter | Type | Description |
|---|---|---|
| `mode` | string | `search` or `url`. |
| `searchTerm` | string | Free-text keyword (search mode only). |
| `categoryId` | string | Numeric MediaMarkt category id, from a category URL like `.../laptops-notebooks-362.html` -> `362` (search mode only). |
| `brands` | array | Exact brand names to keep (search mode only). |
| `minRating` | integer | 1-5, minimum rating to keep (search mode only). |
| `minPrice` / `maxPrice` | number | EUR price band to keep (search mode only). |
| `sortBy` | string | `RELEVANCE`, `PRICE_ASC`, `PRICE_DESC`, `RATING`, `TOPSELLER`, `NEWEST`, or `AVAILABILITY` (search mode only). |
| `urls` | array | Product, category, or listing URLs to scrape (url mode only). |
| `fetchDetails` | boolean | Fetch full spec sheet, delivery/pickup detail, energy label, badges, and marketplace offers. |
| `fetchReviews` | boolean | Fetch review summary and the product's most recent reviews. |
| `maxReviewsPerProduct` | integer | Cap on reviews per product; `0` = all available on that page. |
| `maxPages` | integer | Cap on result pages per search/category/URL entry; `0` (default) = unlimited, walk every page until the site stops returning new products or Max products total is hit. |
| `maxItems` | integer | Cap on total products returned; `0` = unlimited. |
| `resumeFromRunId` | string | Optional: a previous run id (or its dataset id). Products it already collected are skipped, so this run returns only new products (a delta). Leave empty for a normal run. |
| `proxy` | object | Apify proxy configuration. A residential connection is required for a reliable run (see below). |
| `mcpConnectors` | array | Optional MCP connectors to export results into (Notion, Linear, Airtable, Apify). |
| `notionParentPageUrl` | string | Notion connector only: page under which item pages are created. |
| `maxNotifyListings` | integer | Cap on items exported to each connector per run. Does not affect the dataset. |

### Output Example

```json
{
  "productId": "2986202",
  "sku": "2986202",
  "ean": "0198990974613",
  "name": "Sample Notebook 16 Zoll",
  "brand": "Sample Brand",
  "category": "16 Zoll Laptops",
  "categoryPath": ["Computer & Büro", "Laptops & Notebooks", "16 Zoll Laptops"],
  "url": "https://www.mediamarkt.de/de/product/_sample-notebook-2986202.html",
  "price": 749,
  "currency": "EUR",
  "originalPrice": 1199,
  "discountAmount": 450,
  "discountPercent": 37,
  "isOnSpecial": true,
  "strikePriceType": "RRP",
  "onlineAvailable": true,
  "availabilityStatus": "ONLINE",
  "isMarketplace": false,
  "image": "https://assets.mmsrg.com/isr/166325/c1/-/ASSET_SAMPLE",
  "images": ["https://assets.mmsrg.com/isr/166325/c1/-/ASSET_SAMPLE"],
  "rating": 4.3,
  "reviewCount": 155,
  "reviews": {
    "averageRating": 4.3,
    "totalReviewCount": 155,
    "items": [
      {
        "rating": 5,
        "title": "Sample title",
        "text": "Sample review text.",
        "reviewerName": "Sample User",
        "date": "2026-07-01T21:49:37.000Z",
        "isVerifiedPurchaser": true
      }
    ]
  }
}
```

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

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

Optionally pipe results into the apps you already use through Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, Integrations, then select it in the `mcpConnectors` field. Each connector receives a condensed, human-readable summary per product (name plus key fields), while the complete record always stays in the Apify dataset. For Notion, set `notionParentPageUrl` to the page the item pages should be created under, and use `maxNotifyListings` to cap how many items are exported per connector per run. Supported connectors: Notion, Linear, Airtable, and Apify. Leave the field empty to skip; it never changes the dataset output.

### A note on plans

mediamarkt.de requires a **residential** connection for a reliable run -- a datacenter or free-tier connection will very likely fail. The default proxy configuration already selects a residential connection in Germany; no extra setup is needed on any paid plan with residential proxy access.

# Actor input Schema

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

'search' finds products by keyword and/or a MediaMarkt category id, with the site's own brand/price filters and native sort. 'url' scrapes any product, category, or search listing page URL you paste, walking pagination forward automatically.

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

Free-text keyword, e.g. 'notebook' or 'kaffeemaschine'. Leave empty if you set a Category id below.

## `categoryId` (type: `string`):

The numeric id from a MediaMarkt category URL, e.g. mediamarkt.de/de/category/laptops-notebooks-362.html -> 362. Combine with a keyword to search within a category, or leave the keyword empty to browse the whole category.

## `brands` (type: `array`):

Only return products from these brands, e.g. 'APPLE', 'LENOVO', 'ASUS', 'HP'. Match the exact brand name as shown on the site. Leave empty for all brands.

## `minRating` (type: `integer`):

Only return products rated at or above this many stars, 1-5.

## `minPrice` (type: `number`):

Only return products priced at or above this amount, in euros.

## `maxPrice` (type: `number`):

Only return products priced at or below this amount, in euros.

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

MediaMarkt's own sort order, verified live by driving the site's sort dropdown -- reorders the full server-side result set, so it stays correct across pagination.

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

Paste one or more MediaMarkt product pages (.../product/\_<slug>-<id>.html), category pages (.../category/<slug>-<id>.html), or search listing pages (.../search.html?query=...). Pagination continues forward automatically from any ?page= already in the URL. Filter fields above are ignored in this mode.

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

Adds the full flattened spec sheet (varies per category -- RAM/CPU for a laptop, panel type for a TV), delivery/pickup availability detail, energy efficiency label, promo badges, and marketplace/other-seller offers from the product page. Current price, was-price/discount, rating and main image are already included without this toggle.

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

Fetch each product's review summary (average rating, total count) and its most recent reviews (rating, title, text, date, verified-purchaser flag). MediaMarkt renders its newest review page server-side; it does not expose a plain paginated route for a product's entire review history, so this returns that first page, capped by 'Max reviews per product'. Products with no reviews simply return an empty list.

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

Cap on reviews returned per product when 'Fetch reviews' is on (bounded by what the site's own product page renders, currently up to about 10). 0 = all available on that page.

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

Stop after this many result pages per search/category/URL entry. 0 = unlimited -- walk every page until the site stops returning new products or Max products total is hit.

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

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

## `resumeFromRunId` (type: `string`):

Paste a previous run id (or its dataset id) to continue that run: products already collected there are skipped, so this run only returns new products (a delta). Leave empty for a normal run.

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

A residential connection is required for a reliable run on this site. The default below already selects a residential connection in Germany.

## `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": "notebook",
  "brands": [],
  "sortBy": "RELEVANCE",
  "urls": [
    "https://www.mediamarkt.de/de/search.html?query=notebook"
  ],
  "fetchDetails": false,
  "fetchReviews": true,
  "maxReviewsPerProduct": 10,
  "maxPages": 0,
  "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": "notebook",
    "brands": [],
    "urls": [
        "https://www.mediamarkt.de/de/search.html?query=notebook"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    }
};

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

# Run the Actor and wait for it to finish
run = client.actor("abotapi/mediamarkt-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": "notebook",
  "brands": [],
  "urls": [
    "https://www.mediamarkt.de/de/search.html?query=notebook"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call abotapi/mediamarkt-de-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/SaHHFlsI2gHMzqohE/builds/v4NSCr81m27A7XQdD/openapi.json
