API

Lidl API: prijzen en aanbiedingen van lidl.nl als JSON

Met deze API lees je lidl.nl uit als JSON, precies zoals een klant zonder account de site te zien krijgt: de webshop met prijzen in euro, de aanbiedingen met de periode waarin ze in de winkel liggen, en de Lidl Plus-prijs in een eigen veld. Een koppeling met de Lidl Plus-app, met je kassabonnen of met een leveranciersportaal is het niet; je krijgt alleen wat Lidl openbaar op de site zet, gezien vanaf de kant van de klant. Standaard antwoordt de Duitse site (lidl.de); met `"country": "nl"` in de body lees je lidl.nl.

Endpoints

endpointWat je terugkrijgtVerplicht
searchZoeken in de webshop op trefwoord of EAN: product-id, titel, merk, afbeelding, prijs, doorgestreepte prijs en of dat de eerdere prijs van Lidl zelf of een adviesprijs is, korting, eenheidsprijs, Lidl Plus-prijs apart, beoordeling met aantal reviews, online leverbaarheid en eventuele winkeldata. Filteren op merk, prijs, beoordeling en beschikbaarheid; sorteren op prijs, beoordeling, nieuwste, bestverkocht of korting.query
category/productsEén categorie van lidl.nl doorlopen, met het id uit de categorielink (het stuk dat met `h` of `s` begint, achteraan het adres) of met de volledige URL. Je krijgt dezelfde velden terug als bij search en kunt op dezelfde manier filteren, sorteren en doorbladeren.category
dealsDe aanbiedingen van deze en de komende weken: prijs, doorgestreepte prijs, eenheidsprijs, Lidl Plus-prijs en per artikel de winkelperiode zoals Lidl die toont ('Ook in de winkel vanaf 28/10 - 03/11', 'Alleen in de winkel 12/10 - 22/11'). Met `query` beperk je de lijst tot een trefwoord.allemaal optioneel
product/detailHet complete product op id of URL: foto's, EAN/GTIN, prijs met het soort doorgestreepte prijs, eenheidsprijs, Lidl Plus-prijs, beoordeling met het aantal aanbevelingen, levertijd en bezorgkosten, maximaal bestelaantal, retourtermijn, omschrijving en opsommingstekens, specificaties, maten en kleuren met eigen prijs en EAN, handleidingen (pdf) en de andere Lidl-landen waar het te koop is.product_id

Elke aanroep kost credits. Mislukte en geblokkeerde aanroepen zijn gratis.

Werkend voorbeeld

Drie rijen uit de eerste pagina van 27 oktober 2026, met drie soorten prijs. Chocomel heeft helemaal geen gewone prijs: alleen 2,19 'met Lidl Plus' (-27%), alleen in de winkel van 30/10 tot en met 05/11. `price` is dan null, en dat gold voor 17 van de 178 aanbiedingen. De steelstofzuiger kost 139 euro, en de doorgestreepte 169 is de eerdere prijs bij Lidl zelf (`previous_price`). Bij de Oral-B is de doorgestreepte 39,99 een adviesprijs van de fabrikant (`recommended_retail_price`), dus die -53% zegt niets over wat het artikel eerder bij Lidl kostte. Wie alleen over `price` middelt, mist de Lidl Plus-artikelen; wie `price` en `member_price` door elkaar gebruikt, mengt app-prijzen met winkelprijzen.

Verzoek
curl -X POST https://api.reefapi.com/lidl/v1/deals \
  -H "x-api-key: JOUW_SLEUTEL" \
  -H "content-type: application/json" \
  -d '{"country": "nl", "limit": 60}'
