Idealo Price Scraper: All Shop Offers, 6 Countries, No Login
Pricing
from $3.80 / 1,000 product with offers
Idealo Price Scraper: All Shop Offers, 6 Countries, No Login
Search idealo or paste product URLs and get every shop offer per product: price, shipping, total price, delivery time, shop rating and shop link, plus best price, category, brand, GTIN and rating. idealo.de, .at, .fr, .it, .es and .co.uk. No login.
Pricing
from $3.80 / 1,000 product with offers
Rating
0.0
(0)
Developer
Cliqto Media
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Idealo Price Scraper reads idealo price comparison pages and returns every shop offer for a product: shop, price, shipping, total price, delivery time, shop rating and shop link. It works on idealo.de, idealo.at, idealo.fr, idealo.it, idealo.es and idealo.co.uk.
Use it to track prices, compare shops or check your own shop against other sellers. The smallest run is one search word, for example airpods pro, and it gives you 10 products with their offers in about 30 seconds after the run starts. No login, no API key.

Table of contents
- What it does
- Quick start
- Use cases
- Input
- Output
- Pricing and limits
- API, export and integrations
- Troubleshooting
- FAQ
- Support
What it does
idealo is a price comparison site. For one product it lists many shops and their prices. This Actor opens those pages for you and saves the data as rows.
- Search mode: you type keywords. The Actor takes the products from the first results page of each search, in idealo's order, and reads each product page.
- Products mode: you paste idealo product URLs or product IDs. The Actor reads exactly those products. URLs can come from different countries in one run.
One dataset row = one product. The row has product data (title, brand, GTIN/EAN, category, best price, highest price, number of offers, rating) and a list offers with the shops.
Good fit
- Watch the price of your products in several countries every day.
- See all shops that sell a product, with shipping and total price, not only the cheapest one.
- Find a product's GTIN/EAN, brand and category from a keyword.
Not a fit / limits
- Only the 6 idealo sites above. Other countries and other price comparison sites are not supported.
- Search mode reads only the first results page of each search. Single-shop offers without an idealo price comparison page are skipped.
- Up to 200 products and up to 200 offers per product in one run (20 offers per product by default).
- Prices are what idealo shows at the time of the run. Shops can change prices at any time.
- Used and refurbished offers are not in the offer list (idealo shows them separately).
Quick start
- Open the Input tab.
- Keep What to scrape =
Searchand the prefilled queryairpods pro. - Keep idealo site =
idealo.de (Germany)and Max products =10. - Click Start.
- Open the Output tab. The
Productsview shows one row per product; theAll offersview shows one row per shop offer.
Expected result: 10 AirPods products, each with up to 20 shop offers, in about 30 seconds.
Use cases
| Buyer job | Input path | Output entity | Key fields | Next integration |
|---|---|---|---|---|
| Track prices of my product list | mode: products, productUrls | product row | bestPrice, offerCount, offers[].totalPrice | Schedule + Google Sheets or webhook |
| Compare shops for one product | productUrls, maxOffersPerProduct: 100 | offers | offers[].shop, price, shipping, availability | CSV / Excel export |
| Find products and EANs by keyword | mode: search, queries | product row | title, gtin, brand, category | API / JSON |
| Compare one product across countries | the same product ID as URLs on several idealo sites | product row per site | domain, currency, bestPrice | API / JSON |
Input
Input fields
| Field | Plain name | Type | Required | Default / prefill | Allowed values | Effect | Example | Recommendation |
|---|---|---|---|---|---|---|---|---|
mode | What to scrape | string | no | default and prefill search | search, products | Search by keywords or read pasted products | "products" | If you send only productUrls by API, products mode is used |
queries | Search queries | array of strings | in search mode | prefill ["airpods pro"] | up to 20 | One idealo search per query | ["airpods pro", "galaxy s25"] | Use product-like words, not one shop's offer title |
productUrls | Product URLs or IDs | array of strings | in products mode | empty | up to 200; idealo product URLs of the 6 sites or numeric IDs | Reads these product pages | ["https://www.idealo.fr/prix/207671730/apple-airpods-pro-3.html", "207671730"] | Bare IDs are read on the site in domain |
domain | idealo site | string | no | default and prefill de | de, at, fr, it, es, co.uk | Site for searches and bare IDs | "fr" | URLs always use their own site |
maxItems | Max products | integer | no | prefill 10; empty = 10 for search, all pasted products in products mode | 1–200 | Stops after this many products | 50 | Main cost control |
maxOffersPerProduct | Max offers per product | integer | no | default 20 | 0–200 | Offers per product row | 100 | 0 = product data and best price only |
proxyConfiguration | Proxy | object | no | no proxy | Apify Proxy settings (automatic or datacenter groups; residential is not supported) | Sends requests through a proxy | {"useApifyProxy": true} | Turn on only if runs report a block |
Empty or missing queries in search mode, or no product URLs in products mode, fail the run with a clear message before any idealo request. Duplicate products are read once and counted in RUN_SUMMARY as duplicatesSkipped. Invalid URLs (not idealo, unsupported country) become free error rows; the run continues.
Interacting settings
| When | Input A | Input B | Effective behavior | Example | Cost/result effect |
|---|---|---|---|---|---|
| Search mode | queries | maxItems | Queries run in order until maxItems products are saved | 3 queries, maxItems: 10 | Later queries may not run |
| Products mode | productUrls | maxItems | Only the first maxItems inputs are read | 200 URLs, maxItems: 50 | 50 products read |
| Products mode | productUrls (URL) | domain | A URL keeps its own site; domain is only for bare IDs | .fr URL + domain: de | Read on idealo.fr |
| More than 20 offers | maxOffersPerProduct | timeout | Every 20 offers after the first 20 is one more page | maxOffersPerProduct: 200 | One extra offer-page event per page; longer run |
Input examples
Search one keyword on idealo.de
{"mode": "search","queries": ["airpods pro"],"domain": "de","maxItems": 10}
Expected behavior: one search, then the first 10 products of the results page.
Expected output: 10 rows with title, bestPrice, offerCount and up to 20 offers.
Limit or cost note: Actor start + 1 country site + 1 search query + 10 products.
Products from several countries
{"mode": "products","productUrls": ["https://www.idealo.de/preisvergleich/OffersOfProduct/207671730_-airpods-pro-3-apple.html","https://www.idealo.fr/prix/207671730/apple-airpods-pro-3.html","https://www.idealo.co.uk/compare/207671730/apple-airpods-pro-3.html"],"maxOffersPerProduct": 60}
Expected behavior: the same product on 3 sites; prices in EUR for .de/.fr and GBP for .co.uk. Expected output: 3 rows, each with up to 60 offers. Limit or cost note: Actor start + 3 country sites + 3 products + up to 2 extra offer pages per product. Products are read site by site, so the order of rows can differ from your list.
Output
Output fields
| Field | Meaning | Type | Can be empty? | Example / enum | Source / notes |
|---|---|---|---|---|---|
status | Result of this row | string | no | complete, partial, not_found, error | See "Output entities" below |
productId | idealo product ID | string | null for invalid input | "207671730" | Same ID on all idealo sites |
title | Product name | string | yes | "Apple AirPods Pro 3" | Product page |
url | Product page | string | no | idealo URL | Your input text for invalid entries |
domain | Site of this row | string | no | "de" | |
category, categoryId | Category | string | yes | "Kopfhörer", "2520" | Category name in the site's language |
brand | Brand | string | yes | "Apple" | |
gtin | GTIN / EAN | string | yes | "0195950543650" | Only when idealo lists one |
imageUrl | Product image | string | yes | idealo CDN URL | |
currency | Currency | string | yes | "EUR", "GBP" | |
bestPrice | Lowest offer price (no shipping) | number | yes | 193 | null when idealo has no new offers |
highestPrice | Highest offer price | number | yes | 281.95 | For all offers on the site, not only returned ones |
offerCount | Number of offers on idealo | integer | yes | 57 | Can be more than offersReturned |
offersReturned | Offers in this row | integer | no | 20 | Up to maxOffersPerProduct |
rating, ratingCount | Product rating | number, integer | yes | 4.6, 10 | null when not rated |
offers[].position | Rank in idealo order | integer | no | 1 | Cheapest item price first |
offers[].shop, shopId | Shop | string | yes | "kaufland.de", "26895" | Marketplace name for marketplace offers |
offers[].marketplaceSeller | Seller inside a marketplace | string | yes | "pricerush" | null for direct shop offers |
offers[].offerTitle | Title used by the shop | string | yes | ||
offers[].price | Item price | number | yes | 193 | Without shipping |
offers[].shipping | Shipping cost | number | yes | 9.99 | 0 = free shipping; null = the shop does not state it |
offers[].totalPrice | Price with shipping | number | yes | 202.99 | null when shipping is unknown |
offers[].availability | Delivery text | string | yes | "Lieferung: bis Sa. 17.10." | As shown, in the site's language |
offers[].shopRating, shopRatingCount | Shop rating | number, integer | yes | 4.5, 56444 | |
offers[].url | Link to the offer | string | yes | idealo redirect URL | Opens the shop page |
searchQuery, searchPosition | How the product was found | string, integer | yes | "airpods pro", 1 | Search mode only |
input | Your URL or ID | string | yes | "207671730" | Products mode only |
error | Why the row is not complete | string | yes | null for complete rows | |
source, fetchedAt | Source and time | string | no | "idealo", ISO time |
Output entities and surfaces
| Situation | Dataset/API/KVS/live view | Result shape | User action |
|---|---|---|---|
| Normal item | Dataset, views Products and All offers | status: complete, product fields and offers | Export or use the fields |
| Product without new offers | Dataset | complete, offerCount: 0, bestPrice: null, empty offers | idealo lists only used offers or no shops now |
| Search without products | Key-value store RUN_SUMMARY | no row; query in queriesWithoutResults | Try a more general query |
| Product does not exist | Dataset | status: not_found, error text | Check the ID or URL |
| Invalid input entry | Dataset | status: error, productId: null, your text in input | Fix the URL |
| Product page could not be read | Dataset | status: error, error text, not charged; 3 such pages in a row stop the run with SOURCE_ERROR | Run again later |
| Some offers could not be read | Dataset | status: partial, offers read so far, error | Run the product again |
| idealo blocked or did not answer | RUN_SUMMARY (stopReason: SOURCE_ERROR), run status Failed | rows saved before the problem stay | Run again later or turn on the proxy |
RUN_SUMMARY also has counts (complete, partial, notFound, error, saved, offers, duplicatesSkipped), warnings and stopReason (TIMEOUT, CHARGE_LIMIT, CANCELLED or null). Its domain field is the domain from your input; rows can come from other sites when you paste URLs.
Output example
{"status": "complete","productId": "207671730","title": "Apple AirPods Pro 3","url": "https://www.idealo.de/preisvergleich/OffersOfProduct/207671730_-airpods-pro-3-apple.html","domain": "de","category": "Kopfhörer","categoryId": "2520","brand": "Apple","gtin": "0195950543650","currency": "EUR","bestPrice": 193,"highestPrice": 281.95,"offerCount": 57,"offersReturned": 20,"rating": 4.6,"ratingCount": 10,"offers": [{"position": 1,"shop": "kaufland.de","shopId": "26895","marketplaceSeller": "pricerush","price": 193,"shipping": 9.99,"totalPrice": 202.99,"currency": "EUR","availability": "Lieferung: bis Sa. 17.10.","shopRating": 4.5,"shopRatingCount": 56444}],"searchQuery": "airpods pro","searchPosition": 1,"input": null,"error": null,"source": "idealo"}
This example is trimmed: one of 20 offers, and some fields (imageUrl, offerTitle, url, fetchedAt) are left out. null means idealo does not show the value; it never means 0. For example, shipping: null means the shop does not state its shipping cost on idealo ("see shop").
Pricing and limits
Pricing unit
This Actor uses pay per event. You pay only for these events; platform usage is included.
| Event | Price | When |
|---|---|---|
| Actor start | $0.009 per GB of memory ($0.018 per run at 2 GB) | Once per run |
| Country site | $0.0045 | Once for each idealo country site the run opens (idealo.de, .fr, …), after its first successful page |
| Product with offers | $0.0045 (Free plan), $0.0042 (Bronze), $0.004 (Silver), $0.0038 (Gold and higher) | Each complete or partial row, with up to 20 offers |
| Extra offer page | $0.0015 | Each further 20 offers that were read (only when maxOffersPerProduct is above 20) |
| Search query | $0.002 | Each search results page read, also when it has no products |
| Product not found | $0.002 | Each not_found row |
Invalid input entries (error rows) are free. A run with a search that finds nothing costs the start fee, one country site and one search query, about $0.0245. If idealo blocks the run, you pay only for events that happened before the stop.
Set Max total charge in run options to cap the cost. The Actor stops before it goes over the cap; rows that were already saved stay (stopReason: CHARGE_LIMIT).
Cost examples
Free plan prices, 2 GB memory.
| Scenario | Input scope | Events | Base charge | Optional charge | Stop/cap behavior |
|---|---|---|---|---|---|
| Prefill | 1 query, 10 products, 20 offers | start + 1 site + 1 query + 10 products | $0.018 + $0.0045 + $0.002 + $0.045 = $0.0695 | none | — |
| 100 products | 10 queries on one site, 100 products | start + 1 site + 10 queries + 100 products | $0.018 + $0.0045 + $0.02 + $0.45 = $0.4925 | none | Max total charge stops earlier |
| 6 countries | 6 product URLs, one per idealo site | start + 6 sites + 6 products | $0.018 + $0.027 + $0.027 = $0.072 | none | — |
| Deep offer list | 1 product, maxOffersPerProduct: 200, 57 offers on idealo | start + 1 site + 1 product + 2 extra pages | $0.018 + $0.0045 + $0.0045 = $0.027 | $0.003 | Only pages that exist are read |
| Nothing found | 1 query without products | start + 1 site + 1 query | $0.0245 | none | — |
Limits
- Up to 20 search queries and 200 product URLs or IDs per run; at most 200 products saved.
- Up to 200 offers per product.
- Default timeout is 900 seconds; 200 products with 20 offers take about 5 minutes. With many offers per product (100+), raise the timeout in run options.
- Memory is fixed at 2 GB (a real Chrome browser is used).
API, export and integrations
- API: start a run with the input JSON above and read the dataset items (Apify API docs). The
All offersview returns one row per shop offer. - Export: JSON, CSV, Excel, XML or HTML from the Output tab or the dataset API.
- Scheduling: create a schedule in Apify Console to collect prices every day.
- Webhooks / no-code: use an Apify webhook or the Make, Zapier or n8n integrations to send new rows to your sheet or database.
Use with AI agents (MCP)
See the Apify MCP server docs.
- MCP server URL with only this Actor:
https://mcp.apify.com?tools=cliqtomedia/idealo-price-scraper - Smallest useful input:
{"mode": "search", "queries": ["airpods pro"], "domain": "de", "maxItems": 10} - Key output fields:
title(product),bestPrice(lowest item price),offers[].shop(shop name),offers[].totalPrice(price with shipping, null if not stated),status(complete,partial,not_found,error). - The prefill run takes about 30 seconds and costs about $0.07. Limits: 200 products, 200 offers per product, 6 idealo sites.
Troubleshooting
The run saved 0 products for my search
Symptom: the dataset is empty and RUN_SUMMARY.queriesWithoutResults lists your query.
Likely reason: idealo found no product comparison pages. For very specific words idealo often shows only single-shop offers; the summary then has a warning about it.
Check: search the same words on the idealo site in your browser.
Action: use a shorter, more general query, or paste the product URL in products mode.
A product has bestPrice: null and no offers
Symptom: status: complete, offerCount: 0.
Likely reason: idealo lists no new offers for this product now (often only used ones, which idealo shows separately).
Action: nothing is wrong with the run; check again later.
shipping and totalPrice are null for some offers
Symptom: price is set, shipping is null.
Likely reason: the shop does not state the shipping cost on idealo (for example "Spese di spedizioni addizionali, vedi negozio").
Action: open offers[].url to see the cost in the shop.
The run failed with a source error
Symptom: run status Failed, RUN_SUMMARY.stopReason: SOURCE_ERROR.
Likely reason: idealo blocked the requests, did not answer within 20 seconds (including retries), or its product pages changed so they could not be read.
Check: the rows saved before the error are still in the dataset.
Action: run again later, or turn on Apify Proxy (automatic group) in Proxy.
The run stopped with TIMEOUT
Symptom: fewer products than maxItems, stopReason: TIMEOUT.
Action: raise the timeout in run options, or lower maxItems or maxOffersPerProduct.
FAQ
Do I need an idealo account or an API key?
No. The Actor reads the public idealo pages. No login, no API key.
Is the output the same as other idealo scrapers?
The prices, shops and product IDs are the same as on idealo, but field names are different (for example title, gtin and a nested offers list). If you move from another Actor, map the fields once.
Why is offerCount bigger than the number of offers I got?
You get up to maxOffersPerProduct offers (default 20). Set a bigger number to get more; each further 20 offers is one extra offer page event.
Are the prices live?
Yes, they are read at run time. fetchedAt shows when. idealo and shops can change prices at any time.
Why are the rows not in the same order as my URLs?
In products mode the Actor reads all products of one idealo site, then the next site. This keeps the run fast and cheap. Use input to match rows with your list.
Is this an official idealo tool?
No. This Actor is not affiliated with or endorsed by idealo internet GmbH. It reads public pages of idealo. Check that your use of the data follows idealo's terms and the laws that apply to you.
Support
For a bug, a question or a feature request, open an issue in the Issues tab of this Actor. Include the run ID, your input (queries or product URLs) and the error or RUN_SUMMARY text. Never send tokens, cookies or billing data.