API

Lidl API: akční leták, e-shop a ceny Lidl Plus z lidl.cz v JSON

Lidl své ceny vývojářům přes veřejné API nezpřístupňuje. Tohle rozhraní čte lidl.cz očima nepřihlášeného zákazníka a vrací dvě různé nabídky: zboží z e-shopu (nářadí Parkside, kuchyň Silvercrest, oblečení Crivit…) s cenou, hodnocením a dodáním, a nabídky z akčního letáku pro prodejny, tedy i potraviny, pivo nebo drogerii, včetně cen, které platí jen s aplikací Lidl Plus. S účtem Lidl Plus ani s dodavatelským portálem Lidlu nepracuje a objednávky nevytváří; vidí jen to, co Lidl ukazuje každému návštěvníkovi. Pro Česko patří do každého dotazu `"country": "cz"`, jinak se čte německý lidl.de.

Endpointy

endpointCo se vracíPovinné
searchHledání podle slova nebo EAN: cena, přeškrtnutá cena s rozlišením, zda je to doporučená cena výrobce, nebo předchozí cena Lidlu, sleva, cena za jednotku, cena Lidl Plus zvlášť, hodnocení, dostupnost v e-shopu a termín v prodejnách. Filtry značky, ceny, hodnocení a dostupnosti; řazení podle ceny, hodnocení, novinek, prodejnosti nebo slevy.query
category/productsTotéž pro jednu kategorii, podle id z adresy (…/h/…/h10006306 → h10006306) nebo podle celé adresy.category
dealsNabídky z letáku pro prodejny, aktuální i ty, které teprve začnou: cena, původní cena, sleva, cena za kilogram či litr, cena Lidl Plus a termín platnosti v `store_offers` („Pouze v prodejnách od 30.10. - 01.11.“). Volitelně s klíčovým slovem v `query`.vše volitelné
product/detailCelá karta zboží podle id nebo adresy: EAN, galerie, ceny, hodnocení s počtem doporučení, zda je zboží skladem online, doba a cena doručení, maximální počet kusů v objednávce, popis, tabulka parametrů, varianty a návody v PDF.product_id

Každé volání se účtuje v kreditech. Neúspěšná a blokovaná volání jsou zdarma.

Funkční příklad

Na dotaz „hermelín“ vrátil leták 15 nabídek, hermelín je ale jen jedna z nich (`keyword_matches_on_page`: 1); zbytek doplnil Lidl sám: celer, mandarinky, gouda. U Sedlčanského hermelínu Duopack je `price` null, protože Lidl cenu 49,90 Kč ukazuje jen s aplikací. Najdete ji v `member_price` s popiskem „s Lidl Plus“. Termín akce je u letákového zboží v `store_offers`, ne v `price_valid_from`, které tu zůstává prázdné.

Požadavek
curl -X POST https://api.reefapi.com/lidl/v1/deals \
  -H "x-api-key: VAS_KLIC" \
  -H "content-type: application/json" \
  -d '{"country": "cz", "query": "hermelín"}'
Odpověď (zkrácená)
{
  "ok": true,
  "data": {
    "results": [
      {
        "product_id": "10054669",
        "title": "SEDLČANSKÝ HERMELÍN Duopack",
        "url": "https://www.lidl.cz/p/sedlcansky-hermelin-duopack/p10054669",
        "currency": "CZK",
        "price": null,
        "price_valid_from": null,
        "member_price": 49.9,
        "member_program": "Lidl Plus",
        "member_price_label": "s Lidl Plus",
        "member_discount_label": "-10 Kč",
        "member_unit_price_text": "100 g = 24,95 Kč",
        "availability": "in_store_only",
        "availability_text": "Pouze v prodejnách od 30.10. - 01.11.",
        "store_offers": [
          { "label": "Pouze v prodejnách od 30.10. - 01.11.", "type": "IN_STORE_FROM_FUTURE_DATE_RANGE", "valid_from": "2026-10-29T23:00:00Z", "valid_until": "2026-11-01T22:59:59Z" }
        ],
        "category": "Food",
        ...
      },
      {
        "product_id": "10057377",
        "title": "Celer",
        "currency": "CZK",
        "price": 16.9,
        "price_before_discount": 34.9,
        "price_before_discount_type": "previous_price",
        "discount_percent": 51,
        "unit_price_text": "1 kg",
        "member_price": null,
        "availability_text": "Pouze v prodejnách od 29.10. - 01.11.",
        ...
      },
      ...
    ],
    "count": 15,
    "total_results": 15,
    "keyword_matches_on_page": 1,
    "country": "cz",
    "language": "cs",
    "currency": "CZK",
    "web_shop": true,
    "query": "hermelín"
  },
  "meta": { "record_count": 15, "country": "cz", "pagination": { "page": 1, "has_more": false, "page_size": 15, "total": 15 }, "charged_credits": 1, "cache_hit": false, "mode": "live" }
}

