Idealo.de - Prices, Offers, Specs & Reviews
Pricing
from $0.90 / 1,000 product results
Idealo.de - Prices, Offers, Specs & Reviews
Scrape Idealo.de products with identity details, GTIN, price ranges, specifications, images, rating breakdowns and customer reviews. Get the complete merchant offer list, including prices, seller details, and offer pros and cons. Search by keyword or paste product URLs.
Pricing
from $0.90 / 1,000 product results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
10
Total users
0
Monthly active users
8 days ago
Last modified
Categories
Features
Share
Idealo Scraper: Price Comparisons, Merchant Offers & Reviews
Idealo Scraper turns idealo.de, Germany's largest price-comparison site, into structured product data. Search by keyword or paste your own idealo.de links, and get each product's price range, full merchant offer list, technical specs, images and customer reviews, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.
Why This Scraper?
- Two ways to find products. Search by keyword, or paste your own idealo.de search-result, category or product links. No need to build URLs by hand.
- A real price range, not one merchant's discount. idealo.de compares merchants rather than selling directly, so a product with full detail fetched carries the low and high price actually offered right now, plus the number of merchants listing it.
- Full merchant offer comparison on demand. Switch on detail fetching and get every listed merchant's price, shipping cost and total for a product, not just the cheapest one.
- The category's own spec table. Technical specifications come back exactly as idealo.de exposes them for that product's category, not a fixed set of fields.
- Customer reviews with a rating breakdown. Overall rating, review count, the star-by-star histogram, and the individual reviews themselves.
- Handles pagination automatically. Point it at a whole category or a saved search and it walks the result pages for you, recognizing product links and listing links on its own.
- Clear failures, not silent gaps. If the site refuses every request, the run stops with a message telling you to retry, instead of quietly returning an empty dataset that looks like a real "no results" answer.
Use Cases
- Price monitoring and repricing: track a product's lowest offer, highest offer and merchant count over time to react to competitors.
- Comparison shopping and content sites: pull specs, images and price ranges to power your own product pages or comparison widgets.
- Market and assortment research: collect category or keyword results in bulk to see which merchants and brands show up for a given search term.
- Review and sentiment analysis: gather ratings and review text per product to spot quality issues or trending complaints.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
Every record is pushed as one flat JSON object. For a search or category link, with full detail fetching off, only the lean search-result fields are populated (id, url, title, lowPrice, previewImage, offerCount); the full merchant offers list, specs, reviews, description and complete image gallery all require detail fetching to be switched on. A pasted product link always fetches and returns the full record, regardless of the detail-fetching setting. idealo.de is a price-comparison site: it shows a range across merchant offers rather than one merchant's own "was" price, so this actor does not emit a strikethrough or list-price field; lowPrice, highPrice and the offers list are the accurate representation of what idealo.de actually shows.
| Field | Example |
|---|---|
id | "512345" |
url | idealo.de link to the product |
title | "Sample Product 128GB Black" |
brand | "Sample Brand" |
category | "Sample Category/Sample Subcategory" |
gtin | "0000000000000" |
lowPrice / highPrice | 199.00 / 249.90 |
currency | "EUR" |
offerCount | 7 |
rating / reviewCount | 4.3 / 128 |
reviewBreakdown | {"5": 80, "4": 30, "3": 10, "2": 5, "1": 3} |
previewImage | preview image link |
images | full image gallery (detail mode; lean mode carries only the preview image) |
description | the product's own description text, when idealo.de shows one |
specs | the full spec table for that category, as label/value pairs (detail mode) |
offers[].merchant / offers[].price | "Sample Shop" / 199.00 (detail mode) |
offers[].shipping / offers[].total | "kostenloser Versand" / 199.00 (detail mode) |
offers[].shopId / shopRating / shopReviewCount / shopCity / shopLogoUrl | shop id, rating, rating count, location and logo per offer (detail mode) |
offers[].position / marketplace / marketplaceSeller / offerTitle | rank, marketplace flag and seller, the shop's own offer title (detail mode) |
offers[].deliveryTime / returnPolicy / paymentMethods | delivery window, return terms, accepted payments (detail mode) |
categories / priceAvg / available / availabilityText / condition / fetchedAt | breadcrumb path, average offer price, stock flag and text, item condition, read time |
changeType / changedFields / firstSeenAt / lastSeenAt | incremental mode only (see below) |
offers[].pros / offers[].cons | [] / [] (not currently populated) |
offers[].url | merchant redirect link (detail mode) |
reviews[].author / date / text / rating | "Jane D." / "01.01.2026" / the reviewer's own text / 5.0 (detail mode) |
How to Use
- Pick a mode: Direct URLs (paste your own idealo.de search-result, category or product links) or Search by keyword.
- Or pick a lookup mode (EAN/GTIN, product ID, search term, URL) and list up to 50
values; each row then also carriesquery,operationandstatus. Lookup by ID builds the product page link from the numeric id and is skipped with a warning if the site does not serve it. - Fill in the field for that mode,
urlsorsearchQuery, and switch on Fetch full product detail if you need merchant offers, specs, the full gallery or reviews. - Set Maximum items and Maximum pages to control run size and cost, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it through the API.
Search by keyword:
{"mode": "search","searchQuery": "iphone 15","fetchDetails": true,"maxItems": 20}
A category page, with full detail:
{"mode": "url","urls": ["https://www.idealo.de/preisvergleich/ProductCategory/5292.html"],"fetchDetails": true,"maxItems": 20}
A single product page (always returns full detail):
{"mode": "url","urls": ["https://www.idealo.de/preisvergleich/OffersOfProduct/512345_-sample-product.html"]}
A wider keyword search across several result pages:
{"mode": "search","searchQuery": "waschmaschine","maxPages": 3,"maxItems": 100}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/idealo-de-price-comparison-scraper").call(run_input={"mode": "search", "searchQuery": "iphone 15", "fetchDetails": True, "maxItems": 20})for product in client.dataset(run["defaultDatasetId"]).iterate_items():print(product["title"], product["lowPrice"], product["offerCount"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/idealo-de-price-comparison-scraper').call({mode: 'search',searchQuery: 'iphone 15',fetchDetails: true,maxItems: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Supported URL shapes
| Shape | Example |
|---|---|
| Category | https://www.idealo.de/preisvergleich/ProductCategory/5292.html |
| Keyword search | https://www.idealo.de/preisvergleich/MainSearchProductCategory.html?q=iphone+15 |
| Filtered category | https://www.idealo.de/preisvergleich/ProductCategory/5292F1421457.html |
| Paginated category (offset form, starts at that page and walks forward) | https://www.idealo.de/preisvergleich/ProductCategory/5292I16-15.html |
| Product page | https://www.idealo.de/preisvergleich/OffersOfProduct/201663874_-g-shock-gbd-200-casio.html |
Behaviour change: when URLs is left untouched in URL mode, the actor now scrapes one example of each of these five shapes (previously only the single sample category). Clear the field and enter your own links to scrape just those. The shorter product link form /preisvergleich/<id>_-name.html is rewritten to the product-page form. idealo.de ignores ?sortKey= (the actor drops it and logs a warning) and does not paginate with ?page=N; for ?page=N the actor logs a warning and walks the real next-page links up to that page.
Only idealo.de (Germany) is supported. The other country sites (Austria, Spain, France, Italy, UK) sit behind a stricter edge wall and are not offered.
How multiple URLs and pages combine
Each entry in URLs is handled on its own. A product link is fetched once as a single product, with its full detail always included. A search-result or category link is treated as a paginated listing: if the link already carries a page number, that page becomes the starting point, and the actor reads up to Maximum pages pages in total counting that starting page (leave it empty or 0 to walk every page). All entries share one Maximum items cap and the run stops as soon as it's reached.
Resume and incremental mode (recurring runs)
Turn on Incremental changes for scheduled runs and schedule the actor against the same search or URL set. The first run returns every product marked NEW; later runs return only NEW, UPDATED and REAPPEARED products, each row carrying changeType, changedFields, firstSeenAt and lastSeenAt (the Changes dataset view). A product is UPDATED when any field other than the ignored ones changes, for example the lowest or highest price, the offer count, the rating or the merchant offers; customer review text is always ignored (a new review still shows through reviewCount and rating), and so are the per-offer fields that drift from day to day without the product changing: offers.deliveryTime, offers.position, offers.shopReviewCount, offers.shopRating and offers.paymentMethods (they stay in the returned row; offer price, shipping, total and merchant, and the offer count still count as changes). Unchanged products are not returned and not charged unless you turn on Emit unchanged. Emit expired (on by default) returns products that disappeared, but only after a run fully scanned the tracked search: never when Maximum items or Maximum pages cut it short, a page failed, or Resume was used. State is kept per search or URL set (override with State key) and never touches idealo.de. With fetch details off, only the lean listing fields are compared. Resume from a previous run continues one interrupted run by skipping products it already collected. With incremental mode off, output is unchanged.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each product, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | url | search (keyword), url (your own links), or a lookup mode: search-by-gtin (EAN/GTIN), search-by-id (numeric product id), search-by-term, search-by-url. Fields belonging to the other mode are ignored. |
values | array | none | Lookup modes only: up to 50 values. Each row also carries query, operation and status. Every value ends in one of three outcomes under perInput in the OUTPUT record of the key-value store and in the run log: "found": true (a product was returned, or the value resolved to a product already returned for an earlier value, marked "duplicate": true), "found": null (the page could not be loaded, so the value was not checked: say nothing about whether it exists on idealo), or "found": false (the page was read and held no product, which includes an id or product link that idealo reports as no longer existing). Only a value that returns a product produces a row; values that return nothing or could not be loaded produce no row and no charge. Product rows from search-by-id and search-by-url product links are full detail rows and are charged detail-enrichment once per delivered product. If idealo answers a GTIN or term query with the product page itself, that product is returned as a full detail row and charged detail-enrichment once, even when Fetch full product detail is off. |
searchQuery | string | none (prefill: "iphone 15") | Keyword to search for. Search mode only. |
urls | array | one example of each of the five URL shapes (also the prefill) | Your own idealo.de search-result, category or product links. URL mode only; if left empty in URL mode, the actor falls back to the same five example URLs. |
fetchDetails | boolean | true | Fetch the full product detail page: merchant offers, specs, full image gallery, description and reviews. Applies only to search-result and category links; off returns only their lean search-result fields. A pasted product link always returns full detail regardless of this setting. |
maxItems | integer | 10 | Stop after this many products across the whole run. |
maxPages | integer | none (empty or 0 walks every result page) | Maximum number of result pages to read per search or category entry. |
proxyConfiguration | object | none (prefill: Apify Proxy, Germany) | Only the country you set is used (Germany if left empty); the actor picks the connection tier itself: it starts on the standard connection and, when the store refuses it, switches to Apify Proxy's enhanced group for the rest of the run, which is billed on your own Apify plan. |
resumeFromRunId | string | none | Run ID or dataset ID of an interrupted run: products it already collected are skipped and not charged again. |
incrementalMode | boolean | false | Return only NEW, UPDATED and REAPPEARED products on recurring runs. |
stateKey | string | none | Name or share a monitoring campaign; empty derives the key from the search or URLs. Incremental mode only. |
emitUnchanged | boolean | false | Also return UNCHANGED products. Incremental mode only. |
emitExpired | boolean | true | Return EXPIRED products after a complete scan. Incremental mode only. |
ignoreFieldsForChanges | array | none | Fields whose changes alone do not count as an update. Incremental mode only. |
mcpConnectors | array | none | Optional: send a summary of each product to apps you authorized under Integrations. |
notionParentPageUrl | string | none | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. Does not affect the dataset. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"id": "512345","url": "https://www.idealo.de/preisvergleich/OffersOfProduct/512345_-sample-product.html","title": "Sample Product 128GB Black","brand": "Sample Brand","category": "Sample Category/Sample Subcategory","gtin": "0000000000000","lowPrice": 199.00,"highPrice": 249.90,"currency": "EUR","offerCount": 7,"rating": 4.3,"reviewCount": 128,"reviewBreakdown": { "5": 80, "4": 30, "3": 10, "2": 5, "1": 3 },"previewImage": "https://cdn.example.com/512345.jpg","images": ["https://cdn.example.com/512345.jpg"],"description": "The product's own description text appears here when present.","specs": { "Sample Spec Label": "Sample value" },"offers": [{"merchant": "Sample Shop","price": 199.00,"priceFormatted": "199,00 €","shipping": "kostenloser Versand","total": 199.00,"totalFormatted": "199,00 €","pros": [],"cons": [],"url": "https://www.idealo.de/relocator/relocate?sample"}],"reviews": [{"author": "Jane D.","date": "01.01.2026","title": null,"text": "The reviewer's own text appears here.","rating": 5.0}]}
Plan Requirement
idealo.de refuses ordinary datacenter and residential connections with an edge block page. In testing, only Apify Proxy's enhanced group (country Germany) returned real pages, so the actor starts on the standard connection and, as soon as the store refuses it, switches the rest of the run to the enhanced group. That group is billed on your own Apify plan at a higher rate, and a page can take 35 to 80 seconds to load, so keep Maximum items tight while testing. It needs a plan that includes Apify Proxy.
If your account cannot use proxies at all (a free plan), the log shows a boxed notice: "The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable." A run served that way logs "Served over the backup connection (the default connection was unavailable)." If nothing could be loaded the run fails with one of these messages:
- "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required."
- "No results: residential proxies are unavailable on this run (Apify free plans do not include them), and the backup connection could not load the requested idealo.de pages."
- "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search. Please try again later."
FAQ
How much does it cost?
You pay per product returned, plus a separate detail-enrichment charge for every product that gets full detail: search and category results when Fetch full product detail is switched on, and pasted product links always, since those already return full detail regardless of that setting. The detail-enrichment charge is applied once per product, right after that product is delivered to your dataset (not at the end of the run), so a run stopped early only bills the products already delivered; products whose detail page could not be loaded, and lean search rows, are not charged it. In the lookup modes, search-by-id values and search-by-url product links always return full detail and are charged detail-enrichment once per delivered product; a search-by-gtin or search-by-term value that idealo answers with the product page itself is returned as a full detail row and charged detail-enrichment once, even when Fetch full product detail is off; lookup values that return nothing or could not be loaded are not charged. There is also a one-time charge when the run starts. The Pricing tab shows the current rates. Use Maximum items to cap the cost of any run.
Is it legal to scrape idealo.de?
This actor collects only publicly available product and price information. You are responsible for how you use it: follow idealo.de's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product prices and specs are generally facts, but images and review text may be subject to third-party rights.
Can I run it on a schedule to catch new or changed products?
Yes. Schedule it from the Schedules tab with Incremental changes for scheduled runs switched on: later runs return only new, updated and reappeared products (and expired ones after a complete scan). See "Resume and incremental mode" above.
Why did my URL mode run use the sample category page instead of my search?
mode decides which fields are used: URL mode reads only urls and ignores searchQuery, and search mode reads only searchQuery and ignores urls. If URL mode is selected and urls is left empty, the actor falls back to its five built-in example links rather than failing the run.
Why did my run fail instead of returning an empty dataset?
If idealo.de refuses every request, the run stops with a clear message so a genuinely empty search (a keyword that matches nothing) is never confused with the site being unreachable. If any page could still be read, you get what was found; only a run that never reached the site raises an error. Retry it again in a few minutes.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of each product into Notion, Linear or Airtable.
🔗 Want more e-commerce data?
Pair this actor with these related scrapers from the same team:
| 🛒 MediaMarkt Germany Scraper Scrape MediaMarkt.de products by keyword or URL. Extract current and original prices... | 🛒 HORNBACH Products, Prices & Reviews Scraper Scrape HORNBACH (hornbach.de) DIY, building & garden products: current + strike-through... |
| 🛒 OBI.de Scraper Scrape OBI (obi.de) DIY/home-improvement products: current + strike-through original... | 👗 OTTO.de Scraper Scrape OTTO.de products by search or URL. Extract prices, discounts, variants... |
| 🥦 Kaufland.de Scraper Scrape Kaufland.de, Germany's hypermarket and online marketplace: keyword/category/brand... | 🛒 Douglas Germany Scraper Scrape Douglas.de beauty and fragrance products by keyword, category, brand, or URL... |
💬 Support
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.