# MediaMarkt EU Scraper — AT, CH, PL, IT, HU Electronics Data (`studio-amba/mediamarkt-eu-scraper`) Actor

Scrape products from 5 MediaMarkt/MediaWorld storefronts (Austria, Switzerland, Poland, Italy, Hungary) with one country parameter. Extract names, brands, prices, EAN codes, ratings, reviews, stock and images by keyword. No login, no cookies.

- **URL**: https://apify.com/studio-amba/mediamarkt-eu-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result 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?

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 EU Scraper — Austria, Switzerland, Poland, Italy, Hungary

Scrape products from 5 MediaMarkt/MediaWorld storefronts with a single `country` parameter: Austria, Switzerland, Poland, Italy (as MediaWorld) and Hungary. Search by keyword and pull clean, structured product data: names, brands, prices, original prices, discounts, EAN barcodes, ratings, review counts, stock status, categories, and images.

No login. No cookies. No account required.

Germany and Spain are covered by separate, dedicated actors: **MediaMarkt Germany Scraper** and **MediaMarkt Spain Scraper**. Use this actor for the other 5 markets in the same Ceconomy retail group.

### What this scraper does

Pick a `country` (AT, CH, PL, IT or HU) and give it a local-language keyword ("laptop", "lavatrice", "telewizor") and it returns matching products as flat JSON rows. Each row is a real product with its current online price in the market's own currency, brand, EAN barcode, rating, stock status, and image, ready to load into a spreadsheet, database, or price-monitoring pipeline.

Every one of these storefronts sits behind Cloudflare bot protection. This actor handles that for you and reads the product data straight from the storefront's own server-rendered state, so the output is clean and complete without any DOM guesswork.

### Markets covered

| Country | Storefront | Currency |
|---|---|---|
| Austria | mediamarkt.at | EUR |
| Switzerland | mediamarkt.ch | CHF |
| Poland | mediamarkt.pl | PLN |
| Italy | mediaworld.it | EUR |
| Hungary | mediamarkt.hu | HUF |

Italy trades under the MediaWorld brand rather than MediaMarkt, but runs the identical Ceconomy platform, so it is included here rather than as a separate actor.

### Why use this scraper?

- **Pan-EU price monitoring** — Track MediaMarkt/MediaWorld prices for laptops, phones, TVs, cameras, and appliances across 5 markets from one actor and one input schema.
- **Cross-border pricing analysis** — Compare the same EAN across Austria, Switzerland, Poland, Italy and Hungary to spot price differentials.
- **Competitive analysis** — Compare pricing against Amazon, MediaMarkt's own Saturn chain, and local electronics retailers in each country.
- **Market research** — Analyse assortment, brand coverage, and pricing across every electronics category, market by market.
- **Retail intelligence** — Monitor online stock status and discount percentages at scale.
- **Catalogue enrichment** — Match products by EAN to enrich your own catalogue with images, ratings, and category data.
- **Reselling & arbitrage** — Find price gaps for the same product across neighbouring markets.

### How to scrape MediaMarkt data

