Tesco API & Scraper
The Tesco API turns Tesco's online grocery in the United Kingdom, Ireland, Czechia, Slovakia and Hungary into clean JSON in seven actions: search, product/detail, product/reviews, deals, promotion, category and categories.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
Pick the store with country (uk, ie, cz, sk, hu); prices come back in GBP, EUR, CZK or HUF. Every product carries two prices kept apart - price, what a shopper without a Clubcard pays, and member_price, the Clubcard price - because Tesco publishes the Clubcard price only as offer text such as "£5.15 Clubcard Price" or "12,90 Kč s Clubcard", and the API turns that text into a number in all five languages. A Clubcard multi-buy such as "Any 2 for £4 Clubcard Price" comes back as member_offer, with no invented per-item price. Rows also carry the unit price per kg or litre, the was-price of a price cut or clearance, whether Tesco matches the Aldi price, rating and review count, availability, the department path and, for Tesco Marketplace items, the seller and delivery charge. Loose fruit and vegetables are flagged, because their price is Tesco's estimate for one average item and the real price is per kg. product/detail adds every image, ingredients, allergens, the nutrition table, storage, origin, manufacturer and return addresses, the rating distribution, every marketplace offer and clothing size and colour variants. Verification on 2026-09-15: 20 of 20 searches and 49 of 49 product reads across the five countries succeeded, 50 of 50 controlled cases passed, 12 of 12 products matched Tesco's own pages on title, price, unit price, availability, rating and offer text, and search rows agreed with product records on 49 of 49 products. No Tesco account needed - one ReefAPI key and the standard { ok, data, meta, error } envelope.
Tesco shows the Clubcard price as offer text - the API returns it as a number, next to the normal price
This is the one thing to know before you build a Tesco price tracker. The price field of a Tesco product is always the price without a Clubcard; the Clubcard price exists only inside the offer text, worded differently in each country. The API reads that text and returns both prices, never merged. Measured on 2026-09-15.
| Tesco product | price (no Clubcard) | member_price (Clubcard) | What Tesco's offer text says |
|---|---|---|---|
| SMA Follow On Baby Milk Formula 6x200ml (UK) | 6.00 GBP | 5.15 GBP | £5.15 Clubcard Price |
| Tesco Carrot Bag 500G (Ireland) | 0.89 EUR | 0.65 EUR | 65c Save 25% Clubcard Price |
| Předměřická mouka pšeničná světlá hladká 1kg (Czechia) | 21.90 CZK | 12.90 CZK | 12,90 Kč s Clubcard |
| Rajo Smotana na šľahanie 30 % 250 ml (Slovakia) | 2.49 EUR | 1.24 EUR | 1,24 € Polovičná cena s Clubcard |
| Milli UHT főzőtejszín 20% 2 x 200 ml (Hungary) | 1,149 HUF | 999 HUF | 999 Ft Clubcarddal |
| Arla Big Milk Fresh Whole Milk 2L (UK) | 2.75 GBP | null - a multi-buy, returned as member_offer | Any 2 for £4 Clubcard Price |
On Tesco's offers page in each of the five countries, every Clubcard price was turned into a number and none came out at or above the normal price (48 products per country). member_unit_price carries the Clubcard price per kg or litre, for example 4.29 GBP per litre on the SMA formula.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/tesco/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "milk"
}
}{
"ok": true,
"meta": {
"api": "tesco",
"endpoint": "search",
"mode": "live",
"latency_ms": 788.2,
"record_count": 23,
"bytes": 49416,
"cache_hit": false,
"country": "uk",
"pagination": {
"page": 1,
"has_more": true,
"page_size": 24,
"total": 356
}
},
"data": {
"results": [
{
"product_id": "254656543",
"base_product_id": "54550994",
"gtin": "05000436589457",
"ean": "5000436589457",
"title": "Tesco British Semi Skimmed Milk 2.272L, 4 Pints",
"brand": "TESCO",
"url": "https://www.tesco.com/shop/en-GB/products/254656543",
"image": "https://digitalcontent.api.tesco.com/v2/media/ghs/07531d6d-8bf2-41b5-a5ad-e2ae0a71f2b3/17233543-2c5b-4a06-a0ab-cfdbddcd488e_2028878860.jpeg",
"listing_type": "grocery",
"price": 1.65,
"currency": "GBP",
"unit_price": 0.73,
"unit_of_measure": "litre",
"sold_by": "piece",
"price_basis": "per_item",
"average_weight_kg": null,
"catch_weight_options": null,
"member_price": null,
"member_unit_price": null,
"member_unit": null,
"member_offer": null,
"member_discount_percent": null,
"member_program": null,
"original_price": null,
"original_unit_price": null,
"discount_percent": null,
"multi_buy_offer": null,
"clearance": false,
"promotions": [],
"deposit_return_charge": null,
"availability": "in_stock",
"in_stock": true,
"max_order_quantity": 16,
"is_new": false,
"breadcrumb": [
"Fresh Food",
"Milk, Butter & Eggs",
"Milk"
],
"shelf_id": "b;RnJlc2glMjBGb29kJTdDTWlsaywlMjBCdXR0ZXIlMjAmJTIwRWdncyU3Q01pbGslN0NTZW1pLVNraW1tZWQlMjBNaWxr",
"rating": 4,
"review_count": 684,
"rating_scale": 5,
"marketplace": false,
"seller": null,
"delivery": null,
"sponsored": false,
"price_match": [
"ALDI"
],
"aldi_price_match": true,
"low_everyday_price": false,
"low_price_promise": false
},
{
"product_id": "254656399",
"base_product_id": "54550913",
"gtin": "05000436589341",
"ean": "5000436589341",
"title": "Tesco British Whole Milk 2.272L, 4 Pints",
"brand": "TESCO",
"url": "https://www.tesco.com/shop/en-GB/products/254656399",
"image": "https://digitalcontent.api.tesco.com/v2/media/ghs/15b6b16b-0a96-45e1-a644-320962c71594/ade2b509-b8ba-451c-9d6c-807ee202fe98_1802350944.jpeg",
"listing_type": "grocery",
"price": 1.65,
"currency": "GBP",
"unit_price": 0.73,
"unit_of_measure": "litre",
"sold_by": "piece",
"price_basis": "per_item",
"average_weight_kg": null,
"catch_weight_options": null,
"member_price": null,
"member_unit_price": null,
"member_unit": null,
"member_offer": null,
"member_discount_percent": null,
"member_program": null,
"original_price": null,
"original_unit_price": null,
"discount_percent": null,
"multi_buy_offer": null,
"clearance": false,
"promotions": [],
"deposit_return_charge": null,
"availability": "in_stock",
"in_stock": true,
"max_order_quantity": 16,
"is_new": false,
"breadcrumb": [
"Fresh Food",
"Milk, Butter & Eggs",
"Milk"
],
"shelf_id": "b;RnJlc2glMjBGb29kJTdDTWlsaywlMjBCdXR0ZXIlMjAmJTIwRWdncyU3Q01pbGslN0NXaG9sZSUyME1pbGs=",
"rating": 3.7,
"review_count": 200,
"rating_scale": 5,
"marketplace": false,
"seller": null,
"delivery": null,
"sponsored": false,
"price_match": [
"ALDI"
],
"aldi_price_match": true,
"low_everyday_price": false,
"low_price_promise": false
},
{
"product_id": "252207537",
"base_product_id": "54169392",
"gtin": "05000436338826",
"ean": "5000436338826",
"title": "Tesco British Semi Skimmed Milk 1.13L, 2 Pints",
"brand": "TESCO",
"url": "https://www.tesco.com/shop/en-GB/products/252207537",
"image": "https://digitalcontent.api.tesco.com/v2/media/ghs/8bb67050-c132-4326-97f2-04be9fdce6c9/93e23843-fc27-4cb7-9448-9820e01e8281_798947363.jpeg",
"listing_type": "grocery",
"price": 1.2,
"currency": "GBP",
"unit_price": 1.06,
"unit_of_measure": "litre",
"sold_by": "piece",
"price_basis": "per_item",
"average_weight_kg": null,
"catch_weight_options": null,
"member_price": null,
"member_unit_price": null,
"member_unit": null,
"member_offer": null,
"member_discount_percent": null,
"member_program": null,
"original_price": null,
"original_unit_price": null,
"discount_percent": null,
"multi_buy_offer": null,
"clearance": false,
"promotions": [],
"deposit_return_charge": null,
"availability": "in_stock",
"in_stock": true,
"max_order_quantity": 16,
"is_new": false,
"breadcrumb": [
"Drinks",
"Milk & Milkshakes",
"Milk"
],
"shelf_id": "b;RHJpbmtzJTdDTWlsayUyMCYlMjBNaWxrc2hha2VzJTdDTWlsayU3Q1NlbWktU2tpbW1lZCUyME1pbGs=",
"rating": 4.3,
"review_count": 286,
"rating_scale": 5,
"marketplace": false,
"seller": null,
"delivery": null,
"sponsored": false,
"price_match": [
"ALDI"
],
"aldi_price_match": true,
"low_everyday_price": false,
"low_price_promise": false
}
],
"count": 23,
"total_results": 356,
"page": 1,
"page_size": 24,
"page_count": 15,
"sponsored_dropped": 4,
"filters_available": {
"super_departments": [
{
"name": "[redacted-name]",
"value": "Food Cupboard",
"count": 287,
"selected": false
},
{
"name": "[redacted-name]",
"value": "Fresh Food",
"count": 213,
"selected": false
},
{
"name": "Treats & Snacks",
"value": "Treats & Snacks",
"count": 196,
"selected": false
}
],
"departments": [
{
"name": "Chocolate, Sweets, Mints & Chewing Gum",
"value": "Chocolate, Sweets, Mints & Chewing Gum",
"count": 103,
"selected": false
},
{
"name": "Biscuits & Cereal Bars",
"value": "Biscuits & Cereal Bars",
"count": 44,
"selected": false
},
{
"name": "[redacted-name]",
"value": "World Foods",
"count": 36,
"selected": false
}
],
"brands": [
{
"name": "Cadbury",
"value": "Cadbury",
"count": 49,
"selected": false
},
{
"name": "TESCO",
"value": "TESCO",
"count": 31,
"selected": false
},
{
"name": "Arla",
"value": "Arla",
"count": 12,
"selected": false
}
],
"dietary": [
{
"name": "No celery",
"value": "No celery",
"count": 259,
"selected": false
},
{
"name": "No fish",
"value": "No fish",
"count": 259,
"selected": false
},
{
"name": "No lupin",
"value": "No lupin",
"count": 259,
"selected": false
}
],
"offers_count": 141,
"new_count": 18
},
"query": "milk",
"matched_query": null,
"sort_applied": "relevance",
"country": "uk",
"currency": "GBP"
}
}What the Tesco API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search a Tesco storefront by keyword. Each product comes with the price without a Clubcard and, separately, the Clubcard price or Clubcard multi-buy when Tesco runs one, the per-kg or per-litre unit price, was-prices of price cuts, clearance, Aldi Price Match, rating, availability, department path and, for marketplace items, the seller and delivery charge. Sort by price; filter by brand, dietary facet, department, special offers or new products. | Pricing teams call search to search a Tesco storefront by keyword. | query, country, page, page_size, sort, ... |
| product/detail | The full Tesco product record by `product_id` or URL: every image, both prices and every promotion, unit price, availability and order limit, GTIN/EAN, ingredients, allergens, the nutrition table, storage, origin, specifications, alcohol and energy information, manufacturer and return addresses, rating distribution, marketplace offers from every seller, and clothing size/colour variants. | Marketplace operators call product/detail to get the full Tesco product record by `product_id` or URL. | product_id, country, max_rotations |
| product/reviews | Customer reviews of one Tesco product, newest first, paged: rating, title, text, date, verified-buyer and syndication flags, plus the overall rating and its distribution. | Catalog enrichment teams call product/reviews to get customer reviews of one Tesco product, newest first, paged. | product_id, country, page, page_size, max_rotations |
| deals | Tesco's special-offers listing: every product currently on a Clubcard price, multi-buy, price cut or clearance, with the same rows as search, optionally narrowed to one top-level department. | Retail analysts call deals to get tesco's special-offers listing. | country, page, page_size, super_department, include_sponsored, ... |
| promotion | Every product in one Tesco promotion (for example all the milks in an 'Any 2 for £4 Clubcard Price' offer), by the promotion id any product row carries. | Pricing teams call promotion to get every product in one Tesco promotion (for example all the milks in an 'Any 2 for £4 Clubcard…. | promotion_id, country, page, page_size, include_sponsored, ... |
| category | Every product in one Tesco category (department, aisle or shelf), paged, with the same rows, sorting and filters as search. Category ids come from `categories` or any product. | Marketplace operators call category to get every product in one Tesco category (department, aisle or shelf), paged, with the same rows,…. | category_id, country, page, page_size, sort, ... |
| categories | A Tesco storefront's category tree: every top-level department with its departments, and the id that `category` reads. | Catalog enrichment teams call categories to get a Tesco storefront's category tree. | country, max_rotations |
Call search from your stack
curl -X POST https://api.reefapi.com/tesco/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"milk"}'import requests
r = requests.post(
"https://api.reefapi.com/tesco/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "milk"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/tesco/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "milk"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.tesco.search with {"query":"milk"}.Who uses this API and why
- Grocery price trackers in the UK and Ireland store price and member_price separately, because the Clubcard price exists only as offer text on Tesco.
- FMCG brands monitor Clubcard prices, multi-buys and clearance on their products across five Tesco countries with deals and promotion.
- Retail analysts compare per-kg and per-litre prices like for like, with loose and weighed products flagged so an estimated item price is never compared with a pack price.
- Catalogue teams match EANs to Tesco products and pull ingredients, allergens, nutrition and origin for label compliance.
Questions developers ask before integrating
Which price should I store - price or member_price?
Store both, and label them. price is what a shopper without a Clubcard pays; member_price is the Clubcard price and is null when Tesco runs no Clubcard price on that product. A Clubcard multi-buy ("Any 2 for £4") has no single-item member price, so it comes back as member_offer text. On 2026-09-15, 13 of 49 sampled products had a member price and 5 a Clubcard multi-buy.
Why is price-ascending not in order of price?
Because Tesco sorts by the price its shelf shows, and that is the Clubcard price when a product has one. On a cheese search the first product was 1.00 GBP with a 0.50 GBP Clubcard price. Sort your results by member_price where it is set, otherwise price, and the order Tesco returns is exactly ascending - checked on three consecutive pages.
Loose fruit and vegetables have an odd price - why?
Tesco prices loose produce per kg and shows an estimate for one average item. A loose red pepper in Czechia read 12.02 CZK, which is 0.219 kg at 54.90 CZK per kg; price_basis reads estimated_item, average_weight_kg is 0.219 and unit_price is the real 54.90 per kg. Its price cut "-31%, předtím 79,90 Kč" is also per kg, so it is returned as original_unit_price 79.90, never as a was-price of the item. Weighed counter products such as meat and cheese read price_basis per_unit: their price is already per kg, with the weight options Tesco offers.
Which countries are covered, and do product ids work across them?
Five Tesco stores: uk (tesco.com, GBP), ie (tesco.ie, EUR), cz (nakup.itesco.cz, CZK), sk (potravinydomov.itesco.sk, EUR) and hu (bevasarlas.tesco.hu, HUF). Search and product reads succeeded in all five on 2026-09-15. Product ids belong to one country: a UK id asked in Ireland returns NOT_FOUND. A product URL from any of the five stores sets the country by itself.
Do the filters really apply?
Yes. For the keyword milk in the UK on 2026-09-15: 341 results unfiltered, 12 with brands Arla (every row Arla), 23 with dietary Organic, 131 with offers_only (every row carrying an offer), 124 in the Fresh Food department and 82 in Milk, Butter & Eggs. new_only returned only products Tesco marks as new. The values to pass come back in filters_available with their counts. Sponsored products Tesco adds on top of a page are removed by default and counted in sponsored_dropped.
What do I get for Tesco Marketplace items?
Rows sold by a third-party seller read marketplace true, with the seller's name and id, the delivery estimate and the delivery charge. product/detail lists every offer, each with its own price and seller. A marketplace "Save £60.00" is a real was-price: 159.99 GBP down to 99.99 GBP, discount_percent 38.
What does Aldi Price Match mean in the data?
aldi_price_match is true when Tesco says it matches the Aldi price on that product, and price_match lists the competitors matched. In the UK milk search on 2026-09-15 Tesco's own-brand fresh milks carried it; it is false on products without the promise.
What does Tesco NOT publish?
The Clubcard price as a number - only as offer text, which the API converts. No stock count, only availability. No price history. No store-specific prices: the API returns Tesco's online prices for a shopper with no store or postcode. Specifications and variants appear only on marketplace and clothing items, and label information (ingredients, allergens, nutrition) only on food: on 49 sampled products ingredients were filled on 33 and nutrition on 30. Review authors' names are not shown.
What is the Tesco API?
Tesco API is a ReefAPI endpoint group for uk, irish, czech, slovak and hungarian grocery prices with the clubcard price kept separate. It returns live JSON through POST requests under /tesco/v1.
Is the Tesco API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Tesco calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Tesco login or account?
No login to Tesco is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Tesco data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Tesco API use?
Tesco actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Tesco from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call tesco actions with the same key, credit pool and JSON envelope used by normal REST requests.