API

Tesco API: ceny potravin a akce Clubcard z nakup.itesco.cz v JSON

Z nakup.itesco.cz, českého online obchodu Tesco, dostanete v JSON totéž, co má před sebou každý nepřihlášený zákazník: název, značka, cena v korunách, cena za kilogram nebo litr, Clubcard cena jako samostatné číslo, akce s datem od–do a u potravin složení, alergeny a tabulka výživových hodnot. Kdo hledá napojení pro dodavatele Tesca nebo přístup ke svému účtu Clubcard, je na špatné adrese: přes tohle API se nic neobjednává ani nespravuje, vrací jen veřejnou nabídku obchodu. Český obchod zvolíte parametrem `"country": "cz"`; stejný engine obsluhuje i slovenský, maďarský, irský a britský obchod Tesco.

Endpointy

endpointCo se vracíPovinné
searchHledání podle slova, jak by ho napsal zákazník (máslo, rohlík, Madeta). Každý řádek nese cenu bez Clubcard, Clubcard cenu, cenu za jednotku, slevu s původní cenou, EAN, hodnocení a zařazení v obchodě. Řazení podle ceny, filtry značky, oddělení, akcí a novinek; zaplacené pozice se vyřazují.query
product/detailJeden produkt (id nebo odkaz) se vším, co o něm Tesco uvádí: obě ceny a všechny akce, složení, alergeny, výživové hodnoty, skladování, čistá hmotnost, rozložení hodnocení a limit kusů na objednávku.product_id
dealsVýpis všech zboží v akci: Clubcard ceny, vícekusové akce, zlevnění i doprodej, se stejnými řádky jako hledání. Lze zúžit na jedno hlavní oddělení.vše volitelné
promotionVšechny produkty jedné akce podle id, které nese každý řádek v `promotions[].id`.promotion_id
categoryProdukty jedné kategorie (oddělení, ulička nebo regál) se stejnými filtry a řazením jako hledání.category_id
categoriesStrom kategorií českého obchodu s id, která přijímá `category`.vše volitelné
product/reviewsRecenze jednoho produktu od nejnovějších: hvězdičky, titulek, text, datum a označení ověřeného nákupu.product_id

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

Funkční příklad

Na „máslo“ Tesco vrátilo 117 produktů, jenže máslo je jen část z nich: Tesco přidá i croissanty, popcorn s máslovou příchutí nebo máslovou dýni. Filtr `department` „Máslo, margaríny a pomazánky“ výsledek zúžil na 56, margaríny a pomazánky v něm ale zůstaly. U přepuštěného másla Alfa je v `price` 99,90 Kč a v `member_price` 59,90 Kč s Clubcard. U dýně je 30,12 Kč jen odhad za jeden kus o průměrné váze 0,863 kg; skutečná cena je 34,90 Kč za kilogram v `unit_price`.

Požadavek
curl -X POST https://api.reefapi.com/tesco/v1/search \
  -H "x-api-key: VAS_KLIC" \
  -H "content-type: application/json" \
  -d '{"query": "máslo", "country": "cz", "page_size": 24}'
Odpověď (zkrácená)
{
  "ok": true,
  "data": {
    "results": [
      {
        "product_id": "215351291",
        "ean": "5051007118309",
        "title": "Tesco Máslo 82% tuku 250g",
        "brand": "TESCO",
        "url": "https://nakup.itesco.cz/shop/cs-CZ/products/215351291",
        "price": 36.9,
        "currency": "CZK",
        "unit_price": 147.6,
        "unit_of_measure": "kg",
        "price_basis": "per_item",
        "member_price": null,
        "max_order_quantity": 24,
        "breadcrumb": ["Mléčné, vejce a margaríny", "Máslo, margaríny a pomazánky", "Máslo", "Máslo"],
        "rating": 3.3,
        "review_count": 19
      },
      ...
      {
        "product_id": "220325360",
        "title": "Alfa Přepuštěné máslo 200g",
        "price": 99.9,
        "unit_price": 499.5,
        "member_price": 59.9,
        "member_unit_price": 299.5,
        "member_discount_percent": 40,
        "member_program": "Clubcard",
        "promotions": [
          {
            "type": "member_price",
            "member_only": true,
            "description": "59,90 Kč s Clubcard",
            "start_date": "2026-10-06T22:00:00Z",
            "end_date": "2026-11-03T23:00:00Z"
          }
        ]
      },
      ...
      {
        "product_id": "219355431",
        "gtin": "02800830000000",
        "ean": null,
        "title": "Dýně máslová",
        "price": 30.12,
        "unit_price": 34.9,
        "unit_of_measure": "kg",
        "sold_by": "weight",
        "price_basis": "estimated_item",
        "average_weight_kg": 0.863,
        "breadcrumb": ["Ovoce a zelenina", "Zelenina", "Dýně a cukety", "Dýně"]
      },
      ...
    ],
    "count": 24,
    "total_results": 117,
    "sponsored_dropped": 0,
    "country": "cz",
    "currency": "CZK"
  },
  "meta": { "record_count": 24, "country": "cz", "cache_hit": false, "mode": "live" }
}

