# Idealo Price Data API (`pricepirate/idealo-price-data-api`) Actor

Real-time Idealo price data across 6 European markets. Look up any product by EAN/GTIN, ID, search term, or URL

- **URL**: https://apify.com/pricepirate/idealo-price-data-api.md
- **Developed by:** [PricePirate](https://apify.com/pricepirate) (community)
- **Categories:** E-commerce, Developer tools, Other
- **Stats:** 13 total users, 9 monthly users, 99.2% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 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.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 Price Comparison Data API

Tap into **Idealo**, one of Europe's largest price-comparison portals, through a
single clean Actor. Look up a product by **barcode (GTIN/EAN), Idealo product
ID, product URL, or search term** to get the full list of merchant offers
Idealo shows for it: prices, shipping, totals, delivery/availability, shop
ratings and voucher flags — all in one unified JSON structure. You can also
pull **shop profiles** (metadata, ratings, payment & shipping info, top
products) by Idealo shop ID.

Built by [PricePirate](https://pricepirate.com), a
[UCX Media](https://gaponik.com) product — full developer documentation lives
at [pricepirate.com/docs](https://pricepirate.com/docs/en/solutions/idealo-api).

Perfect for price-comparison sites,
[repricing](https://pricepirate.com/docs/en/solutions/idealo-repricing) and
margin tools, [price monitoring](https://pricepirate.com/docs/en/solutions/price-monitoring)
and [dynamic pricing](https://pricepirate.com/docs/en/solutions/dynamic-pricing)
engines, deal & coupon apps, browser extensions, dropshipping and product
research, and AI shopping assistants targeting European markets.

### ✓ 5 Ways to Look Up Idealo Data

Choose whichever identifier you already have:

| Operation | Value format | Returns |
|---|---|---|
| `search-by-gtin` | GTIN / EAN / UPC barcode, 8–14 digits | Product with all merchant offers |
| `search-by-id` | Idealo product ID (e.g. `207562448`) | Product with all merchant offers |
| `search-by-url` | Idealo product URL | Product with all merchant offers |
| `search-by-term` | Free-text search term (e.g. `iphone 16`) | Best-matching product listing (no per-merchant offers) |
| `shop-info` | Numeric Idealo shop ID | Shop profile + top products (Germany only) |

> **search-by-term** returns the top-matching **listing** — id, name, URL,
> images, rating, lowest price, and offer count — with an empty `offers` array.
> To pull the full per-merchant offer breakdown, follow up with
> **search-by-id** using the returned product `id`. More on the difference
> between listings and offers
> [in the docs](https://pricepirate.com/docs/en/guide/concepts/listings-and-offers).

### ✓ 6-Country Coverage

Query localized pricing across Idealo's European marketplaces:

Germany (`de`, default), Austria (`at`), Spain (`es`), France (`fr`),
Italy (`it`), United Kingdom (`uk`).

`shop-info` currently supports Germany (`de`) only.

### ✓ Complete Multi-Merchant Offer Data

For a barcode, ID, or URL lookup you get the full competitive landscape for the
matched product:

- **Product:** title, listing URL, matched ID, EAN, brand, description, image
  gallery, categories, review rating and review count
- **Price summary:** lowest price, highest price, average price, total offer
  count
- **Per-merchant offers:** shop name, shop URL, shop type (standalone vs.
  marketplace), marketplace name, price, shipping cost,
  [total price](https://pricepirate.com/docs/en/guide/concepts/total-price)
  (price + shipping — the number Idealo actually ranks by), currency, item
  condition, delivery/availability, voucher and free-return flags, and ranking
  position
- **Store trust signals:** per-shop review rating and review count

### ✓ Bypass Idealo Bot Protection

We handle the hard part — rotating infrastructure and anti-bot evasion — so you
get clean, structured data without managing proxies, headless browsers, or
fighting blocks yourself. No job polling either: start the Actor with your
values and read the finished results straight from the dataset.

### 💻 Input

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

- **`operation`** (required): one of `search-by-gtin`, `search-by-id`,
  `search-by-term`, `search-by-url`, `shop-info`. All values in a run share the
  same operation.
- **`values`** (required): 1–25 strings, each one lookup — barcodes, product
  IDs, search terms, product URLs, or shop IDs, matching the selected
  operation. Duplicates and blank entries are dropped. Run the Actor multiple
  times for larger lists.
- **`country`** (optional, default `de`): 2-letter marketplace code — `de`,
  `at`, `es`, `fr`, `it`, `uk`. URLs passed to `search-by-url` must belong to
  the same country.

### 💻 Output

One dataset item per input value:

```json
{
  "query": "4009803341163",
  "operation": "search-by-gtin",
  "country": "de",
  "status": "found",
  "result": {
    "id": "207562448",
    "name": "Example Product Name",
    "url": "https://www.idealo.de/preisvergleich/OffersOfProduct/207562448",
    "ean": "4009803341163",
    "brand": "Example Brand",
    "description": "Short spec summary from the listing",
    "image_urls": ["https://cdn.idealo.com/…/product.jpg"],
    "review_rating": 4,
    "review_count": 312,
    "categories": null,
    "category_ids": null,
    "price_min": 129.0,
    "price_avg": 142.5,
    "price_max": 159.0,
    "offers_count": 8,
    "offers": [
      {
        "sellerId": "Example Store",
        "shop_name": "Example Store",
        "shop_url": "http://www.example-store.de",
        "shop_type": "standalone-shop",
        "marketplace_name": null,
        "shop_review_rating": 5,
        "shop_review_count": 1240,
        "position": "0",
        "condition": "new",
        "currency": "EUR",
        "price": 129.0,
        "shipping": 4.99,
        "total": 133.99,
        "voucher": false,
        "free_return": null,
        "availability_code": "short",
        "availability_text": "Lieferung in 1-2 Werktagen"
      }
    ],
    "source": "idealo",
    "country": "de",
    "fetched_at": "2026-07-17T12:00:03.000Z"
  }
}
```

For **`shop-info`**, `result` contains the shop profile instead:

```json
{
  "query": "123456",
  "operation": "shop-info",
  "country": "de",
  "status": "found",
  "result": {
    "shop": {
      "id": "123456",
      "name": "Example Store",
      "url": "http://www.example-store.de",
      "logo_url": "https://cdn.idealo.com/…/logo.png",
      "description": "…",
      "address": { "street": "…", "zip": "…", "city": "…", "country": "DE" },
      "review_rating": 4.6,
      "review_count": 1240,
      "payment_methods": ["PayPal", "Kreditkarte"],
      "shipping_methods": ["DHL"],
      "shipping_costs": {
        "inland": "4,99 €",
        "foreign": null,
        "free_from": "50,00 €",
        "min_order_value": null
      },
      "legal_urls": { "terms": "…", "imprint": "…" },
      "top_categories": ["Haushalt"]
    },
    "top_products": [
      {
        "id": "207562448",
        "title": "Example Product",
        "category": "Haushalt",
        "url": "https://www.idealo.de/…",
        "image": "https://cdn.idealo.com/…",
        "price": 129.0,
        "delivery_price": null,
        "currency": "EUR",
        "offers_count": 8,
        "review_rating": 4,
        "review_count": 312,
        "test_note": null,
        "available": true
      }
    ],
    "source": "idealo",
    "country": "de",
    "fetched_at": "2026-07-17T12:00:03.000Z"
  }
}
```

### 💻 Statuses & Errors

`status` is `found`, `not_found`, or `error`.

**`not_found`** means the product is not listed on Idealo. For
`search-by-gtin` and `search-by-id` it can also mean there is no dedicated
**product overview page** — the page listing all offers for that specific
product. The product may still appear on a product search page, but search
results are not reliable enough for EAN matching, so they are not used. The
upside: when a lookup does return `found`, the EAN match against the product
overview page is almost 100% reliable.

Error items have `result: null` and carry a stable `errorCode`:

- `blocked` — Idealo could not be fetched for this value right now
- `timeout` — the lookup did not finish within the per-query deadline
- `invalid_input` — the value does not match the selected operation
- `internal_error` — an unexpected upstream failure
- `charge_limit_reached` — skipped because the run's maximum charge was hit
- `free_limit_reached` — the free plan's lifetime result allowance is used up

Error items are **never charged**.

### 💰 Pricing

You pay **per successful query result**: each query that completes with
`found` or `not_found` is charged once. Failed queries — errors and timeouts —
are always free. A run succeeds if at least one query completes and fails only
when nothing came back (in which case nothing was charged).

**Example:** a batch contains 20 queries; 10 come back `found`, 5 come back
`not_found`, and 5 time out. You are charged for the 15 successful results —
the 5 timeouts are free.

There are no separate Apify platform usage charges — you only pay for
successful requests.

**Free Apify plans are capped at 50 results in total.** The cap is per Apify
account and counts every query that came back `found` or `not_found`, across
all runs. It does not reset — once the 50 are spent, further queries return
`free_limit_reached` instead of a result. Errors and timeouts never count
toward it, the same way they are never charged. Upgrade your Apify plan to
remove the cap.

When a run hits the cap, the capped queries are written to the dataset as
`free_limit_reached` error items whose `error` names how much of the allowance
is used (for example `Free tier limit reached: 50 of 50 results used. Upgrade
your Apify plan to continue.`), and the run's status message says the same. If
the cap was already spent when the run started, so nothing at all came back,
the run fails with that message rather than a generic failure. Nothing is
charged either way.

### ⏱ Timing

All values in a run are looked up in parallel, and each result is written to
the dataset the moment its lookup finishes. The average job takes 1–2 minutes.
Each query is given at most 900 seconds before it is reported as a `timeout`
error (uncharged).

### ⏱ Timeouts

Each query is given at most **900 seconds** before it is reported as a
`timeout` error. While most jobs take 1–2 minutes, some take longer: the Actor
tries multiple scraping methods per query to maximize the final success rate,
and a query only gives up after every method has been exhausted.

If you see many timeouts, try the following:

- **Use smaller batches** of requests per run
- **Spread requests throughout the day** instead of sending them all at once
- **Avoid busy times** — usually around **7–9 am UTC**, when Idealo's bot
  protection is most strict

Failed or timed-out requests are **never billed**.

### 📚 Documentation & Guides

Full documentation is hosted at **pricepirate.com/docs**:

- [Idealo API — price & offer data without building a scraper](https://pricepirate.com/docs/en/solutions/idealo-api)
- [Listings vs. offers — how Idealo data is structured](https://pricepirate.com/docs/en/guide/concepts/listings-and-offers)
- [Total price — why price + shipping decides the ranking](https://pricepirate.com/docs/en/guide/concepts/total-price)
- [Idealo repricing — automate your Idealo prices](https://pricepirate.com/docs/en/solutions/idealo-repricing)

### 📬 Contact & Support

For custom solutions or higher limits, reach out via
[pricepirate.com](https://pricepirate.com/en/get-started/?utm_source=apify\&utm_medium=docs\&utm_campaign=support) or contact us directly:
<support@pricepirate.com>.

Need a deeper build — custom pricing automation, data pipelines, or a tailored
e-commerce integration? That's what we do at
[UCX Media](https://gaponik.com), the software studio behind PricePirate.

# 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 25 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("pricepirate/idealo-price-data-api").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("pricepirate/idealo-price-data-api").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 '{
  "values": [
    "4009803341163"
  ]
}' |
apify call pricepirate/idealo-price-data-api --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/EcYzSBjbmSSaaDX9A/builds/Ed7z5tKziKxiagie8/openapi.json
