# Idealo Listings Scraper (`piotrv1001/idealo-listings-scraper`) Actor

The Idealo Listings Scraper extracts product listings from idealo category pages across Germany, Austria, Italy, France, Spain and the UK, capturing titles, best prices, shipping costs, specifications, ratings and review ranks — ideal for price monitoring, repricing and e-commerce market research.

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

## Pricing

from $4.00 / 1,000 product listings

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?

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

### 🛒 Idealo Listings Scraper

Easily extract **product listings and price comparison data from [idealo](https://www.idealo.de)** — Europe's largest price comparison portal with millions of products across Germany, Austria, Italy, France, Spain and the UK. The **Idealo Listings Scraper** collects every product in a category with its **best price, cheapest shop, offer count, specs, ratings and energy label**, and can optionally pull the **full list of shop offers** behind each product.

Running on the Apify platform gives you scheduled runs, API access, webhooks, monitoring, and one-click export to JSON, CSV, or Excel.

### ✨ Features

- 🏷️ **Complete category coverage**: paste any idealo category URL and get every product it lists, page after page, automatically deduplicated.
- 🌳 **Whole category trees**: paste a category overview URL and the Actor expands it into all of its subcategories for you.
- 💰 **Real prices**: best price, formatted price with currency, shipping costs, and the name of the cheapest shop for every product.
- 🏪 **All shop offers (optional)**: shop name, price, delivery time and a direct offer link for every merchant selling the product — the whole price comparison table, not just the winner.
- 📋 **Product specifications**: the full characteristics list idealo shows for each product (screen size, capacity, chipset, RAM, ...).
- ⭐ **Ratings & bestsellers**: expert test rating, user review count, rating score, bestseller flag and rank.
- ⚡ **Energy labels**: EU energy efficiency class where idealo publishes one.
- 🌍 **Multi-market**: works on idealo.de, idealo.at, idealo.it, idealo.fr, idealo.es and idealo.co.uk with the same input.
- 💸 **Fast & affordable**: pay only for the results you get — no startup fees.

### 🛠️ How to scrape idealo product data

1. **Find a category on idealo** — browse to a category and copy the URL, e.g. `https://www.idealo.de/preisvergleich/ProductCategory/19116.html` (mobile phones on idealo.de) or `https://www.idealo.co.uk/cat/19116/mobile-phones.html` (idealo.co.uk; .fr, .it and .es use the same `/cat/…` form).
2. **Enter start URLs** — paste one or more category URLs into **Start URLs**. Category overview pages work too and are expanded into all subcategories.
3. **Set the limit** — choose how many products you want with **Max items**.
4. **(Optional) Enable all shop offers** — turn on **Scrape all shop offers** to also collect the 100 cheapest merchant offers per product.
5. **Run the Actor** — download the dataset as JSON, CSV, or Excel, or fetch it via API.

### ⚙️ Input

| Field | Type | Description |
| --- | --- | --- |
| `startUrls` | array | idealo category URLs (or category overview URLs) to scrape |
| `maxItems` | integer | Maximum number of products to scrape (default: `50`, `0` = no limit) |
| `scrapeOffers` | boolean | Also collect every shop offer for each product (default: `false`) |

Example input:

```json
{
    "startUrls": [{ "url": "https://www.idealo.de/preisvergleich/ProductCategory/19116.html" }],
    "maxItems": 50,
    "scrapeOffers": false
}
```

### 📊 Sample output

```json
{
    "id": "207643424",
    "title": "Apple iPhone 17",
    "subheading": "5G Handy",
    "url": "https://www.idealo.de/preisvergleich/OffersOfProduct/207643424_-iphone-17-apple.html",
    "imageUrl": "https://cdn.idealo.com/folder/Product/207643/4/207643424/s1_produktbild_mittelgross/apple-iphone-17.jpg",
    "categoryId": "19116",
    "characteristics": ["5G Handy", "6,3 Zoll", "120 Hz", "48 MP", "8 GB RAM", "A19", "iOS 26", "3.692 mAh"],
    "price": 749.9,
    "formattedPrice": "749,90 €",
    "currency": "EUR",
    "offerCount": 488,
    "usedOnly": false,
    "shopName": "smartport.de",
    "shopId": "334103",
    "shippingCosts": "0,00 €",
    "reviewCount": 168,
    "testRating": "1,5",
    "ratingPercent": 90,
    "isBestseller": true,
    "bestsellerRank": 1,
    "energyEfficiencyClass": "A",
    "categoryUrl": "https://www.idealo.de/preisvergleich/ProductCategory/19116.html"
}
```

With **Scrape all shop offers** enabled, each product additionally contains an `offers` array:

```json
{
    "offers": [
        {
            "shopName": "smartport.de",
            "shopId": "334103",
            "title": "Apple iPhone 17 - 256GB Weiss - Neuware",
            "price": 749.9,
            "formattedPrice": "749,90 €",
            "deliveryTime": "Di. 04.08.–Do. 06.08.2026",
            "offerKey": "3f172f91ff16e83c4ee979e35c445f37",
            "url": "https://www.idealo.de/relocator/relocate?offerKey=3f172f91ff16e83c4ee979e35c445f37&price=749.90&sid=334103&type=offer"
        }
    ]
}
```

### 📋 Main output fields

| Field | Description |
| --- | --- |
| `id` | idealo product ID |
| `title` / `subheading` | Product name and short category description |
| `url` | Link to the product's price comparison page |
| `imageUrl` | Product image |
| `characteristics` | Key specifications listed by idealo |
| `price` / `formattedPrice` / `currency` | Best available price as a number and as displayed |
| `offerCount` | Number of shop offers behind the product |
| `usedOnly` | Whether only used offers are available |
| `shopName` / `shopId` / `shippingCosts` | Shop with the best price and its shipping costs |
| `testRating` / `ratingPercent` / `reviewCount` | Expert test rating, rating score and number of user reviews |
| `isBestseller` / `bestsellerRank` | Bestseller flag and rank inside the category |
| `energyEfficiencyClass` | EU energy label class, where published |
| `categoryUrl` | Category page the product was found on |
| `offers` | All shop offers with shop, price, delivery time and offer link (offers mode) |

### 💰 How much does it cost to scrape idealo?

The Actor uses transparent **pay-per-result** pricing — no startup fees:

| Event | Price | What you get |
| --- | --- | --- |
| Product listing | **$0.004** | Product record: title, best price, cheapest shop, specs, ratings, offer count, image |
| Product with all offers | **$0.012** | Everything above plus the 100 cheapest shop offers with price, delivery time and offer link |

Examples: 1,000 product listings ≈ **$4.00** · 100 products with all their shop offers ≈ **$1.20** · a full 4,000-product category ≈ **$16**. Apify's free plan includes $5 of monthly credit — enough to try the Actor on several full categories.

### 💡 Use cases

- **Price monitoring** across hundreds of German and European online shops at once
- **Competitor and MAP compliance checks** — see which shop sells what, at what price
- **Market research** into assortment, price ranges and bestsellers per category
- **Repricing** and margin analysis for e-commerce sellers
- **Product catalog enrichment** with specifications, images and energy labels
- **Retail analytics and dashboards** fed by scheduled runs via the Apify API

### 🎯 Tips for best results

- Start with the **default listing mode** to map a category cheaply, then re-run with `scrapeOffers: true` for the products you care about.
- One category exposes up to about **4,000 products** through pagination (112 pages of 36). To cover a larger category completely, use the site's filters (e.g. by manufacturer or price range) and paste each filtered category URL as a separate start URL.
- Paste a **category overview URL** to sweep a whole branch of the category tree in one run — duplicate products are removed automatically.
- Set `maxItems: 0` to remove the limit when scraping full categories.
- Add category URLs from different idealo domains (`.de`, `.at`, `.it`, ...) in one run to compare prices across markets.

### ❓ FAQ

**Is it legal to scrape idealo?**
This Actor extracts publicly available product and shop information — no personal data and no login-protected content. Web scraping of public data is generally legal, but you should review idealo's Terms of Service and consult a legal professional for your specific use case.

**Which idealo domains are supported?**
idealo.de, idealo.at, idealo.it, idealo.fr, idealo.es and idealo.co.uk — paste any category URL from those sites: `/preisvergleich/ProductCategory/…` and `/preisvergleich/SubProductCategory/…` on .de/.at, `/cat/…`, `/subcat/…` and `/spcat/…` on the others.

**Can I scrape a whole category with thousands of products?**
idealo itself paginates up to about 4,000 products per category (112 pages). Use category filters (manufacturer, price range) and add each filtered URL as a start URL to go beyond that; duplicates across URLs are removed.

**How many shop offers are collected per product?**
The 100 cheapest offers per product, in idealo's own price order. Popular products can have several hundred offers; the tail beyond the cheapest 100 is not collected. The best price shown on the category card can occasionally be lower than idealo's own offer list (a cached or conditional price), so use the offers for exact shop prices.

**What if the offers of a product can't be fully loaded?**
The Actor still saves the product with the offers it already collected, so you never lose a result.

**Need a custom solution or hit an issue?**
Open an issue on the Actor's **Issues tab** — feedback and feature requests are welcome.

# Actor input Schema

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

Idealo category pages to scrape, e.g. <code>https://www.idealo.de/preisvergleich/ProductCategory/19116.html</code>. Category overview pages (<code>SubProductCategory</code>) are expanded into all of their subcategories. Works for idealo.de, idealo.at, idealo.es, idealo.fr, idealo.it and idealo.co.uk.

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

Maximum number of products to scrape. Set to 0 for no limit.

## `scrapeOffers` (type: `boolean`):

Also collect every shop offer for each product - shop name, price, delivery time and the offer link. Slower and costs more per product, but gives you the full price comparison instead of just the best price.

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

Proxy settings for the scraper. The default configuration works fine in most cases.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.idealo.de/preisvergleich/ProductCategory/19116.html"
    }
  ],
  "maxItems": 50,
  "scrapeOffers": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.idealo.de/preisvergleich/ProductCategory/19116.html"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/idealo-listings-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 = { "startUrls": [{ "url": "https://www.idealo.de/preisvergleich/ProductCategory/19116.html" }] }

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/idealo-listings-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 '{
  "startUrls": [
    {
      "url": "https://www.idealo.de/preisvergleich/ProductCategory/19116.html"
    }
  ]
}' |
apify call piotrv1001/idealo-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,piotrv1001/idealo-listings-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/EWG5sKtGcsJi6lHUI/builds/K0qvXckocM8MAyaqy/openapi.json
