Every German merchant's price for one product, in one call
The idealo API turns Germany's biggest price-comparison site into clean JSON.
4 active endpoints, on 1 and 2 credit tiers.
- POST/idealo/v1/search
- POST/idealo/v1/category/products
- POST/idealo/v1/product/detail
- POST/idealo/v1/product/offers
What idealo.de endpoints does ReefAPI ship?
4 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
idealo.de API
4 of 4 endpoints, ready to run
The whole merchant table for one product: each shop's name and idealo id, the item price, the total including shipping, the shipping cost, the delivery window with its carriers, the payment methods and the shop's idealo star rating.
{ "ok": true, "meta": { "api": "idealo", "endpoint": "product/offers", "mode": "live", "latency_ms": 1071.2, "record_count": 40, "cache_hit": false }, "data": { "product": { "product_id": "203505482", "title": "Bose QuietComfort Headphones", "url": "https://www.idealo.de/preisvergleich/OffersOfProduct/203505482.html", "price_min": 169, "price_max": 532, "currency": "EUR", "offer_count": 75, "price_new_from": 169, "price_used_from": 89.9 }, "offers": [ { "position": 1, "offer_key": "a653a56b0930e85e879bc65da930a30c", "seller": { "id": "285519", "name": "mediamarkt.de", "url": "https://www.idealo.de/preisvergleich/Shop/285519.html", "location": "Ingolstadt", "type": "IDECL", "rating": 4, "rating_count": 18409 }, "price": 169, "price_display": "169,00 €", "currency": "EUR", "total_price": 169, "total_price_display": "169,00 € inkl. Versand", "shipping_cost": 0, "offer_title": "BOSE QuietComfort® Headphones, Noise-Cancelling, Over-ear Kopfhörer Bluetooth Twilight", "offer_url": "https://www.idealo.de/relocator/relocate?categoryId=2520&offerKey=a653a56b0930e85e879bc65da930a30c&pos=1&price=169.00&productid=203505482&sid=285519&type=offer", "in_stock": null, "delivery_time": "bis Di. 08.09.2026", "delivery_by": "bis Di. 08.09.", "delivery_providers": [ "Click and Collect", "Hermes", "DHL" ], "free_return": "Rücksendung 30 Tage kostenfrei", "payment_methods": [ "american_express", "amzpay", "diners_club" ], "variant_product_id": "207112721", "variant_title": "Bose QuietComfort Headphones Twilight Blue", "condition": "new" }, { "position": 2, "offer_key": "f73ffe9560ff9616ef2b0b6a5b1eebaf", "seller": { "id": "9701", "name": "aetherion-eu", "url": "https://www.idealo.de/preisvergleich/Shop/9701.html", "location": "Bern", "type": "EBYDE", "rating": 5, "rating_count": 551 }, "price": 187.14, "price_display": "187,14 €", "currency": "EUR", "total_price": 187.14, "total_price_display": "187,14 € inkl. Versand", "shipping_cost": 0, "offer_title": "Bose QuietComfort Headphones - Schwarz", "offer_url": "https://www.idealo.de/relocator/relocate?categoryId=2520&offerKey=f73ffe9560ff9616ef2b0b6a5b1eebaf&pos=2&price=187.14&productid=203505482&sid=9701&type=offer", "in_stock": null, "delivery_time": "Do. 10.09.–Sa. 12.09.2026", "delivery_by": "bis Sa. 12.09.", "delivery_providers": null, "free_return": null, "payment_methods": [ "mastercard", "paypal", "visa" ], "variant_product_id": null, "variant_title": null, "condition": "new" }, { "position": 3, "offer_key": "567fbc887d21d2b25af6ea94989a89ce", "seller": { "id": "243147", "name": "playox.de", "url": "https://www.idealo.de/preisvergleich/Shop/243147.html", "location": "Gescher", "type": "IDECL", "rating": 4.3, "rating_count": 1347 }, "price": 188.99, "price_display": "188,99 €", "currency": "EUR", "total_price": 194.98, "total_price_display": "194,98 € inkl. Versand", "shipping_cost": 5.99, "offer_title": "Bose QuietComfort Headphones - Schwarz", "offer_url": "https://www.idealo.de/relocator/relocate?categoryId=2520&offerKey=567fbc887d21d2b25af6ea94989a89ce&pos=3&price=188.99&productid=203505482&sid=243147&type=offer", "in_stock": null, "delivery_time": "Di. 08.09.–Mi. 09.09.2026", "delivery_by": "bis Mi. 09.09.", "delivery_providers": [ "DHL", "Deutsche Post", "UPS" ], "free_return": "Rücksendung 30 Tage kostenfrei", "payment_methods": [ "american_express", "amzpay", "klarna" ], "variant_product_id": "203505484", "variant_title": "Bose QuietComfort Headphones Schwarz", "condition": "new" } ], "count": 40, "total_offers": 75, "seller_count": 17, "sort": "price", "has_more": true } }
How the idealo.de API works
idealo.de is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 188 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Find a product, then get every shop selling it and who is genuinely cheapest
The search row gives you one number: the from-price and the name of the shop behind it. The comparison itself is the second call, and it is the reason to use idealo rather than a single retailer's API.
{"query": "bose quietcomfort headphones"}Two credits, one page of 36 rows. Take results[].product_id. The response also carries idealo's own total_results, so you know how much exists beyond the page.
{"product_id": "203505482", "max_offers": 40}Metered per 20 offers because that is exactly one upstream fetch: 20 offers cost 2, 40 cost 2, 100 cost 5. Each row carries the merchant, the item price, the total including shipping and the shop's rating.
{"product_id": "203505482", "max_offers": 40, "sort": "total_price"}The same table under idealo's cheapest-total ordering. Compare the two heads: they are frequently different merchants.
Under ten credits for a keyword, a product and the full German merchant table for it, twice - once by item price and once by delivered price.
curl -X POST https://api.reefapi.com/idealo/v1/product/offers \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"product_id":"203505482","max_offers":40}'{
"ok": true,
"data": { … },
"meta": {
"api": "idealo",
"endpoint": "product/offers",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}What one product/offers call actually fills in - measured over 1,477 offers
12 products across 6 idealo categories (electronics, home appliances, fashion, toys, DIY, baby) were pulled on 2026-09-06 and every offer field was counted by VALUE, not by key presence. The two fields below 100% are idealo's gaps, not parse failures, and they return null rather than a fabricated number.
| Field | Filled | What it holds |
|---|---|---|
| the merchant's name and idealo shop id | 1477 / 1477 (100%) | the shop's own domain (mediamarkt.de, office-partner.de) and its idealo shop id |
| the item price | 1477 / 1477 (100%) | parsed from the offer URL's own query string; it agreed with the price idealo rendered on every one of the 1,477 offers - 0 mismatches |
| the total price including shipping | 1477 / 1477 (100%) | idealo's "inkl. Versand" figure, so a 5.99 EUR delivery does not hide in the small print |
| shipping_cost | 1477 / 1477 (100%) | derived as total minus item price, never guessed |
| delivery_time | 1477 / 1477 (100%) | the dated window idealo prints, e.g. "Di. 08.09.-Mi. 09.09.2026", plus the carriers (DHL, Hermes, UPS) |
| payment_methods | 1476 / 1477 (99.9%) | normalised tokens: klarna, paypal, visa, mastercard, amzpay, american_express |
| the merchant's city | 1476 / 1477 (99.9%) | the German city the shop ships from (Gescher, Ingolstadt) |
| the merchant's idealo star rating | 1424 / 1477 (96.4%) | 53 offers came from shops idealo has not rated yet. Those return null - never a fabricated 0 |
| free_return | 719 / 1477 (48.7%) | idealo prints a free-return line only for the shops that offer one; 48.7% is the real share |
Cost scales with offers, not with products: idealo serves 20 offers per upstream fetch (about 411 KB), so a 20-offer product is one fetch and a 200-offer product is ten. Reliability over the verification run was 20/20 with a median of 1.17 s and a p90 of 2.29 s.
Which country, which id, which currency, and how many merchants you actually get
idealo.de only - one country, one currency, and a product id that is a bare number. Measured on 2026-09-06 across 12 products in 6 categories and 1,477 offers, plus the live calls behind this page. Three of these lines go against us.
This engine reads idealo.de. Prices, shipping costs, delivery windows and merchant ratings are all German-scoped, and the currency is EUR on every row - there is no country parameter and no other storefront behind it. If you need Poland, Romania or the Benelux, those are the ceneo, emag and bol engines rather than a parameter here.
An idealo product URL looks like /preisvergleich/OffersOfProduct/203505482_-quietcomfort-headphones-bose.html, and only the 203505482 matters - the slug URL 302s to the canonical one, so the number resolves on its own. Every search and category row hands that number back as product_id, and every product action takes either the number or the full URL. A category is a number too: 2520 is headphones, 1941 washing machines, 9552 LEGO.
As many as idealo lists. Measured on 2026-09-06: a LEGO Technic Porsche 911 GT3 R returned 48 offers from 48 DIFFERENT shops between 93.99 and 188.99 EUR; the Bose QuietComfort Headphones returned 75 offers across 27 merchants between 169.00 and 532.00 EUR; a Sony WH-CH520 declared 172 and returned all 172, from 55 distinct shops. Fashion goes much higher - one Adidas running shoe declared 3,251 offers - and there max_offers is what decides the cost, since the meter runs per 20 offers.
Every offer carries the item price, idealo's total including shipping, and the shipping cost as the difference between them. All three were filled on 1,477 of 1,477 measured offers. This matters more than it sounds: the cheapest item price and the cheapest delivered price are often different shops, which is why the action takes idealo's own cheapest-total ordering as a sort rather than leaving you to re-rank a partial table.
The authoritative price comes off the offer's own link rather than the rendered text, so it was checked against what idealo actually printed on all 1,477 offers: 0 mismatches. That is the check that catches the failure mode where a number in a link and the number on the page quietly diverge, which is the class of bug that makes a price feed wrong without ever making it look broken.
idealo draws its second page client-side from an endpoint that is closed to logged-out callers, and no URL parameter moves it - several were measured and every one returned page 1 unchanged. So search and category return one page of 36 rows and say has_more false rather than pretending. What you do get is the honest total, so you know the size of what you did not receive: 159,673 products behind one headphone query, 17,280 behind washing machines. Browse by category id and narrow with a sort when you need to sweep a segment.
Without a sort, idealo picks a category for your keyword and searches inside it. Ask for a price sort and it drops that category and sorts across all of them, so the page widens from 36 rows to about 60 and single-merchant offer rows appear. Measured: sorting a coffee-machine query by price leads with a 0.13 EUR descaler. It is idealo's behaviour, not a parsing fault, and it is written on the parameter itself. Sort a category instead when you want the cheapest of one kind of thing.
Used and refurbished rows are behind a control that does not open to us - asking for the used segment by URL returns the identical new list, so every offer is labelled new rather than left ambiguous, and the only used data is the used price floor on product/detail (present on 8 of 12 measured products). idealo renders a price chart but does not serve the series, so there is no history. And 53 of 1,477 offers came from shops idealo has not rated yet: those return null, never a fabricated zero. Free-return lines exist on 719 of 1,477 for the same reason - idealo only prints one where the shop offers one.
A German test-report grade where 1.0 is best and 6.0 is worst, and a normal 5-star user rating where higher is better. Conflating them inverts the meaning, so they are returned under separate names and the grade carries its scale beside it. Only 5 of 12 verification products had any magazine test at all; the block is absent rather than zero on the others.
idealo answers a retired product id with HTTP 410 Gone, which becomes a non-retryable NOT_FOUND immediately instead of burning retries on something that will never resolve. Reliability across the verification run was 20 of 20 with a median around 1.2 seconds and a p90 of 2.3.
What people build with idealo.de
The jobs this data is most often used for.
endpoints
credits per call
Price-intelligence teams call product/offers to see every German merchant's price, total-with-shipping and delivery date for one product in a single request.
Repricing tools sort offers by total price to find who is genuinely cheapest once a 5.99 EUR delivery is counted.
Catalog teams call product/detail for the full German spec sheet, the colour variants with their EANs and the magazine test grade.
Market analysts sweep a category id with category/products to size a segment - the response carries idealo's own total_results even though only one page is served.
What idealo.de data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 188 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/idealo/v1/product/offers \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"product_id":"203505482","max_offers":40}'import requests
r = requests.post(
"https://api.reefapi.com/idealo/v1/product/offers",
headers={"x-api-key": REEF_KEY},
json={
"product_id": "203505482",
"max_offers": 40
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up idealo.de.
Get a free key →How many merchants does one product/offers call actually return?▾
As many as idealo lists, up to your max_offers. Measured on 2026-09-06: a LEGO Technic Porsche 911 GT3 R returned 48 offers from 48 DIFFERENT shops between 93.99 and 188.99 EUR; the Bose QuietComfort Headphones returned 75 offers across 27 merchants between 169.00 and 532.00 EUR; a Sony WH-CH520 declared 172 offers and returned all 172, from 55 distinct shops, between 25.07 and 86.85 EUR. Fashion products go much higher - an Adidas Adizero Boston 13 declared 3,251 offers, where max_offers is what decides your cost.
Is the price the item price or the price including delivery?▾
You get both, separately, on every offer. The item price is what the shop charges for the product; the total price is idealo's "inkl. Versand" figure; and the shipping cost is the difference, computed rather than guessed. All three were filled on 1,477 of 1,477 measured offers. This matters because the cheapest item price and the cheapest total price are frequently different merchants - which is why the offers action also takes a sort of total_price, idealo's own "guenstigster Gesamtpreis" ordering.
Can I get page 2 of a search?▾
No, and the API says so rather than pretending. idealo draws page 2 and beyond client-side from an internal endpoint that is closed to logged-out callers, so search and category/products return one page of 36 rows with has_more false. What you do get is the honest total_results - 159,673 for "kopfhoerer", 17,280 for "waschmaschine" - so you know how much exists beyond the page. To sweep a market, browse by category id and narrow with a sort instead of trying to page.
Why does sorting a search by price change which products come back?▾
Because idealo changes what it is searching. Without a sort it auto-detects a category for your keyword and searches inside it; ask for a price sort and it drops that category and sorts across all of them, so the page widens from 36 to about 60 rows and single-merchant offer rows appear. Measured: sorting "kaffeevollautomat" by price leads with a 0.13 EUR descaler. It is idealo's behaviour, not a bug in the parse - use category/products with a sort when you want the cheapest of one kind of thing.
There are two ratings on a product. Which is which?▾
idealo publishes two scores on different scales and conflating them inverts the meaning. The user rating is a normal 5-star score where higher is better (4.9 out of 5 from 10 opinions on the reference product). The test grade is a German magazine grade where 1.0 is best and 6.0 is worst - the reference product scored 2.1 across 7 test reports. They are returned under separate names and the grade carries its scale alongside it. Only 5 of 12 verification products had any test report at all; the block is simply absent otherwise.
Can I get used or refurbished offers?▾
No, and every returned offer is labelled as new rather than left ambiguous. idealo's used/new switch posts an encrypted token to an internal route; asking for the used segment by URL returns the identical NEW list, byte for byte. The one piece of used data that is published is the used price floor on product/detail, and it was present on 8 of 12 measured products - idealo prints it only where used listings exist.
What happens if I ask for a product id that no longer exists?▾
You get a clean, non-retryable NOT_FOUND. idealo answers a dead product id with HTTP 410 Gone, which is a definite signal rather than a timeout or an empty page, so the engine does not burn retries on something that will never resolve. Note also that the slug in a product URL is cosmetic: the bare number resolves on its own, so the id is all you ever need to store.
Does idealo publish a price history or per-shop stock levels?▾
Neither, and both come back null instead of estimated. idealo renders a price chart, but the series is loaded from a route that is not in the served page. Stock is only ever the words "Auf Lager" where a shop prints them - present on 6 of 20 offers on the reference product - so it is true there and null everywhere else, not a guessed true. EANs exist per colour variant on product/detail, not per offer.
What is the idealo.de API?▾
idealo.de API is a ReefAPI endpoint group for german price comparison: every merchant's offer for one product. It returns live JSON through POST requests under /idealo/v1.
Is the idealo.de API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. idealo.de calls use the same shared credit balance as every other ReefAPI engine.
Do I need an idealo.de login or account?▾
No login to idealo.de is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the idealo.de data?▾
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the idealo.de API use?▾
idealo.de actions currently cost 1-2 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call idealo.de from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call idealo actions with the same key, credit pool and JSON envelope used by normal REST requests.
39 E-commerce & Marketplaces APIs on the same key
One key, one credit pool, one response envelope. If you are pulling idealo.de, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 187 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-09-06.