# Idealo Price Scraper (`s-r/idealo-scraper`) Actor

Look up any product EAN on idealo and get every live merchant offer — seller name, price, shipping, total price, condition and availability — across the German (idealo.de) and Austrian (idealo.at) marketplaces.

- **URL**: https://apify.com/s-r/idealo-scraper.md
- **Developed by:** [SR](https://apify.com/s-r) (community)
- **Categories:** E-commerce, Business
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

## Idealo Price Scraper — Offers and Prices by EAN

Turn any product barcode into the full idealo price-comparison listing. This idealo scraper takes an EAN/GTIN and returns every live merchant offer from idealo — seller name, item price, shipping cost, total price, condition and availability — across the German (idealo.de) and Austrian (idealo.at) marketplaces. No login, no idealo API key, no HTML parsing on your side.

It is built for price monitoring, repricing, and competitive intelligence where you already know the products you care about and need their idealo offers as clean structured JSON. Give it one EAN or a list of thousands; each lookup comes back as one product row with all of its offers nested and the cheapest and most expensive total price pre-computed.

### What you get

- One dataset item per product EAN you submit, with the matching idealo product `title`, `brand`, canonical product `url`, `thumbnail`, and `idealo_sku`.
- A nested `offers` array — one entry per merchant — with `sellerName`, `price`, `shippingPrice`, `totalPrice`, `formerPrice`, `condition`, `availability`, and `shippingMethod`.
- `offer_count`, `min_total_price` and `max_total_price` computed for you, so you can sort or alert on the cheapest offer without touching the array.
- Coverage of both live idealo marketplaces: Germany (`idealo.de`) and Austria (`idealo.at`), selectable per run.
- An explicit `found` flag so a product idealo does not list is returned as a clear empty record, never a silent gap in your data.
- EUR pricing with the currency stated on every item.
- Batch input with adjustable concurrency — submit a long EAN list and the actor fans the lookups out in parallel.

### Why scrape idealo price comparison data

idealo is the dominant price-comparison marketplace in the German-speaking market, aggregating offers from hundreds of merchants for the same product. For anyone selling, sourcing, or analysing consumer goods in Germany and Austria, the idealo product page is the single best snapshot of the live competitive price landscape for a given item.

The problem is access. idealo has no public offers API, the product pages are behind bot protection, and the listing for one product can carry dozens of merchant offers that change throughout the day. Scraping it reliably yourself means maintaining proxies, parsing a moving HTML target, and handling the German and Austrian sites separately. This actor does that work behind a stable API-backed pipeline so you receive normalized JSON keyed by the EAN you already have in your catalog.

Because the input is the EAN, the data joins directly back to your own product master — no fuzzy title matching, no manual mapping between your SKUs and idealo's.

### Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `eans` | array of strings | Yes | One or more product barcodes (EAN-8/EAN-13/GTIN, 8–14 digits). Non-digit characters are stripped automatically. Duplicates are de-duplicated. |
| `country` | string (`de` or `at`) | No | Which idealo marketplace to query. `de` = idealo.de (default), `at` = idealo.at. |
| `concurrency` | integer (1–25) | No | Maximum lookups run in parallel. Default 10. |

Minimal input:

```json
{
  "eans": ["5702017416663"],
  "country": "de"
}
````

### Output

Each product is one dataset item. Example (trimmed to three offers):

```json
{
  "ean": "5702017416663",
  "country": "de",
  "site": "idealo.de",
  "found": true,
  "idealo_sku": 202283713,
  "title": "LEGO Icons - Botanical Collection - Wildblumenstrauß (10313)",
  "brand": null,
  "url": "https://www.idealo.de/preisvergleich/OffersOfProduct/202283713.html",
  "thumbnail": null,
  "availability": "InStock",
  "currency": "EUR",
  "offer_count": 18,
  "min_total_price": 38.99,
  "max_total_price": 52.83,
  "offers": [
    {
      "sellerName": "Amazon",
      "price": 38.99,
      "formerPrice": null,
      "shippingPrice": 0.0,
      "totalPrice": 38.99,
      "condition": "New",
      "availability": "InStock",
      "shippingMethod": "standard"
    },
    {
      "sellerName": "playox.de",
      "price": 40.97,
      "shippingPrice": 4.99,
      "totalPrice": 45.96,
      "condition": "New",
      "availability": "InStock"
    }
  ]
}
```

Only products idealo actually lists reach the dataset, so every dataset item is a real result. EANs idealo has no listing for are reported separately in the run's `OUTPUT` record under `notFound` (a list of EANs), free of charge, so you can reconcile your input against what was found.

### Use cases

**Repricing and Buy-Box strategy for German marketplaces.** If you sell on idealo, Amazon.de or your own shop, you need to know where your price sits against every other merchant on the same product. Pull your catalog's EANs through this idealo scraper on a schedule, read `min_total_price` and the per-seller `offers`, and feed your repricing engine the live competitive floor for Germany and Austria.

**Brand and MAP monitoring.** Brands enforcing minimum advertised pricing across the DACH region can watch every merchant offer for their products on idealo in one pass. The `sellerName`, `price` and `totalPrice` fields make it straightforward to flag any seller listing below an agreed threshold, including shipping in the comparison via `totalPrice`.

**Market and assortment research.** Analysts sizing a category can submit a basket of EANs and capture the spread between cheapest and most expensive offers (`min_total_price` to `max_total_price`), the depth of competition (`offer_count`), and availability across both the German and Austrian markets — useful inputs for launch pricing and channel decisions.

**Product data enrichment.** Marketplaces and aggregators that already hold EANs can enrich their records with idealo's canonical product title, image and live price range, keyed cleanly on the barcode with no title-matching guesswork.

### How it compares

| | Idealo Price Scraper (this actor) | Typical free idealo scrapers |
| --- | --- | --- |
| Pricing | Pay-per-event — pay only for products actually found | Free actor, but you pay unpredictable Apify compute |
| Input | EAN/GTIN — joins straight to your catalog | Often URL- or keyword-based |
| Markets | idealo.de and idealo.at | Usually idealo.de only |
| Reliability | API-backed with six rotating upstream keys | Direct HTML scraping, breaks when idealo blocks |
| Output | Offers nested per product, min/max total price computed | Raw rows, post-processing left to you |

Free idealo scrapers exist and work for one-off runs, but they bill Apify compute (so cost scales with run time, not results) and break when idealo changes its markup or blocks the crawler. This actor trades a small per-result fee for predictable, billable, API-backed output.

### Pricing

This actor is pay-per-event with two events: a small per-run **actor start** fee, and a **result** charge of $0.004 per product idealo actually returns (one dataset item). EANs with no idealo listing are reported in `OUTPUT.notFound` and are not charged. Apify automatically applies subscription-plan discounts (for example, Business and higher plans receive a 75% discount on the result price). All pricing is pay-per-event, so you only pay for results you receive — no per-compute-unit charges.

### Limits and gotchas

- **Only Germany and Austria are supported.** idealo discontinued its UK, France, Spain and Italy marketplaces in 2020. The actor exposes only `de` and `at` because those are the only idealo sites that return live data.
- **Lookup is by EAN/GTIN**, not by free-text search or product URL. If you do not have the barcode, resolve it first.
- **A product not listed on idealo is not an error.** Its EAN is returned in `OUTPUT.notFound` rather than the dataset, and is not charged.
- **Prices are a point-in-time snapshot.** idealo offers change throughout the day; schedule repeat runs if you need a price history.
- **Free Apify plans are capped at 10 results per run.** Upgrade your Apify plan or split work across runs to go beyond that. Paying plans are uncapped.
- **Currency is EUR** for both markets.
- **Brand is sometimes null** — idealo does not expose a brand field on every product.

### FAQ

**Can I scrape idealo prices without an idealo API key?** Yes. idealo has no public offers API; this actor handles access for you and returns structured JSON. You supply only EANs.

**Does it cover idealo.at (Austria) as well as idealo.de?** Yes — set `country` to `at` for the Austrian marketplace or `de` for Germany. Each market is priced independently by its merchants, so the same EAN can return different offers.

**Why do idealo.fr, idealo.co.uk, idealo.es and idealo.it not work?** idealo closed those international marketplaces in 2020 and operates only in Germany and Austria today, so there is no live data to return for them.

**How do I get the cheapest idealo price for a product?** Read `min_total_price` on each item — it is the lowest `totalPrice` (item price plus shipping) across all merchant offers, pre-computed for you.

**Can I look up many products in one run?** Yes. Pass a list of EANs in `eans`; the actor de-duplicates them and runs the lookups concurrently (tune with `concurrency`).

### Related Actors

- [Google Reviews Scraper](https://apify.com/s-r/google-reviews) — product reviews and ratings by SKU.
- [Price Scraper](https://apify.com/s-r/price-scraper---extract-prices-a) — extract prices from arbitrary product pages.
- [Shopify Products Scraper](https://apify.com/s-r/shopify-products) — full storefront catalogs from any Shopify shop.

# Actor input Schema

## `eans` (type: `array`):

One or more product barcodes (EAN-8/EAN-13/GTIN, 8-14 digits). Each is looked up on idealo and returns its live merchant offers. Non-digit characters are stripped automatically.

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

Which idealo marketplace to query. idealo operates only in Germany (idealo.de) and Austria (idealo.at) — it closed its UK/France/Spain/Italy sites in 2020.

## `concurrency` (type: `integer`):

Maximum number of EAN lookups to run in parallel. Higher is faster but heavier on the upstream rate limit.

## Actor input object example

```json
{
  "eans": [
    "5702017416663"
  ],
  "country": "de",
  "concurrency": 10
}
```

# 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 = {
    "eans": [
        "5702017416663"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s-r/idealo-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 = { "eans": ["5702017416663"] }

# Run the Actor and wait for it to finish
run = client.actor("s-r/idealo-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 '{
  "eans": [
    "5702017416663"
  ]
}' |
apify call s-r/idealo-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Idealo Price Scraper",
        "description": "Look up any product EAN on idealo and get every live merchant offer — seller name, price, shipping, total price, condition and availability — across the German (idealo.de) and Austrian (idealo.at) marketplaces.",
        "version": "0.1",
        "x-build-id": "WGfHLgTI5fhEdN1uu"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/s-r~idealo-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-s-r-idealo-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/s-r~idealo-scraper/runs": {
            "post": {
                "operationId": "runs-sync-s-r-idealo-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/s-r~idealo-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-s-r-idealo-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": [
                    "eans"
                ],
                "properties": {
                    "eans": {
                        "title": "Product EANs / GTINs",
                        "type": "array",
                        "description": "One or more product barcodes (EAN-8/EAN-13/GTIN, 8-14 digits). Each is looked up on idealo and returns its live merchant offers. Non-digit characters are stripped automatically.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "country": {
                        "title": "Idealo market",
                        "enum": [
                            "de",
                            "at"
                        ],
                        "type": "string",
                        "description": "Which idealo marketplace to query. idealo operates only in Germany (idealo.de) and Austria (idealo.at) — it closed its UK/France/Spain/Italy sites in 2020.",
                        "default": "de"
                    },
                    "concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 25,
                        "type": "integer",
                        "description": "Maximum number of EAN lookups to run in parallel. Higher is faster but heavier on the upstream rate limit.",
                        "default": 10
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
