API

API de idealo.es: comparar precios de todas las tiendas en JSON

En idealo.es una misma ficha reúne lo que piden por un producto MediaMarkt, PcComponentes, Electro Depot, Amazon.es, Kaufland y otras tiendas que venden en España. Esta API entrega esa comparativa en JSON: precio del artículo, gastos de envío, precio final, plazo de entrega, devolución gratuita y formas de pago, Bizum incluido. Funciona del lado del comprador y en directo; para dar de alta un catálogo o gestionar ofertas como tienda asociada, idealo tiene sus propias herramientas para comercios, y esta API no las reemplaza.

Endpoints

endpointQué devuelveObligatorios
searchBúsqueda por palabra clave o por EAN en la edición que indiques (`country: "es"` para idealo.es). Cada fila trae el id del producto, el precio «desde», cuántas ofertas tiene, la tienda más barata con sus gastos de envío, las características destacadas en español y, si existe, la nota de los análisis. Un EAN o un modelo exacto que idealo asocia a un único producto devuelve `direct_hit: true` y la ficha completa en `product`.query
category/productsUna categoría de idealo entera por id o URL, con las mismas filas que la búsqueda. Los ids de categoría son los mismos en todas las ediciones de idealo; en idealo.es, 31947 es Patinetes eléctricos. `total_products` dice cuántos productos tiene la categoría.category
product/detailLa ficha del producto: marca, ruta de categorías (Deportes y outdoor › Patinetes eléctricos), imágenes, horquilla de precios entre tiendas, ficha técnica en español agrupada por secciones, variantes con su EAN y su propio rango de precio, nota de los análisis, pros y contras, preguntas frecuentes y opiniones de usuarios.product_id
product/offersTodas las ofertas nuevas de un producto: tienda con su id, su página en idealo y su valoración, precio del artículo, gastos de envío y precio final, plazo de entrega, transportistas, devolución gratuita, formas de pago y el EAN de la variante con la que idealo emparejó la oferta. En marketplaces como Kaufland, eBay o Pixmania, `marketplace_seller` es el comercio que idealo muestra bajo «Venta a través de». Se ordena por precio del artículo o por precio final, hasta 500 ofertas por llamada.product_id

Cada llamada se cobra en créditos. Las llamadas fallidas y bloqueadas son gratuitas.

Ejemplo que funciona

Patinete Ninebot by Segway C2 Lite, siete tiendas. Por precio del artículo, Pixmania.es (203,01 €) va delante de kaufland.es (211,41 €); con `sort: "total_price"` se invierten, porque Pixmania cobra 16,99 € de envío y se queda en 220,00 €, mientras Kaufland suma 7,99 € y se queda en 219,40 €. electrodepot.es se mantiene en primer lugar incluso con sus 8,95 € de envío. Si lo que quieres saber es cuánto paga el comprador, ordena por precio final y trabaja con los números `price`, `shipping_cost` y `total_price`.

Petición
curl -X POST https://api.reefapi.com/idealo/v1/product/offers \
  -H "x-api-key: TU_CLAVE" \
  -H "content-type: application/json" \
  -d '{"product_id": "205135310", "country": "es", "sort": "total_price", "max_offers": 20}'
Respuesta (recortada)
{
  "ok": true,
  "data": {
    "product": {
      "product_id": "205135310",
      "title": "Ninebot by Segway C2 Lite",
      "url": "https://www.idealo.es/precios/205135310.html",
      "price_min": 129.94,
      "price_max": 369.99,
      "currency": "EUR",
      "offer_count": 7
    },
    "offers": [
      {
        "position": 1,
        "seller": { "id": "318869", "name": "electrodepot.es", "location": "ALCALA DE HENARES", "rating": 2.6, "rating_count": 10 },
        "marketplace_seller": null,
        "price": 129.94,
        "price_display": "138,89 €",
        "total_price": 138.89,
        "total_price_display": "138,89 € envío incl.",
        "shipping_cost": 8.95,
        "in_stock": null,
        "delivery_time": "SEUR",
        "free_return": "Devolución gratuita en un plazo de 15 días",
        "payment_methods": ["bizum", "mastercard", "paypal", "visa"],
        "variant_ean": "8721008535258",
        "condition": "new"
      },
      ...
      {
        "position": 4,
        "seller": { "id": "338986", "name": "kaufland.es", "location": "Neckarsulm", "rating": null, "rating_count": null },
        "marketplace_seller": { "name": "..." },
        "price": 211.41,
        "total_price": 219.4,
        "shipping_cost": 7.99,
        "delivery_time": "vie 30/10–lun 02/11/2026",
        "delivery_providers": ["DHL"],
        "free_return": "Devolución gratuita en un plazo de 14 días",
        "payment_methods": ["bizum", "mastercard", "paypal", "visa"]
      },
      {
        "position": 5,
        "seller": { "id": "293422", "name": "Pixmania.es", "location": "Paris", "rating": 2.8, "rating_count": 9 },
        "marketplace_seller": { "name": "..." },
        "price": 203.01,
        "total_price": 220.0,
        "shipping_cost": 16.99,
        "delivery_time": "sáb 31/10–lun 02/11/2026",
        "delivery_providers": ["Seur", "DHL", "UPS"],
        "free_return": null,
        "payment_methods": ["american_express", "bizum", "klarna", "mastercard", "paypal", "visa"]
      },
      ...
    ],
    "count": 7,
    "total_offers": 7,
    "seller_count": 7,
    "sort": "total_price",
    "has_more": false,
    "country": "es"
  },
  "meta": { "record_count": 7, "total": 7, "country": "es", "host": "www.idealo.es", "currency": "EUR", "cache_hit": false, "mode": "live" }
}