Scraper na Lidl: tři místa, kde cena lže

První je Lidl Plus. U části letákového zboží Lidl veřejnou cenu vůbec neuvádí, jen cenu s aplikací. Skript, který bere „první cenu na kartě“, tu buď nenajde nic, nebo uloží členskou cenu jako běžnou. Z 418 letákových nabídek, které jsme 26. 10. 2026 na lidl.cz prošli, mělo 7 jen cenu s Lidl Plus (hermelín, mleté kuřecí maso, toaletní papír…). V odpovědi API mají tyto položky `price` null a částka je v `member_price`.

Druhé je přeškrtnutá cena. Vypadá jako „předtím“, často je to ale doporučená cena výrobce. Ve vzorku 955 řádků z pěti zemí včetně Česka, který jsme prošli při stavbě enginu v září 2026, šlo o doporučenou cenu ve 213 případech a o předchozí cenu Lidlu jen v 72. Sleva vůči ceně, za kterou Lidl zboží neprodával, je jiná informace než zlevnění, proto ji engine rozlišuje v `price_before_discount_type`.

Třetí je stránkování kategorií. Když adresa kategorie nemá přesně ten slug, který Lidl čeká, přesměruje na správnou adresu a parametry stránky cestou ztratí: druhá stránka pak přišla jako první, s 36 stejnými produkty a bez chyby. Engine přesměrování nenásleduje naslepo, vezme z něj správnou adresu a dotaz zopakuje s parametry.

Leták se mění každý týden. Chyba v cenách se proto neukáže při jednom běhu, ale až na grafu za měsíc, kdy už se nedá říct, od kterého týdne čísla nesedí.

Omezení a poctivé poznámky

  • Jde o nezávislé rozhraní bez vazby na Lidl: oficiální není a obchodní ani partnerský vztah s Lidlem nemáme.
  • Výchozí země je Německo. Bez `"country": "cz"` přijdou data z lidl.de a ceny v eurech.
  • S `limit` nad 60 teď na lidl.cz přicházejí neúplné stránky (měřeno 26. 10. 2026 s hodnotou 100): v `deals` i `search` vrátil Lidl na stránku jen 60 položek, stránkování v `deals` ale posouvalo o 100. Ze 658 letákových nabídek jsme tak na sedmi stránkách dostali 418 a `has_more` už hlásil konec. Držte `limit` na 60 nebo níž; výchozích 36 funguje.
  • U letákového zboží zůstávají `price_valid_from` a `price_valid_until` prázdné (u všech 333 nabídek, které Lidl vede v kategorii „Food“, z těch 418, které jsme viděli). Termín akce je v `store_offers` a jako text v `availability_text`.
  • Hledání v letáku bere slovo jen orientačně: na „hermelín“ přišlo 15 nabídek a z toho jeden hermelín, na „máslo“ 21 nabídek, z nichž Lidl za shodu s dotazem počítal 10. Tento počet vrací `keyword_matches_on_page`; které řádky to jsou, Lidl neoznačuje.
  • Typ přeškrtnuté ceny přebíráme z příznaku Lidlu a v letáku nemusí sedět: zmrzlina Häagen-Dazs měla `previous_price`, ale její `unit_price_text` začínal větou „* doporučená prodejní cena výrobce“.
  • Cenu za jednotku Lidl v letáku píše nejednotně („cena za 100 g“, „1 kg“, u vína jen čárka). Číslo v `unit_price` proto přijde jen tam, kde je z textu jednoznačné; `unit_price_text` je vždy tak, jak ho Lidl napsal.
  • Kolik kusů zbývá v konkrétní prodejně, API neví, a starší ceny neuchovává: historii letákových cen si skládáte z vlastních uložených výsledků `deals`.
  • Všechny čtyři akce stojí 1 kredit za volání.