# Idealo Price Comparison Germany & France (`anyprice/idealo-price-comparison`) Actor

Compare prices on idealo.de and idealo.fr by EAN/GTIN, product ID, keyword or URL. Get every shop offer with price, shipping, total and shop rating as JSON.

- **URL**: https://apify.com/anyprice/idealo-price-comparison.md
- **Developed by:** [Anyprice](https://apify.com/anyprice) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.20 / 1,000 results

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

## Idealo Price Comparison Germany & France

Pull idealo price comparison data from idealo.de (Germany) and idealo.fr (France) as JSON. Search by EAN/GTIN, idealo product ID, keyword or product URL and get every shop offer idealo lists, with price, shipping, total and shop rating.

On idealo.de you can also look up a shop's profile by its idealo shop ID.

### What it does

idealo is a price comparison portal: one product page lists the offers of many online shops. This Actor reads those pages for you. For a product it returns:

- product data: idealo product ID, name, idealo URL, EAN, brand, description, images, rating
- the price range on idealo (`price_min`, `price_avg`, `price_max`) and the number of offers
- each shop offer: shop name and URL, shop type, marketplace name, price, shipping, total, currency, condition, delivery text, voucher and free-return flags, shop rating and number of shop reviews

When a barcode does not lead to a dedicated idealo product page but to a search or category page, each offer is matched against the product you asked for. The offer then carries a `classification` (for example `same_variant`, `multipack` or `different_product`) and a `confidence`, so you can drop offers that are not your product.

### Who it is for

- Online shops selling in Germany or France that want to see where they stand on idealo for their own EANs.
- Brands and manufacturers checking which shops list their products on idealo.de and idealo.fr, and at what total price.
- Buyers and category managers comparing German and French price levels for the same EAN list.
- Developers who need idealo offer data in their own tools without maintaining a scraper.

### Input

| Field | Type | Default | Notes |
|---|---|---|---|
| `operation` | string | `search-by-gtin` | What the values are. See the table below |
| `values` | array of strings | (required) | 1 to 50 unique values per run. Blank lines and duplicates are removed |
| `country` | string | `de` | `de` for idealo.de, `fr` for idealo.fr |

| `operation` | Value | What you get |
|---|---|---|
| `search-by-gtin` | EAN, GTIN or UPC barcode | Product with all shop offers |
| `search-by-id` | idealo product ID | Product with all shop offers |
| `search-by-url` | idealo product URL from the same country as `country` | Product with all shop offers |
| `search-by-term` | Search text, for example a product name | The best matching listing (ID, name, URL, lowest price, offer count). `offers` is empty; run `search-by-id` with the returned ID to get the offers |
| `shop-info` | idealo shop ID | Shop profile and top products. idealo.de only |

All values in one run use the same operation. `shop-info` with `country` set to `fr` is rejected before anything is looked up.

#### Input example

```json
{
  "operation": "search-by-gtin",
  "values": ["4009803341163", "4006381333931"],
  "country": "de"
}
```

### Output

One row per value, in the order you entered them. Key fields for product lookups:

| Field | Meaning |
|---|---|
| `query`, `operation`, `country` | What was asked, and on which idealo site |
| `status` | `found`, `not_found` or `error` |
| `result.id`, `result.name`, `result.url` | idealo product ID, product name and idealo page |
| `result.page_type` | What kind of idealo page the data came from: a product page or a search/category page |
| `result.price_min`, `result.price_max`, `result.offers_count` | Price range and number of offers on idealo |
| `result.offers[].shop_name`, `.shop_url` | The shop |
| `result.offers[].price`, `.shipping`, `.total` | Item price, shipping, and both together |
| `result.offers[].shop_review_rating`, `.shop_review_count` | The shop's rating on idealo |
| `result.offers[].availability_text` | Delivery text as idealo shows it |
| `result.offers[].classification`, `.confidence` | How well the offer matches the product you asked for |
| `errorCode`, `statusCode`, `error` | Only on `error` rows |

Example `found` row for a barcode (product, shops and prices are illustrative):

```json
{
  "query": "4009803341163",
  "operation": "search-by-gtin",
  "country": "de",
  "status": "found",
  "result": {
    "id": "203496740",
    "name": "Example stainless steel kitchen scale",
    "url": "https://www.idealo.de/preisvergleich/OffersOfProduct/203496740.html",
    "ean": "4009803341163",
    "brand": "Example Brand",
    "price_min": 21.9,
    "price_avg": 23.4,
    "price_max": 24.9,
    "offers_count": 2,
    "page_type": "product",
    "offers": [
      {
        "shop_name": "Example Küchenwelt",
        "shop_url": "https://www.example-kuechenwelt.de",
        "shop_type": "standalone-shop",
        "marketplace_name": null,
        "shop_review_rating": 4.6,
        "shop_review_count": 1830,
        "position": "0",
        "condition": "new",
        "currency": "EUR",
        "price": 21.9,
        "shipping": 4.95,
        "total": 26.85,
        "voucher": false,
        "free_return": null,
        "availability_text": "Lieferung in 1-3 Werktagen",
        "classification": "product_page_match",
        "confidence": "high"
      },
      {
        "shop_name": "Example Haushaltsprofi",
        "shop_url": "https://www.example-haushaltsprofi.de",
        "shop_type": "standalone-shop",
        "marketplace_name": null,
        "shop_review_rating": 4.9,
        "shop_review_count": 412,
        "position": "1",
        "condition": "new",
        "currency": "EUR",
        "price": 24.9,
        "shipping": 0,
        "total": 24.9,
        "voucher": false,
        "free_return": true,
        "availability_text": "Auf Lager, Lieferung in 1-2 Werktagen",
        "classification": "product_page_match",
        "confidence": "high"
      }
    ],
    "source": "idealo",
    "country": "de",
    "fetched_at": "2026-10-15T08:12:40.000Z"
  }
}
```

Notice that the offer with the lower item price is not the cheaper one once shipping is added. Compare offers on `total`.

On a product page every offer belongs to the product, so offers are `product_page_match`. On search or category pages you can see `same_variant`, `likely_same_variant`, `same_family_different_variant`, `different_product`, `multipack` or `unclear`. Keep the classifications you trust and drop the rest.

For `shop-info`, `result` holds a `shop` object (name, URL, address, rating, payment and shipping methods, shipping costs, legal links, top categories) and a `top_products` list.

### Billing

Pay per event; the **Pricing** tab has the current rates.

- **Charged:** one `query-result` event per row with status `found` or `not_found`.
- **Free:** every `error` row: invalid values, timeouts, blocked pages and limit errors.

On a free Apify plan the number of idealo results is limited. For barcode and product ID lookups the whole run is checked against your remaining allowance before it starts; if it does not fit, every value comes back as a free `free_limit_reached` row. Upgrading your Apify plan removes the limit.

### Limits, statuses and errors

- 50 values per run.
- Up to 50 idealo lookups from this Actor can be in progress for your account at once, across all runs. One full run of 50 uses all of it, so run batches one after another, or split the list into smaller runs if you want them in parallel. When capacity is full, the Actor waits (15 to 240 seconds, five tries) before returning `concurrency_limit_reached`.
- Barcode and product ID lookups run as one batch and are written when the batch is done. Term, URL and shop lookups run one by one and each row is written as soon as it is ready.
- A run has an 890-second budget. Lookups that have not finished by then come back as free `timeout` rows, and everything that did finish is kept.

`not_found` means idealo does not list the product, on a product page or on a search or category page.

| `errorCode` | `statusCode` | Meaning |
|---|---|---|
| `invalid_input` | 400 | The value does not fit the selected operation |
| `free_limit_reached` | 402 | The free plan allowance does not cover the run |
| `timeout` | 408 | The lookup did not finish within the run's budget |
| `concurrency_limit_reached` | 429 | Your account already had 50 idealo lookups running |
| `blocked` | 500 | idealo could not be fetched for this value right now |
| `internal_error` | 500 | Any other failure |

The run always ends as **Succeeded**, even if every row failed. Look at each row's `status`; the run's status message gives a summary.

### FAQ

**Can I use idealo.at, idealo.it or idealo.es?**
Not with this Actor. It covers idealo.de and idealo.fr.

**Why does `search-by-term` return no offers?**
A keyword search returns the best matching idealo listing, not its shop offers. Take `result.id` from that row and run it again with `search-by-id`.

**Which URLs work with `search-by-url`?**
idealo product URLs from the site set in `country`. For idealo.fr URLs, set `country` to `fr`.

**Is the cheapest offer always first?**
Offers come in idealo's order with their `position`. Sort by `total` if you want the cheapest price including shipping.

**How do I monitor prices over time?**
Save your input as a task and add an Apify [schedule](https://docs.apify.com/platform/schedules). Each run stores a new dataset you can compare with the previous one.

Questions or higher limits: support@anyprice.dev

# Actor input Schema

## `operation` (type: `string`):

Which Idealo lookup to run for every value.

## `values` (type: `array`):

One entry per lookup: GTINs/EANs, Idealo product IDs, search terms, product URLs, or shop IDs — matching the selected operation. Maximum 50 per run.

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

Idealo marketplace to query. Shop info supports Germany only.

## Actor input object example

```json
{
  "operation": "search-by-gtin",
  "values": [
    "4009803341163"
  ],
  "country": "de"
}
```

# Actor output Schema

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

All lookup results in the default dataset — one item per input value.

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

// Run the Actor and wait for it to finish
const run = await client.actor("anyprice/idealo-price-comparison").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 = { "values": ["4009803341163"] }

# Run the Actor and wait for it to finish
run = client.actor("anyprice/idealo-price-comparison").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 '{
  "values": [
    "4009803341163"
  ]
}' |
apify call anyprice/idealo-price-comparison --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,anyprice/idealo-price-comparison"
        }
    }
}
```

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/TU523ThuwKzLG2bvv/builds/ftBSpI5hMCqsyhD7P/openapi.json