Antwoord (ingekort)
{
  "ok": true,
  "data": {
    "results": [
      ...
      {
        "product_id": "100389544",
        "title": "ORAL-B Pro Vitality Elektrische tandenborstel, Black",
        "brand": "ORAL-B",
        "currency": "EUR",
        "price": 18.99,
        "price_before_discount": 39.99,
        "price_before_discount_type": "recommended_retail_price",
        "discount_percent": 53,
        "availability": "available_online",
        "availability_text": "Ook in de winkel 24/10 - 30/10"
      },
      ...
      {
        "product_id": "100412129",
        "title": "SILVERCREST® Accu-steelstofzuiger 24 V",
        "price": 139,
        "price_before_discount": 169,
        "price_before_discount_type": "previous_price",
        "discount_label": "€ 30 goedkoper",
        "price_valid_until": "2026-11-01T22:59:59Z",
        "rating": 5,
        "review_count": 2
      },
      ...
      {
        "product_id": "11303602",
        "title": "Chocomel",
        "price": null,
        "member_price": 2.19,
        "member_program": "Lidl Plus",
        "member_price_label": "met Lidl Plus",
        "member_discount_label": "-27%",
        "available_online": false,
        "availability": "in_store_only",
        "store_offers": [
          {
            "label": "Alleen in de winkel vanaf 30/10 - 05/11",
            "type": "IN_STORE_FROM_FUTURE_DATE_RANGE",
            "valid_from": "2026-10-29T23:00:00Z",
            "valid_until": "2026-11-05T22:59:59Z"
          }
        ],
        "category": "Food"
      },
      ...
    ],
    "count": 60,
    "total_results": 178,
    "country": "nl",
    "language": "nl",
    "currency": "EUR",
    "web_shop": true
  },
  "meta": { "record_count": 60, "pagination": { "page": 1, "has_more": true, "page_size": 60, "total": 178 }, "cache_hit": false, "mode": "live" }
}

Lidl scrapen: wat je pas ziet als je de cijfers naast elkaar legt

De doorgestreepte prijs betekent niet overal hetzelfde. Lidl geeft per artikel aan of het om de eigen eerdere prijs gaat of om de adviesprijs van de fabrikant. In de steekproef van 955 rijen die we bij de bouw uit Duitsland, Frankrijk, Polen, Tsjechië en Spanje haalden, was dat 213 keer een adviesprijs en 72 keer een eerdere Lidl-prijs. Op lidl.nl ligt het andersom: bij de 178 aanbiedingen van 27 oktober 2026 telden we 84 eerdere prijzen en 6 adviesprijzen. Een scraper die alleen het doorgestreepte getal bewaart, kan die twee niet meer uit elkaar halen.

Een zoekterm zonder treffers geeft bij Lidl geen lege lijst. Op lidl.de leverde 'zzqqxxnonexist' 47 'resultaten' op en een volle pagina van 36 producten die er niets mee te maken hadden, terwijl de eigen teller van Lidl voor het trefwoord op 0 stond. Wij kijken naar die teller: staat die op 0, dan krijg je nul rijen en in `fallback_results_dropped` het aantal weggelaten opvulproducten. Staan echte treffers en opvulling op één pagina door elkaar, dan zegt `keyword_matches_on_page` hoeveel rijen echt bij het trefwoord horen.

Bij categorieën zat de valkuil in de link. Klopt het stukje tekst in het adres niet precies, dan stuurt Lidl je door naar het juiste adres en laat je paginanummer onderweg vallen. Pagina 2 kwam zo terug als pagina 1, zonder foutmelding. De engine volgt die doorverwijzing nu zelf en vraagt de pagina op het juiste adres opnieuw op.

Het aanbod wisselt elke week, dus een script dat één van deze drie dingen mist, levert ook elke week overtuigende maar verkeerde cijfers. Wil je één keer zien wat een koffiezetapparaat bij Lidl kost, open dan gewoon lidl.nl.

Grenzen en eerlijke kanttekeningen

  • Lidl biedt deze toegang niet zelf aan. Het is een onafhankelijke dienst, zonder contract of partnerschap met Lidl.
  • Bekend probleem: zet `limit` niet hoger dan 60. Op 27 oktober 2026 gaf `deals` op lidl.nl met `limit: 100` per pagina maar 60 rijen, terwijl pagina 2 bij rij 101 begon en `has_more` al op false stond: 58 van de 178 aanbiedingen kwamen nooit langs. Met `limit: 60` kwamen alle 178 binnen in drie pagina's. De standaard is 36.
  • Een voorraadaantal publiceert Lidl niet. Je krijgt een status (online leverbaar, binnenkort online, alleen in de winkel); `max_order_quantity` (10 bij de steelstofzuiger) is een bestelgrens, geen voorraad.
  • Reviewteksten zijn er niet: alleen het gemiddelde, het aantal beoordelingen en hoe vaak het product is aanbevolen.
  • Artikelen die alleen in de winkel liggen hebben geen beoordeling en vaak ook geen EAN.
  • Elke aanroep kost 1 credit, ook product/detail.
  • Je ziet altijd de stand van lidl.nl op het moment van de aanroep: een aanbieding die vanavond afloopt, staat morgen ook niet meer in je antwoord.