Scraper na Tesco: kde se ceny tváří jinak, než jsou

Clubcard cena v datech Tesca jako číslo vůbec není, jen jako věta „59,90 Kč s Clubcard“. Pole, které by podle názvu mělo nést cenu po slevě, obsahuje u Clubcard akcí běžnou cenu. V září 2026, když jsme engine stavěli, to platilo u všech 282 Clubcard cen v pěti zemích; u 103 vícekusových Clubcard akcí bylo to pole dokonce prázdné. Skript, který věří číselnému poli, uloží běžnou cenu jako akční a slevu nenajde nikdy.

U zboží na váhu se míchají dvě jednotky. Citrony stály 25. 10. podle `price` 5,25 Kč, což je odhad za jeden citron o váze 0,195 kg, a akce hlásila „-61%, předtím 69,90 Kč“, jenže ta původní cena je za kilogram. Kdo porovná 5,25 s 69,90, vypočítá slevu přes 90 %. Engine proto ukládá původní cenu za kg do `original_unit_price` a `original_price` nechává prázdné.

Řazení „od nejlevnějšího“ Tesco počítá podle ceny, kterou ukazuje na regálu, a to je u zboží v akci Clubcard cena. Podle `price` pak pořadí vypadá rozházeně, podle `member_price`, a kde chybí, podle `price`, sedí. Navíc Tesco přidává zaplacené pozice nad rámec velikosti stránky; tehdy to bylo třeba 24 běžných a 6 sponzorovaných sýrů na první stránce.

Ve všech těchto případech odpověď vypadá v pořádku a chyba se ukáže až v součtech. Proto tady `price` znamená vždy cenu bez Clubcard, `member_price` vždy Clubcard cenu a u zboží na váhu pole `price_basis` říká, jestli jde o cenu za kus, odhad za kus nebo cenu za kilogram.

Omezení a poctivé poznámky

  • Rozhraní provozujeme sami, bez účasti Tesca: nejde o oficiální API a žádnou spolupráci ani smlouvu s Tescem nemáme.
  • Parametr `"country": "cz"` je potřeba posílat pokaždé, jinak odpověď přijde z britského tesco.com s cenami v librách.
  • Čte se nabídka online nákupu bez zadané adresy. Ceny a zásoby konkrétní prodejny, Tesco Expres ani ceny pohonných hmot na čerpacích stanicích Tesco API nevrací.
  • Vícekusová Clubcard akce nemá cenu za kus: přijde jen text v `member_offer` a `member_price` je null. U zboží na váhu může být Clubcard cena jen za kilogram (petržel: `member_unit_price` 34,90 Kč/kg, `member_price` null).
  • `discount_percent` dopočítáváme z obou cen a může se o bod lišit od štítku Tesca: u citronů 62 proti „-61%“.
  • Počet kusů skladem Tesco nezveřejňuje, jen stav (`in_stock`). `max_order_quantity` je limit na jednu objednávku, ne zásoba.
  • Zboží vážené na prodejně má GTIN začínající dvojkou (vnitřní kód obchodu), takže `ean` je null a `gtin` zůstává tak, jak ho Tesco uvádí.
  • Historii cen ani našeptávač API nemá a odpovědi u nás nezůstávají uložené (ve všech našich voláních `cache_hit: false`). Kdo chce sledovat vývoj, musí si je ukládat sám; každá akce má `end_date`, citrony byly zlevněné jen od 23. do 25. 10.