# Idealo Product & Offer Scraper (`axlymxp/idealo-product-offer-scraper`) Actor

Scrape idealo price comparison in 6 markets (DE, AT, UK, FR, IT, ES). Get every merchant offer, not just the first 20 — plus lowest/highest price, shop names, delivery, ratings and full spec sheets as clean JSON. Search by keyword, category or URL. Pay only for the results you get.

- **URL**: https://apify.com/axlymxp/idealo-product-offer-scraper.md
- **Developed by:** [axly](https://apify.com/axlymxp) (community)
- **Categories:** E-commerce, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 75.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 dataset items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Idealo Product & Offer Scraper

Turn idealo — Europe's largest price-comparison network — into a structured
product and price feed. Search by keyword, list a whole category, or hand it
product URLs, and get back clean JSON with **every merchant offer**, the full
price range, shop names, delivery estimates, ratings and the complete technical
datasheet.

Works across **six markets**: Germany (idealo.de), Austria, the United Kingdom,
France, Italy and Spain.

### Who uses this

| You are…                         | You get                                                                                     |
| -------------------------------- | ------------------------------------------------------------------------------------------- |
| **E-commerce / pricing team**    | Every competitor's price for your SKUs, per market — the input for repricing and MAP checks |
| **Brand / distribution manager** | Which shops actually sell your product, at what price, in which country                     |
| **Marketplace seller**           | Where you rank against 50+ merchants on the same product, including delivery-inclusive cost |
| **Market researcher / analyst**  | Category-wide price distributions, ratings and spec attributes at scale                     |
| **Affiliate / deal publisher**   | Lowest price, click-out links and price spread for deal pages                               |

### Why the complete offer list matters

Idealo renders about 20 offers on a product page. Popular products carry far
more — an iPhone 15 on idealo.de has **147 offers across 48 shops**. Most
scrapers stop at what the page renders. Turn on **Include every merchant offer**
and this Actor follows the offer-list pagination to collect all of them, so your
"lowest price" is the real one and your competitor coverage is complete.

### Output fields

| Field                                                                                 | Type    | Description                                                     |
| ------------------------------------------------------------------------------------- | ------- | --------------------------------------------------------------- |
| `product_id`                                                                          | string  | Idealo product ID — stable across all six country sites         |
| `title`, `url`, `image`                                                               | string  | Product name, canonical page URL, main image                    |
| `market`, `country`, `currency`                                                       | string  | Which site the row came from and its currency                   |
| `price_min`, `price_max`, `price_avg`                                                 | number  | Lowest, highest and mean merchant price                         |
| `total_price_min`                                                                     | number  | Lowest price **including delivery**                             |
| `price_spread`                                                                        | number  | Highest − lowest — the saving from comparing                    |
| `offer_count`, `offers_scraped`, `shop_count`                                         | integer | Offers idealo reports, offers in this row, distinct merchants   |
| `rating`, `rating_scale`, `review_count`                                              | number  | Product rating (scale varies per market) and review count       |
| `best_shop_name`, `best_price`, `best_total_price`, `best_delivery`, `best_offer_url` | mixed   | The cheapest offer, broken out for easy filtering               |
| `offers[]`                                                                            | array   | Every offer: shop, price, total price, delivery, click-out URL  |
| `specs`                                                                               | object  | Technical datasheet as key/value pairs (often 70–90 attributes) |
| `international_prices[]`                                                              | array   | Same product's cheapest price on idealo's other country sites   |
| `cheapest_foreign_site`, `cheapest_foreign_price`                                     | mixed   | Best cross-border price, pre-extracted                          |
| `source`, `scraped_at`                                                                | string  | How the product entered the run; UTC timestamp                  |

### High-value use cases

1. **Competitive repricing** — feed your SKU list in as product URLs, run it
   hourly, and drive your price rules off `price_min`, `shop_count` and the full
   `offers[]` array.
2. **MAP / price-floor monitoring** — spot any merchant selling below your
   minimum advertised price, with the shop name and click-out link as evidence.
3. **Cross-border arbitrage** — enable cross-border prices and compare
   `price_min` against `cheapest_foreign_price` to find products that are
   materially cheaper in another idealo market.
4. **Category intelligence** — list an entire category (e.g. `19116`, mobile
   phones) to build a price and specification map of the market.
5. **Catalog enrichment** — pull the `specs` object to fill product attributes
   in your PIM without manual data entry.

### Input parameters

| Parameter                    | Type    | Default  | Description                                                |
| ---------------------------- | ------- | -------- | ---------------------------------------------------------- |
| `market`                     | select  | `de`     | `de`, `at`, `uk`, `fr`, `it`, `es`                         |
| `searchTerms`                | array   | —        | Keywords to search and paginate                            |
| `categoryIds`                | array   | —        | Numeric category IDs to list in full                       |
| `productUrls`                | array   | —        | Direct product page URLs (any market's format)             |
| `maxItems`                   | integer | `100`    | Stop after this many products (0 = unlimited)              |
| `maxPagesPerTerm`            | integer | `5`      | Result pages per term/category (36 products per page)      |
| `includeDetails`             | boolean | `true`   | Open each product page for offers, ratings and price range |
| `includeAllOffers`           | boolean | `false`  | Collect **all** offers, not just the ~20 rendered          |
| `maxOffersPerProduct`        | integer | `0`      | Cap offers per product (0 = no cap)                        |
| `includeSpecs`               | boolean | `true`   | Extract the technical datasheet                            |
| `includeInternationalPrices` | boolean | `false`  | Add cheapest prices from idealo's other country sites      |
| `proxyConfiguration`         | object  | disabled | Optional — runs fine without a proxy                       |

At least one of `searchTerms`, `categoryIds` or `productUrls` is required.

### Example input

```json
{
    "market": "de",
    "searchTerms": ["iphone 15"],
    "maxItems": 50,
    "maxPagesPerTerm": 2,
    "includeDetails": true,
    "includeAllOffers": true,
    "includeSpecs": true,
    "includeInternationalPrices": true
}
```

### Example output

```json
{
    "product_id": "203235721",
    "title": "Apple iPhone 15",
    "url": "https://www.idealo.de/preisvergleich/OffersOfProduct/203235721_-iphone-15-apple.html",
    "image": "https://cdn.idealo.com/folder/Product/203235/7/203235721/s10_produktbild_gross/apple-iphone-15.jpg",
    "market": "de",
    "country": "Germany",
    "currency": "EUR",
    "price_min": 559.9,
    "price_max": 1049.0,
    "price_avg": 704.32,
    "total_price_min": 559.9,
    "price_spread": 489.1,
    "offer_count": 147,
    "offers_scraped": 146,
    "shop_count": 48,
    "rating": 1.7,
    "rating_scale": "0-6",
    "review_count": 46,
    "best_shop_name": "Cyberport",
    "best_price": 559.9,
    "best_total_price": 559.9,
    "best_delivery": "bis Do 04.09.",
    "best_offer_url": "https://www.idealo.de/relocator/relocate?...",
    "offers": [
        {
            "shop_name": "Cyberport",
            "shop_id": "104172",
            "price": 559.9,
            "total_price": 559.9,
            "currency": "EUR",
            "delivery": "bis Do 04.09.",
            "variant_name": "Apple iPhone 15 128GB Schwarz",
            "position": 1,
            "offer_key": "…",
            "clickout_url": "https://www.idealo.de/relocator/relocate?…"
        }
    ],
    "specs": {
        "Displaygröße": "6.1 Zoll",
        "Arbeitsspeicher": "6 GB",
        "Akkukapazität": "3349 mAh"
    },
    "international_prices": [
        {
            "site": "idealo.it",
            "price": 484.0,
            "url": "https://www.idealo.it/confronta-prezzi/203235721/apple-iphone-15.html"
        }
    ],
    "cheapest_foreign_site": "idealo.it",
    "cheapest_foreign_price": 484.0,
    "source": "search",
    "scraped_at": "2026-09-01T10:22:41Z"
}
```

### Scheduling & integrations

Schedule the Actor (hourly, daily, weekly) from the Apify Console to build a
price time series. Results are available as JSON, CSV, Excel and XML, and can be
pushed automatically via webhooks into Google Sheets, Make, Zapier, Amazon S3 or
your own API. Long runs checkpoint themselves, so a restarted run resumes where
it stopped instead of re-emitting rows you already paid for.

### Use it from an AI assistant (MCP)

The Actor is callable through Apify's MCP server, so Claude, ChatGPT or any
MCP-capable agent can run it directly:

```
https://mcp.apify.com/?actors=axlymxp/idealo-product-offer-scraper
```

Ask your assistant things like *"what is the cheapest shop for an iPhone 15 on
idealo.de right now?"* and it will call the Actor and read the dataset.

### FAQ

**Do I need a proxy?**
No. The Actor talks to idealo's public pages with a browser-grade TLS
fingerprint and works without a proxy. A proxy is supported for very large runs
or rate-limited regions.

**How many results can I get?**
There is no hard cap. A category walk on idealo.de returns thousands of unique
products; set `maxItems` to control the volume.

**How fresh is the data?**
Every row is scraped live at run time and stamped with `scraped_at`. Nothing is
served from a cache.

**Why is `offers_scraped` smaller than `offer_count`?**
`offer_count` is the total idealo advertises, including variants it does not
list individually. `offers_scraped` is what was actually collected. Turn on
**Include every merchant offer** to maximise coverage.

**Does pagination ever loop or duplicate rows?**
No. Idealo silently re-serves page 1 when you request a page past the last one —
a trap that makes naive scrapers loop forever. This Actor de-duplicates by
product ID and offer key and stops as soon as a page yields nothing new.

**What happens if a product was removed?**
Idealo answers with HTTP 410 and a full-looking HTML page. The Actor detects
this, logs it, skips the item and keeps going rather than emitting garbage.

**Is this legal?**
The Actor collects publicly available product and price information. You are
responsible for using the data in line with idealo's terms and applicable law.

**Something broke — how fast do you respond?**
Open an issue on the Actor page. Fatal errors are reported automatically to the
maintainer, so breakages are usually noticed before they are reported.

# Actor input Schema

## `market` (type: `string`):

Which idealo country site to scrape. Each market has its own shops, prices and currency.

## `searchTerms` (type: `array`):

Keywords to search, e.g. 'iPhone 15', 'Dyson V15', 'air fryer'. Each term is paginated up to 'Max pages per term'.

## `categoryIds` (type: `array`):

Numeric idealo category IDs to list in full, e.g. '19116' (mobile phones). Find them in a category URL: .../ProductCategory/19116.html or .../cat/19116.html.

## `productUrls` (type: `array`):

Direct idealo product page URLs to scrape. Any market's URL format works.

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

Stop after this many products across all inputs (0 = unlimited).

## `maxPagesPerTerm` (type: `integer`):

Search result pages to walk per term or category. Each page holds up to 36 products.

## `includeDetails` (type: `boolean`):

Open each product page for merchant offers, ratings, review counts and the full price range. Adds one request per product. Turn off for a fast, cheap listing-only crawl.

## `includeAllOffers` (type: `boolean`):

Follow the offer-list pagination to collect ALL offers for each product instead of the ~20 shown on the page (popular products can have 150+ offers across 50 shops). Adds a few requests per product.

## `maxOffersPerProduct` (type: `integer`):

Cap the number of offers collected per product when 'Include every merchant offer' is on (0 = no cap).

## `includeSpecs` (type: `boolean`):

Extract the product datasheet as a key/value object (often 70–90 attributes: display, battery, dimensions, energy class…).

## `includeInternationalPrices` (type: `boolean`):

Add the cheapest price for the same product on idealo's other country sites — useful for cross-border arbitrage. Adds one request per product.

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

Optional. The scraper works without a proxy; add one for very large runs or if your region is rate limited.

## Actor input object example

```json
{
  "market": "de",
  "searchTerms": [
    "iphone 15",
    "dyson v15"
  ],
  "categoryIds": [
    "19116"
  ],
  "productUrls": [
    "https://www.idealo.de/preisvergleich/OffersOfProduct/203235721_-iphone-15-apple.html"
  ],
  "maxItems": 100,
  "maxPagesPerTerm": 5,
  "includeDetails": true,
  "includeAllOffers": false,
  "maxOffersPerProduct": 0,
  "includeSpecs": true,
  "includeInternationalPrices": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Every scraped product with its price range, merchant offers and specs as a structured JSON row.

# 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 = {
    "searchTerms": [
        "iphone 15"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("axlymxp/idealo-product-offer-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 = { "searchTerms": ["iphone 15"] }

# Run the Actor and wait for it to finish
run = client.actor("axlymxp/idealo-product-offer-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 '{
  "searchTerms": [
    "iphone 15"
  ]
}' |
apify call axlymxp/idealo-product-offer-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,axlymxp/idealo-product-offer-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/lfbV7xAXhqJkJ3Gua/builds/Fu89CGg5hfMUGvol2/openapi.json
