# MediaMarkt Germany Product Scraper (`datascrapers/mediamarkt-de-scraper`) Actor

Scrape MediaMarkt.de products from search queries or URLs, with optional product details and customer reviews.

- **URL**: https://apify.com/datascrapers/mediamarkt-de-scraper.md
- **Developed by:** [Data Scrapers](https://apify.com/datascrapers) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 product scrapeds

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**MediaMarkt Germany Product Scraper** creates a structured dataset of products collected from MediaMarkt.de. Each dataset item can include the product id, name, brand, EAN, price, currency, rating, review count, stock flag, category, and source query. Query the source with a search phrase or a MediaMarkt search or product URL. Control the result limit with `maxItems`, and optionally request product details or customer reviews. Retrieve records through the Apify Dataset API or export them as JSON, CSV, Excel, XML, or another supported format.

[![MediaMarkt Germany Product Scraper — search to product rows](https://raw.githubusercontent.com/faizanalii/apify-actor-assets/main/mediamarkt-de-scraper/mediamarkt-de-scraper-value-demo.gif)](https://apify.com/datascrapers/mediamarkt-de-scraper)

### Dataset at a glance

| Property | Value |
|---|---|
| Source | mediamarkt.de |
| Record unit | One product |
| Input methods | `searchQueries` or `startUrls` |
| Main identifiers | `productId`, `url` |
| Delivery | Apify Dataset and API |
| Export formats | JSON, CSV, Excel, XML |
| Update model | Fresh records per Actor run |
| Pricing | $1.50 per 1,000 products, detail pages, and reviews on the Free plan. Platform usage is not billed separately. |

### Coverage and available records

`searchQueries` are MediaMarkt search phrases. `startUrls` can be search result URLs or product URLs. `maxItems` of 0 does not add an item cap. `includeProductDetails` loads the product page and charges `product-details` when that payload is saved. `includeReviews` collects up to `maxReviews` reviews per product and charges `product-reviews` once per saved review. Search rows still include price, brand, stock, and rating when those values are on the search card.

Marketplace offers from sellers other than MediaMarkt, and store-level inventory by city, are not separate records. A refurbished flag is `isRefurbishedAvailable` when the page exposes it.

### Data dictionary

| Field | Type | Nullable | Description | Example |
|---|---|---:|---|---|
| productId | string | no | MediaMarkt product id. Deduplication key. | 3071596 |
| name | string | yes | Product name | APPLE AirPods 5 + wireless charging Case |
| brand | string | yes | Brand | APPLE |
| ean | string | yes | EAN | 0195951378718 |
| url | string | yes | Product page | https://www.mediamarkt.de/de/product/\_apple-airpods-5-wireless-charging-case-3071596.html |
| imageUrl | string | yes | Primary image | https://assets.mmsrg.com/isr/166325/c1/-/ASSET_MMS_183535376 |
| price | number | yes | Current price, EUR | 169 |
| originalPrice | number | yes | Price before discount | null |
| discountPercent | number | yes | Discount percent | null |
| currency | string | yes | Currency code | EUR |
| rating | number | yes | Average rating | 0.0 |
| reviewCount | number | yes | Review count on the card | 0 |
| inStock | boolean | yes | Stock flag from the card | true |
| availability | string | yes | Availability code | RELEASE_PRODUCT |
| category | string | yes | Category label | Bluetooth Kopfhörer Open Ear |
| isRefurbishedAvailable | boolean | yes | Refurbished offer exists | false |
| sourceType | string | yes | search or url | search |
| sourceQuery | string | yes | Query or URL that produced the row | AirPods |

### Example dataset record

```json
{
  "productId": "3071596",
  "name": "APPLE AirPods 5 + wireless charging Case, Open-ear Kopfhörer Bluetooth White",
  "brand": "APPLE",
  "ean": "0195951378718",
  "url": "https://www.mediamarkt.de/de/product/_apple-airpods-5-wireless-charging-case-3071596.html",
  "imageUrl": "https://assets.mmsrg.com/isr/166325/c1/-/ASSET_MMS_183535376",
  "price": 169,
  "originalPrice": null,
  "discountPercent": null,
  "currency": "EUR",
  "rating": 0.0,
  "reviewCount": 0,
  "inStock": true,
  "availability": "RELEASE_PRODUCT",
  "category": "Bluetooth Kopfhörer Open Ear",
  "isRefurbishedAvailable": false,
  "sourceType": "search",
  "sourceQuery": "AirPods"
}
```

This row came from the search query `AirPods`.

### Query and input reference

| Input | Type | Required | Default | Accepted values | Description |
|---|---|---:|---|---|---|
| searchQueries | array | no | empty | Search phrases | MediaMarkt search text. |
| startUrls | array | no | empty | Search or product URLs | Direct MediaMarkt URLs. |
| maxItems | integer | no | 0 | Integer | Maximum products saved. 0 does not add a cap. |
| includeProductDetails | boolean | no | false | true, false | Fetch product pages. Charges `product-details`. |
| includeReviews | boolean | no | false | true, false | Fetch reviews. Charges `product-reviews`. |
| maxReviews | integer | no | 10 | Integer | Reviews saved per product. |
| detailConcurrency | integer | no | 5 | Integer | Parallel detail fetches. |
| proxyConfiguration | object | no | Apify residential | Apify proxy input | Proxy used for MediaMarkt requests. |

Minimal request:

```json
{
  "searchQueries": ["AirPods"],
  "maxItems": 5
}
```

### Retrieve the data through the API

Start the Actor with JSON input, wait for the run, then read the default dataset. Other languages are on the Actor API tab.

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("datascrapers/mediamarkt-de-scraper").call(run_input={
    "searchQueries": ["AirPods"],
    "maxItems": 5,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["productId"], item.get("price"))
```

### Data quality and record handling

Use `productId` as the deduplication key. `price` is a number in euros. `originalPrice` and `discountPercent` are null when the card has no discount. Review text is attached only when `includeReviews` is on, and each saved review is its own `product-reviews` event. A product page that fails can still leave the search-card row in the dataset.

### Pricing and cost examples

| Event | Free | Bronze | Silver | Gold |
|---|---:|---:|---:|---:|
| dataset-item | $1.50 | $1.40 | $1.30 | $1.20 |
| product-details | $1.50 | $1.40 | $1.30 | $1.20 |
| product-reviews | $1.50 | $1.40 | $1.30 | $1.20 |

Prices are per 1,000 events. Platinum and Diamond use the Gold price. Platform usage is not billed on top of these events. A Free-plan run that saves 1,000 products costs $1.50. Details add $1.50 per 1,000 product pages. Reviews add $1.50 per 1,000 reviews.

### Limitations and responsible data use

MediaMarkt can change search cards, require a proxy, or omit EAN and rating on some products. Stock is the flag returned for that request, not a promise of later availability. Use the data under MediaMarkt's terms and applicable privacy rules.

### Dataset questions

#### Can I pass a product URL?

Yes. Put the product URL in `startUrls`. Search phrases are not required for that run.

#### How are reviews billed?

Each review saved while `includeReviews` is on is one `product-reviews` event, up to `maxReviews` per product.

#### Which field should I store as the key?

Store `productId`. It is the numeric id in the product URL.

### Related datasets from Data Scrapers

- [Subito.it Scraper](https://apify.com/datascrapers/subito-scraper) for Italian classified ads.
- [Cdiscount Scraper](https://apify.com/datascrapers/cdiscount) for French retail products.
- [Carrefour Scraper](https://apify.com/datascrapers/carrefour) for Carrefour products.
- [Calvin Klein Scraper](https://apify.com/datascrapers/calvinklein) for Calvin Klein products.
- [Chargefinder Scraper](https://apify.com/datascrapers/chargefinder-scraper) for public charging stations.

### Data Scrapers support

Questions about this dataset: stardustspotlight@gmail.com

# Actor input Schema

## `searchQueries` (type: `array`):

Product search terms to look up on MediaMarkt.de (e.g. "AirPods", "refurbished iPhone"). Primary input for AI agents — no URL required.

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

MediaMarkt.de search, category, promo-list, campaign, or product page URLs (e.g. https://www.mediamarkt.de/de/category/smartphones-579.html or https://www.mediamarkt.de/de/product/\_apple-airpods-max-over-ear-kopfhorer-bluetooth-mitternacht-2954319.html). Combined with search queries when both are set.

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

Maximum number of products to scrape across all queries and URLs (0 = unlimited).

## `includeProductDetails` (type: `boolean`):

When enabled, fetch full product details for each item (description, specifications, variants, services). Charged as the product-details event in addition to each dataset item.

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

When enabled, fetch customer reviews for each product. Charged as the product-reviews event once per review, in addition to each dataset item.

## `maxReviews` (type: `integer`):

Maximum number of reviews to collect per product when Include Product Reviews is enabled (0 = all available reviews).

## `detailConcurrency` (type: `integer`):

How many products to enrich in parallel when product details or reviews are enabled. Each worker uses a rotating residential proxy. Higher is faster; keep it modest to avoid blocks.

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

Proxy settings. Apify Residential proxies are recommended for reliable MediaMarkt.de access.

## Actor input object example

```json
{
  "searchQueries": [
    "AirPods"
  ],
  "startUrls": [
    {
      "url": "https://www.mediamarkt.de/de/search.html?query=AirPods"
    }
  ],
  "maxItems": 10,
  "includeProductDetails": false,
  "includeReviews": false,
  "maxReviews": 10,
  "detailConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Dataset containing scraped MediaMarkt.de products

## `runStats` (type: `string`):

Record counts and timestamps for this run

# 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 = {
    "searchQueries": [
        "AirPods"
    ],
    "startUrls": [
        {
            "url": "https://www.mediamarkt.de/de/search.html?query=AirPods"
        }
    ],
    "maxItems": 10,
    "maxReviews": 10,
    "detailConcurrency": 5,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("datascrapers/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 = {
    "searchQueries": ["AirPods"],
    "startUrls": [{ "url": "https://www.mediamarkt.de/de/search.html?query=AirPods" }],
    "maxItems": 10,
    "maxReviews": 10,
    "detailConcurrency": 5,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("datascrapers/mediamarkt-de-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 '{
  "searchQueries": [
    "AirPods"
  ],
  "startUrls": [
    {
      "url": "https://www.mediamarkt.de/de/search.html?query=AirPods"
    }
  ],
  "maxItems": 10,
  "maxReviews": 10,
  "detailConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call datascrapers/mediamarkt-de-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datascrapers/mediamarkt-de-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/2U6Yksyi77avkdyqe/builds/oNeBIDj7XzrceFgN1/openapi.json
