idealo.de API

Every German merchant's price for one product, in one call

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

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a idealo.de endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
I
/idealo/v1

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.

4 endpoints

search

2 cr

Search idealo.de by keyword and get back comparison products.

required
query
optional
sort

category/products

2 cr

Browse a whole idealo category by its id (or URL).

required
category
optional
sort

product/detail

2 cr

The full idealo record for one product.

required
product_id
optional

product/offers

1 cr

THE POINT OF THIS ENGINE.

required
product_id
optional
max_offers, sort

Every parameter, every allowed value →

idealo.de API

4 of 4 endpoints, ready to run

View docs ↗

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.

1 credit1 required · 2 optional
POST/idealo/v1/product/offers
ok1071 ms · 40 records · sample
{
  "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
  }
}
Real response, fetched from the live endpoint with the parameters on the left — trimmed to the first few rows. Press Try it for the untrimmed response.

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.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 188 engines.

02
Call
POST /idealo/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 or 2 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

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.

01search
POST/idealo/v1/search
{"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.

02offers
POST/idealo/v1/product/offers
{"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.

03offers
POST/idealo/v1/product/offers
{"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.

request
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}'
response envelope
{
  "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.

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.

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.

One market: Germany, and prices in EUR

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.

The id is a bare number and the slug is decoration

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.

How many merchants one call actually returns

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.

Two prices per offer, and they rank differently

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 price was cross-checked against the page, on every single offer

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.

Against us: there is no page 2 on search or category

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.

Against us: sorting a SEARCH by price changes what is searched

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.

Against us: no used offers, no price history, and not every shop is rated

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.

Two different scores, on two different scales

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.

A dead id is a clean 410, not a timeout

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.

4

endpoints

1/2

credits per call

01

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.

02

Repricing tools sort offers by total price to find who is genuinely cheapest once a 5.99 EUR delivery is counted.

03

Catalog teams call product/detail for the full German spec sheet, the colour variants with their EANs and the magazine test grade.

04

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 →
$0.67–$1.50 / 1,000 credits
  • 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
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}'
python
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"])
FAQ

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.

0/4000

No account needed · we reply from [email protected]

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.