Antes de buscar un scraper de idealo en GitHub

La lista de resultados no está en el HTML que ves. idealo la envía entera dentro de un bloque de datos codificado en base64 (`initialData['searchResult']`), y las clases CSS de la página llevan sufijos generados (`sr-resultItemTile_B0odU`) que cambian con cada nueva versión de la web. Un scraper montado sobre selectores dura lo que tarde idealo en publicar la siguiente.

Las ofertas se cargan de 20 en 20, e idealo no comprueba hasta dónde pides: con `start=80` en un producto de 75 ofertas devuelve otra vez la oferta número uno. Un paginador sencillo se inventa duplicados sin que salte ningún error. El motor deja de pedir páginas cuando ya tiene las ofertas solicitadas, cuando una página llega incompleta, cuando alcanza el número de ofertas que declara idealo o cuando se repite un `offer_key`.

Tampoco todo EAN lleva a una ficha. Al medir las ediciones nuevas en octubre de 2026, el EAN 8806097821250 saltaba directo al producto en las otras cuatro; en idealo.es devolvió una página de dos resultados cuya segunda fila era una oferta suelta de un sofá cama. Esa fila llega con `type: "offer"` y no se filtra, así que conviene mirar el campo antes de dar la primera fila por buena.

El nombre del comercio en las ofertas de marketplace se añadió el 18 de octubre de 2026: en idealo.es, 83 de 83 filas de marketplace lo traían. Al hacerlo encontramos un fallo nuestro anterior, en una fila de eBay de idealo.de donde la tienda aparecía con el nombre del vendedor en lugar de «eBay». Comparando el parser viejo con el nuevo sobre 1173 filas, ese fue el único valor que cambió.

Si aun así escribes el tuyo, guarda en cada ejecución, junto a las filas extraídas, los recuentos que declara idealo (`offer_count` en la ficha, el total de resultados en la búsqueda). Ninguno de estos casos produce un error, pero los dos primeros descuadran esos recuentos (filas de menos, ofertas de más), y esa es la señal más barata de que algo ha cambiado.

Límites y notas honestas

  • API independiente y no oficial: idealo no ha participado en ella, y ReefAPI no mantiene ningún acuerdo de colaboración con idealo.
  • `country` vale "de" por defecto. Sin `"country": "es"` en cada llamada, la respuesta llega de idealo.de, con tiendas y precios alemanes.
  • Quien busque el historial de precios de idealo no lo encontrará aquí: la gráfica de evolución de la web no forma parte de la respuesta. Para tener histórico, guarda tú las respuestas día a día.
  • `search` y `category/products` devuelven una sola página (36 filas, 60 al ordenar por precio) y `has_more` es siempre false. Para «patinete eléctrico» idealo.es contaba 6759 resultados y 484 productos (`total_results`, `total_products`), y llegaron 36 filas.
  • Ordenar por precio no limpia los accesorios: en `category/products` de Patinetes eléctricos (31947) con `price_asc`, la primera fila fue un cargador de 71 W a 69,90 €.
  • El precio «desde» puede ser de otra variante. En el Xiaomi Electric Scooter 4 Lite 2nd Gen, los 285,04 € eran de la versión (FR); la versión (EU) empezaba en 462,17 €. Las variantes, con su EAN y su rango de precio, están en `product/detail`.
  • `in_stock` llegó en null en las 7 ofertas de nuestra llamada del 25 de octubre de 2026: idealo.es no imprime una etiqueta de stock que el motor reconozca. Lo que haya aparece como texto en `delivery_time` («En stock» en amazon.es, el transportista «SEUR» en electrodepot.es).
  • En la búsqueda, `best_offer.shipping_free` vino false en las 36 filas, también en las 32 cuyo `shipping_costs` era «0,00 €». Es el indicador tal como lo publica idealo; para saber si el envío es gratis, fíate del importe.
  • Con `sort: "total_price"`, `price_display` muestra el precio final y no el del artículo (138,89 € en una oferta de 129,94 €). Calcula con los campos numéricos.
  • `seller.location` es la ciudad con la que idealo presenta a la tienda: amazon.es figura en «Luxemburgo» y kaufland.es en «Neckarsulm». No la tomes por el origen del envío.
  • Solo se leen ofertas nuevas. Para segunda mano queda `price_used_from` en la ficha, y en los dos patinetes que consultamos vino en null.
  • `test_grade` es en idealo.es una nota sobre 10 en la que más es mejor (8,0/10, 9,5/10); en idealo.de es una nota escolar alemana en la que 1 es la mejor. `test_grade_scale` dice cuál. En la búsqueda de patinetes, solo 2 de 36 filas traían nota.
  • Los datos se leen en vivo (`mode: "live"`, `cache_hit: false` en todas nuestras llamadas): cada consulta trae lo que idealo.es muestra en ese momento, no una copia guardada.