Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the idealo.de API page →
E-commerce & Marketplaces

idealo.de API & Scraper

The idealo API turns Germany's biggest price-comparison site into clean JSON.

4 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.

Its point is product/offers: one call returns EVERY merchant idealo lists for a product - measured at 48 offers from 48 different shops on a LEGO Technic set and 75 offers across 27 merchants on the Bose QuietComfort Headphones, priced 169.00 to 532.00 EUR. Each offer carries the merchant's name and idealo shop id, the item price, the total price including shipping, the shipping cost itself, the delivery window with its carriers, accepted payment methods and the merchant's own idealo star rating. search and category/products give you the comparison rows (price floor, how many merchants sell it, the cheapest merchant's name, the German spec highlights), and product/detail gives the full record: the price band across all merchants, the complete spec sheet, colour variants with their EANs, magazine test grades and user opinions. Prices are EUR. No idealo account, no browser and no API key at idealo - one ReefAPI key, one shared credit pool, the standard { ok, data, meta, error } envelope.

Reference

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.

FieldFilledWhat it holds
the merchant's name and idealo shop id1477 / 1477 (100%)the shop's own domain (mediamarkt.de, office-partner.de) and its idealo shop id
the item price1477 / 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 shipping1477 / 1477 (100%)idealo's "inkl. Versand" figure, so a 5.99 EUR delivery does not hide in the small print
shipping_cost1477 / 1477 (100%)derived as total minus item price, never guessed
delivery_time1477 / 1477 (100%)the dated window idealo prints, e.g. "Di. 08.09.-Mi. 09.09.2026", plus the carriers (DHL, Hermes, UPS)
payment_methods1476 / 1477 (99.9%)normalised tokens: klarna, paypal, visa, mastercard, amzpay, american_express
the merchant's city1476 / 1477 (99.9%)the German city the shop ships from (Gescher, Ingolstadt)
the merchant's idealo star rating1424 / 1477 (96.4%)53 offers came from shops idealo has not rated yet. Those return null - never a fabricated 0
free_return719 / 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.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/idealo/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "query": "kopfhörer"
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "idealo",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 1171,
    "record_count": 36,
    "bytes": 974303,
    "cache_hit": false,
    "pagination": {
      "page": 1,
      "has_more": false
    },
    "total": 159699
  },
  "data": {
    "results": [
      {
        "product_id": "[redacted-phone]",
        "row_id": "[redacted-phone]",
        "type": "product",
        "title": "Bose QuietComfort Headphones",
        "url": "https://www.idealo.de/preisvergleich/OffersOfProduct/[redacted-phone]_-quietcomfort-headphones-bose.html",
        "image": "https://cdn.idealo.com/folder/Product/203505/4/[redacted-phone]/s1_produktbild_mittelgross/bose-quietcomfort-headphones.jpg",
        "category_id": "2520",
        "summary": "Bluetooth-Kopfhörer",
        "characteristics": [
          "Bluetooth-Kopfhörer",
          "Over-Ear",
          "kabellos"
        ],
        "price_from": 169,
        "price_from_display": "169,00 €",
        "currency": "EUR",
        "offer_count": 88,
        "used_only": false,
        "offer_key": "a653a56b0930e85e879bc65da930a30c",
        "offer_url": "https://www.idealo.de/relocator/relocate?offerKey=a653a56b0930e85e879bc65da930a30c&price=169.00&sid=285519&type=offer&pos=1",
        "best_offer": {
          "seller": {
            "id": "[trimmed-depth]",
            "name": "[trimmed-depth]",
            "logo": "[trimmed-depth]"
          },
          "shipping_costs": "0,00 €",
          "shipping_free": false,
          "delivery_information": null,
          "free_return_days": null
        },
        "test_grade": "2,1",
        "review_count": 10,
        "is_bestseller": false,
        "voucher_code": null
      },
      {
        "product_id": "[redacted-phone]",
        "row_id": "[redacted-phone]",
        "type": "product",
        "title": "Apple AirPods Pro 3",
        "url": "https://www.idealo.de/preisvergleich/OffersOfProduct/[redacted-phone]_-airpods-pro-3-apple.html",
        "image": "https://cdn.idealo.com/folder/Product/207671/7/[redacted-phone]/s1_produktbild_mittelgross/apple-airpods-pro-3.jpg",
        "category_id": "2520",
        "summary": "Bluetooth-Kopfhörer",
        "characteristics": [
          "Bluetooth-Kopfhörer",
          "im Ohr sitzend",
          "kabellos"
        ],
        "price_from": 196.46,
        "price_from_display": "196,46 €",
        "currency": "EUR",
        "offer_count": 64,
        "used_only": false,
        "offer_key": "58860e0fb5d[redacted-phone]c2b0280e7f",
        "offer_url": "https://www.idealo.de/relocator/relocate?offerKey=58860e0fb5d[redacted-phone]c2b0280e7f&price=196.46&sid=9701&type=offer&pos=2",
        "best_offer": {
          "seller": {
            "id": "[trimmed-depth]",
            "name": "[trimmed-depth]",
            "logo": "[trimmed-depth]"
          },
          "shipping_costs": "6,95 €",
          "shipping_free": false,
          "delivery_information": null,
          "free_return_days": null
        },
        "test_grade": "1,4",
        "review_count": 10,
        "is_bestseller": true,
        "voucher_code": "POWEREBAY6"
      },
      {
        "product_id": "[redacted-phone]",
        "row_id": "[redacted-phone]",
        "type": "product",
        "title": "Samsung Galaxy Buds4 Pro",
        "url": "https://www.idealo.de/preisvergleich/OffersOfProduct/[redacted-phone]_-galaxy-buds4-pro-samsung.html",
        "image": "https://cdn.idealo.com/folder/Product/209522/5/[redacted-phone]/s1_produktbild_mittelgross/samsung-galaxy-buds4-pro.jpg",
        "category_id": "2520",
        "summary": "Bluetooth-Kopfhörer",
        "characteristics": [
          "Bluetooth-Kopfhörer",
          "im Ohr sitzend",
          "kabellos"
        ],
        "price_from": 165.66,
        "price_from_display": "165,66 €",
        "currency": "EUR",
        "offer_count": 141,
        "used_only": false,
        "offer_key": "eb3efe496e770e46e408ef49c068ae37",
        "offer_url": "https://www.idealo.de/relocator/relocate?offerKey=eb3efe496e770e46e408ef49c068ae37&price=165.66&sid=9701&type=offer&pos=3",
        "best_offer": {
          "seller": {
            "id": "[trimmed-depth]",
            "name": "[trimmed-depth]",
            "logo": "[trimmed-depth]"
          },
          "shipping_costs": "0,00 €",
          "shipping_free": false,
          "delivery_information": null,
          "free_return_days": null
        },
        "test_grade": "1,7",
        "review_count": 14,
        "is_bestseller": false,
        "voucher_code": "PREISOPTIMAL15"
      }
    ],
    "count": 36,
    "total_results": 159699,
    "total_products": 12189,
    "total_offers": 147510,
    "has_more": false,
    "category_id": "2520",
    "category_name": "Kopfhörer",
    "related_queries": null,
    "query": "kopfhörer",
    "sort": "relevance"
  }
}
Actions

