Tesco grocery prices as JSON, with the Clubcard price as a real number
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.
7 active endpoints. Every call is 1 credit.
- POST/tesco/v1/search
- POST/tesco/v1/product/detail
- POST/tesco/v1/product/reviews
- POST/tesco/v1/deals
- POST/tesco/v1/promotion
- POST/tesco/v1/category
- POST/tesco/v1/categories
What Tesco endpoints does ReefAPI ship?
7 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Tesco API
3 of 7 endpoints, ready to run
Tesco products for a keyword: the price without a Clubcard, the Clubcard price or multi-buy when Tesco runs one, the per-kg or per-litre price, was-prices, Aldi Price Match, rating, availability and the department path.
{ "ok": true, "meta": { "api": "tesco", "endpoint": "search", "mode": "live", "latency_ms": 1224.1, "record_count": 23, "cache_hit": false }, "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": "Food Cupboard", "value": "Food Cupboard", "count": 287, "selected": false }, { "name": "Fresh Food", "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": "World Foods", "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" } }
How the Tesco API works
Tesco is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 252 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Track a basket in five Tesco countries with both prices, like for like
Tesco's price field never includes the Clubcard discount, and loose produce shows an estimated item price. Three calls give a basket you can compare across stores and over time.
{"query": "milk", "country": "uk", "offers_only": true}Products on an offer, each with price, member_price or member_offer, unit_price and price_basis. Sponsored placements are removed unless you ask for them.
{"product_id": "317639416"}The full record: 6.00 GBP without a Clubcard, 5.15 GBP with one, 4.29 GBP per litre, ingredients, nutrition and 332 reviews summarised. One flat credit.
{"promotion_id": "100144020"}Every product in one Clubcard multi-buy - here the six 2-litre milks in "Any 2 for £4 Clubcard Price".
A basket where every product carries the price a normal shopper pays and, separately, the Clubcard price or multi-buy, with per-kg prices on a stated basis - for one credit per call, in any of five countries.
curl -X POST https://api.reefapi.com/tesco/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"milk"}'{
"ok": true,
"data": { … },
"meta": {
"api": "tesco",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}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.
Which store, which price, which id, and what Tesco does not publish
Five Tesco stores, three currencies, a numeric product id per country. Measured on 2026-09-15 across 49 products in 5 countries and more than 20 departments, 20 searches, 50 controlled cases and a comparison of 12 products against Tesco's own pages. Four of these lines go against us.
country picks the store: uk (GBP), ie (EUR), cz (CZK), sk (EUR), hu (HUF). Searches and product reads succeeded in all five on 2026-09-15, and every row's currency and product URL belonged to the store asked for.
price is the price without a Clubcard; member_price is the Clubcard price, read from Tesco's offer text in English, Czech, Slovak and Hungarian. On each country's offers page (48 products each) every Clubcard price became a number and none was at or above the normal price. Clubcard multi-buys come back as member_offer text.
12 of 12 products matched Tesco's own product and search pages on title, price, unit price, availability, rating and offer text, across all five countries. Search rows agreed with the full product record on 49 of 49 products, 21 of them on an offer.
price_basis reads per_item for packs, estimated_item for loose produce (the price is Tesco's estimate for one average item; unit_price is the real per-kg price) and per_unit for weighed counter products (the price is already per kg, with Tesco's weight options). A per-kg was-price on loose produce is returned as original_unit_price.
milk in the UK: 341 unfiltered, 12 with brand Arla, 23 Organic, 131 on offer, 124 in Fresh Food. Price sorting follows the shown price, which is the Clubcard price where there is one; sort by member_price where set, else price, to reproduce it. Sponsored products added on top of a page are removed by default and counted.
A product id is a number such as 317639416 and belongs to one store: a UK id asked in Ireland returns NOT_FOUND, never another product. A Tesco product URL from any of the five stores also works and sets the country.
Tesco publishes it only as text. The API converts every wording measured on 2026-09-15; a new wording would come back in promotions[].description with member_price null rather than a guessed number.
Availability is a status, not a quantity; max_order_quantity is Tesco's order cap. Prices are Tesco's online prices for a shopper with no store or postcode. There is no price history.
On 49 sampled products ingredients were filled on 33, nutrition on 30 and allergens on 27 - the gaps are household, clothing and marketplace items. Specifications appear only on marketplace items and size/colour variants only on clothing.
Tesco lists some products in more than one place, so a product returned by category can show a breadcrumb from another department - a lactose-free milk shelved under Dairy Free appears in Milk. breadcrumb is the product's own main location.
What people build with Tesco
The jobs this data is most often used for.
endpoints
credit per call
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.
What Tesco data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 252 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
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"])Have a question? We got answers.
The questions people actually ask before wiring up Tesco.
Get a free key →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.
91 E-commerce & Marketplaces APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Tesco, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 251 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-09-15.