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
| endpoint | Co se vrací | Povinné |
|---|---|---|
| search | Hledá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/detail | Jeden 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 |
| deals | Vý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é |
| promotion | Všechny produkty jedné akce podle id, které nese každý řádek v `promotions[].id`. | promotion_id |
| category | Produkty jedné kategorie (oddělení, ulička nebo regál) se stejnými filtry a řazením jako hledání. | category_id |
| categories | Strom kategorií českého obchodu s id, která přijímá `category`. | vše volitelné |
| product/reviews | Recenze 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`.
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}'{
"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.