What the idealo.de API does

ActionDescriptionConcrete use caseKey params
searchSearch idealo.de by keyword and get back comparison products: id, title, image, price floor, how many merchants sell it, the cheapest merchant's name and shipping cost, the German spec highlights and idealo's expert test grade. Feed the `product_id` of any row straight into `product/offers` to get the whole merchant table. idealo renders one page of results server-side (36 rows, or 60 when sorted by price); page 2 onward is drawn in the browser by an API that refuses anonymous callers, so `has_more` is always false and the honest totals (`total_results`, `total_products`) tell you how much exists beyond it.Pricing teams call search to search idealo.de by keyword and get back comparison products.query, sort
category/productsBrowse a whole idealo category by its id (or URL) — the same rich rows as `search`, but enumerated from idealo's own product tree instead of a keyword. Use it to sweep a market: every headphone, every washing machine, every LEGO set, with each row's price floor and merchant count. Same one-page limit as search, and `total_products` says how large the category really is.Marketplace operators call category/products to get browse a whole idealo category by its id (or URL).category, sort
product/detailThe full idealo record for one product: title, brand, the complete category path, every image, the price range across all merchants (price_min / price_max) and how many offers make it up, the new and used price floors, the entire German spec sheet as grouped label/value rows, colour and capacity variants each with their own id, EAN and price range, idealo's expert test summary (how many magazines tested it and the average German grade), the editorial pros and cons, the product FAQ, and the user opinions idealo publishes.Catalog enrichment teams call product/detail to get the full idealo record for one product.product_id
product/offersTHE POINT OF THIS ENGINE: every merchant selling one product, in one call. Each offer carries the merchant's name, idealo shop id and shop page, the city the shop ships from, its idealo star rating and how many ratings it has, the item price, the total price including shipping and the shipping cost derived from the two, the delivery window, which carriers deliver it, the free-return terms, the payment methods the shop accepts, and the merchant's own title for the item (which often names the exact colour variant). Sort by item price or by total price including shipping. idealo lists 20 offers per request and this action pages through them up to `max_offers`. Only NEW offers are reachable — idealo puts its used listings behind an encrypted filter token — so `price_used_from` in `product/detail` is where the used floor comes from.Retail analysts call product/offers to get tHE POINT OF THIS ENGINE.product_id, max_offers, sort
Code samples