1. **Create an Apify account** — Sign up at [apify.com](https://apify.com) (free tier available).
2. **Open the MediaMarkt EU Scraper** — Navigate to this actor's page in the Apify Store.
3. **Pick a country** — Select AT, CH, PL, IT or HU from the `country` dropdown.
4. **Enter a search term** — Type a local-language product keyword (e.g. `laptop` for AT/CH/PL/HU, `lavatrice` for IT). The scraper matches it against that market's full catalogue.
5. **Refine (optional)** — Restrict to in-stock items, or raise the delay between requests for very large runs.
6. **Set a result limit** — Choose how many products you want (default: 100).
7. **Run the actor** — Click "Start".
8. **Download your data** — Export as JSON, CSV, or Excel from the Dataset tab, or pull it via the Apify API for automated workflows.

Need another market or Germany/Spain? Run this actor once per country, or use the dedicated **MediaMarkt Germany Scraper** / **MediaMarkt Spain Scraper** for those two.

### Input

| Field | Type | Description |
|-------|------|-------------|
| `country` | string | Which storefront to scrape: `AT`, `CH`, `PL`, `IT` or `HU`. Defaults to `AT`. |
| `searchQuery` | string | Local-language keyword to search the catalogue. Defaults to the market's own default term if left empty. |
| `maxResults` | integer | Maximum number of products to scrape. Default `100`. |
| `inStockOnly` | boolean | Only return products available and buyable online. Default `false`. |
| `requestDelaySecs` | integer | Minimum pause between page requests. Raise to `5`–`15` for large runs. Default `0` (adaptive backoff). |
| `proxyConfiguration` | object | Proxy settings. Left at the default for most use cases. |

An empty input `{}` runs a valid scrape (Austria, `laptop`, up to 100 products), so the actor always returns data.

### Output

Each product is a flat JSON row:

| Field | Type | Example |
|-------|------|---------|
| `country` | string | `AT` |
| `name` | string | `LENOVO IdeaPad Slim 3 15Q8X10 Copilot+ PC` |
| `brand` | string | `LENOVO` |
| `price` | number | `637` |
| `originalPrice` | number | null | `799` |
| `currency` | string | `EUR` |
| `discountPercentage` | number | null | `20` |
| `ean` | string | `4711474901002` |
| `sku` | string | `2086667` |
| `inStock` | boolean | null | `true` |
| `onlineStatus` | string | `AVAILABLE` |
| `rating` | number | null | `5` |
| `reviewCount` | number | null | `1` |
| `energyClass` | string | `C` |
| `category` | string | `Computer + Software > Notebooks + Zubehör > Alle Notebooks` |
| `imageUrl` | string | `https://assets.mmsrg.com/isr/166325/c1/-/ASSET_MMS_...` |
| `url` | string | `https://www.mediamarkt.at/de/product/_...-2086667.html` |
| `scrapedAt` | string | `2026-09-12T19:46:44.812Z` |

#### Example output

```json
{
  "country": "AT",
  "name": "ACER Gaming-Notebook Nitro V 17 AI ANV17-41 ANV17-41-R528, 17,3 Zoll, QHD, AMD Ryzen 5 240, 16 GB, Windows 11 Home",
  "brand": "ACER",
  "price": 1259,
  "originalPrice": null,
  "currency": "EUR",
  "discountPercentage": null,
  "ean": "4711474901002",
  "sku": "2086667",
  "inStock": true,
  "onlineStatus": "AVAILABLE",
  "rating": 5,
  "reviewCount": 1,
  "energyClass": "",
  "category": "Computer + Software > Notebooks + Zubehör > Alle Notebooks",
  "imageUrl": "https://assets.mmsrg.com/isr/166325/c1/-/ASSET_MMS_169024862",
  "url": "https://www.mediamarkt.at/de/product/_acer-gaming-notebook-nitro-v-17-2086667.html",
  "scrapedAt": "2026-09-12T19:46:44.812Z"
}
```

`energyClass` is populated for products that carry an EU energy label (appliances, TVs, monitors) and is empty for others (laptops, accessories). `originalPrice` and `discountPercentage` are set only when a product is on offer. `currency` always reflects the market: EUR (AT, IT), CHF (CH), PLN (PL), HUF (HU).

### How it works

Every one of these MediaMarkt/MediaWorld storefronts is a React/PWA behind Cloudflare bot protection. This actor fetches each server-rendered listing page and reads the storefront's own embedded product state directly (the same data the site uses to render), so the output is clean and structured — not scraped from fragile HTML markup. Search results are paginated automatically until your result limit is reached.

### How much does it cost?

This actor is billed $0.02 per run plus $0.002 per result:

- **100 products**: ~$0.22
- **1,000 products**: ~$2.02

Your run's usage cost only settles after the run reports SUCCEEDED — reading a mid-run dataset understates the eventual cost.

### Tips

- **Use local-language keywords.** `waschmaschine` (AT/CH), `laptop` (PL/HU), and `lavatrice` (IT) return more than their English equivalents.
- **Broad category terms return the most.** Terms mapping to full catalogue categories return thousands of products per market.
- **Large runs.** For tens of thousands of products, set `requestDelaySecs` to `5`–`10` to stay comfortably under rate limits.
- **Running all 5 markets?** Schedule 5 runs with different `country` values, or chain them from an orchestrator actor.

### Limitations

- Search is keyword-driven; there is no full-catalogue crawl mode in this version.
- Physical in-store (per-branch) stock is not included — availability reflects the national online status.
- Marketplace (third-party) offers are included and flagged via `onlineStatus`.
- Only 5 of MediaMarktSaturn's storefronts are covered here. The Netherlands and Portugal sites have been discontinued by MediaMarkt itself; Sweden has no live storefront; Greece runs on a different retail platform entirely. Belgium runs the same Ceconomy platform but currently resists our anti-bot route — not included in this version.

### Related Scrapers

Building a cross-retailer or cross-border electronics price dataset? Pair this with other Studio AMBA electronics scrapers:

- **MediaMarkt Germany Scraper** / **MediaMarkt Spain Scraper** — the other 2 Ceconomy markets, as dedicated actors.
- **Saturn Scraper** — MediaMarkt's German sister chain, same platform.
- **Otto Scraper** — large German general & electronics marketplace.
- **Conrad Scraper** / **Cyberport Scraper** — German electronics specialists.
- **Coolblue Scraper** / **Krefel Scraper** — Benelux electronics retailers.
- **Euronics Scraper** — European electronics buying group.

Match products across all of them by `ean` to compare prices on identical items across markets and retailers.

# Actor input Schema

## `country` (type: `string`):

Which MediaMarkt/MediaWorld storefront to scrape. Germany and Spain are separate actors (mediamarkt-de-scraper, mediamarkt-es-scraper).

## `searchQuery` (type: `string`):

Local-language keyword to search the catalogue (e.g. 'laptop', 'lavatrice', 'telewizor'). Leave empty to use the market's default.

## `maxResults` (type: `integer`):

Maximum number of products to scrape.

## `inStockOnly` (type: `boolean`):

Only return products currently available and buyable online.

## `requestDelaySecs` (type: `integer`):

Minimum pause between page requests. Raise this (5-15s) for large runs if you hit throttling. 0 = full speed with automatic adaptive backoff.

## `brightDataApiKey` (type: `string`):

Optional. Your own Bright Data Web Unlocker API key. Normally not needed — the actor ships with access. Only set this to route traffic through your own Bright Data account.

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

Proxy settings. Every market is fetched through the Bright Data Web Unlocker, so this can be left at its default.

## Actor input object example

```json
{
  "country": "AT",
  "searchQuery": "laptop",
  "maxResults": 20,
  "inStockOnly": false,
  "requestDelaySecs": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AT"
  }
}
```

# Actor output Schema

## `results` (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 = {
    "country": "AT",
    "searchQuery": "laptop",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AT"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/mediamarkt-eu-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 = {
    "country": "AT",
    "searchQuery": "laptop",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AT",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/mediamarkt-eu-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 '{
  "country": "AT",
  "searchQuery": "laptop",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AT"
  }
}' |
apify call studio-amba/mediamarkt-eu-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/mediamarkt-eu-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/f3WV8uwr0ij2D7z9Z/builds/bGUafeAZUlwUQcHpv/openapi.json