Call search from your stack

curl -X POST https://api.reefapi.com/idealo/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"kopfhörer"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.idealo.search with {"query":"kopfhörer"}.
Use cases

Who uses this API and why

  • 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.
FAQ

Questions developers ask before integrating

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.

docs / idealo

idealo.de

German price comparison: every merchant's offer for one product.

base /idealo/v14 endpoints
post/idealo/v1/category/products2 credits

Browse a whole idealo category by its id (or URL) — the same rich rows as `search`, but enumerated from idealo's own product tree instead of a keyword. Use it to sweep a market: every headphone, every washing machine, every LEGO set, with each row's price floor and merchant count. Same one-page limit as search, and `total_products` says how large the category really is.

ParameterAllowed / rangeDescription
categoryrequiredidealo category id, or a full category URL. The id is the number in /preisvergleich/ProductCategory/<id>.html. Live examples: 2520 headphones · 1941 washing machines · 4012 televisions · 19116 smartphones · 3487 bean-to-cup coffee machines · 22875 running shoes · 9552 LEGO · 3687 cordless drills · 6012 prams. You do not need a category table: every `search` row carries its own category_id, the search response names the category it landed in, and every `product/detail` returns the full category path — so keyword → whole category is two calls.
sort = relevanceoptionalrelevance · price_asc · price_descResult ordering. Only these three exist on idealo's server-rendered pages: every other ordering the site offers (newest, biggest discount, best rated) is applied in the browser by a client API that refuses anonymous calls, and idealo answers an unknown ordering with HTTP 200 and the default list — so this engine rejects one instead of silently ignoring it. Note that price_asc/price_desc change WHAT is searched, not just the order: idealo drops the category it auto-detected for your keyword and sorts across all of them, so the rows widen to 60 and include single-merchant OFFER rows and accessories (searching 'kaffeevollautomat' sorted by price_asc leads with a 0,13 € descaler — measured, not a bug on our side). Each row says in `type` whether it is a comparison PRODUCT or a single OFFER, and `category_id` says where it came from. Sort inside a category with `category/products` instead when you want the cheapest of one kind of thing.
Try in playground →
post/idealo/v1/product/detail2 credits

The full idealo record for one product: title, brand, the complete category path, every image, the price range across all merchants (price_min / price_max) and how many offers make it up, the new and used price floors, the entire German spec sheet as grouped label/value rows, colour and capacity variants each with their own id, EAN and price range, idealo's expert test summary (how many magazines tested it and the average German grade), the editorial pros and cons, the product FAQ, and the user opinions idealo publishes.

ParameterAllowed / rangeDescription
product_idrequiredidealo product id — the number in /preisvergleich/OffersOfProduct/<id>_-<slug>.html. A full product URL works too; the slug is cosmetic and the bare id resolves on its own. `search` returns this id on every PRODUCT row.
Try in playground →
post/idealo/v1/product/offers1 credit

THE POINT OF THIS ENGINE: every merchant selling one product, in one call. Each offer carries the merchant's name, idealo shop id and shop page, the city the shop ships from, its idealo star rating and how many ratings it has, the item price, the total price including shipping and the shipping cost derived from the two, the delivery window, which carriers deliver it, the free-return terms, the payment methods the shop accepts, and the merchant's own title for the item (which often names the exact colour variant). Sort by item price or by total price including shipping. idealo lists 20 offers per request and this action pages through them up to `max_offers`. Only NEW offers are reachable — idealo puts its used listings behind an encrypted filter token — so `price_used_from` in `product/detail` is where the used floor comes from.

ParameterAllowed / rangeDescription
product_idrequiredidealo product id — the number in /preisvergleich/OffersOfProduct/<id>_-<slug>.html. A full product URL works too; the slug is cosmetic and the bare id resolves on its own. `search` returns this id on every PRODUCT row.
max_offers = 100optional1–500How many merchant offers to return (1-500, default 100). idealo serves 20 offers per request, so this decides how many requests the call makes: 20 = one, 100 = up to five. Most products have fewer than 40 offers, in which case the call stops as soon as idealo runs out.
sort = priceoptionalprice · total_priceOffer ordering. `price` sorts on the item price alone; `total_price` is idealo's 'günstigster Gesamtpreis' — item plus shipping — which reorders the table whenever a cheap listing carries expensive delivery. These are the only two orderings idealo honours on this route; anything else is accepted upstream and silently ignored, so it is rejected here.
Try in playground →