Tesco API

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.

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a Tesco endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
T
/tesco/v1

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.

7 endpoints

search

1 cr

Search a Tesco storefront by keyword.

required
query
optional
country, page, page_size, sort, brands, dietary, super_department, department, offers_only, new_only, include_sponsored, max_rotations

product/detail

1 cr

The full Tesco product record by product_id or URL.

required
product_id
optional
country, max_rotations

product/reviews

1 cr

Customer reviews of one Tesco product, newest first, paged.

required
product_id
optional
country, page, page_size, max_rotations

deals

1 cr

Tesco's special-offers listing.

required
optional
country, page, page_size, super_department, include_sponsored, max_rotations

promotion

1 cr

Every product in one Tesco promotion (for example all the milks in an 'Any 2 for £4 Clubcard…

required
promotion_id
optional
country, page, page_size, include_sponsored, max_rotations

category

1 cr

Every product in one Tesco category (department, aisle or shelf), paged, with the same rows,…

required
category_id
optional
country, page, page_size, sort, brands, dietary, offers_only, new_only, include_sponsored, max_rotations

categories

1 cr

A Tesco storefront's category tree.

required
optional
country, max_rotations

Every parameter, every allowed value →

Tesco API

3 of 7 endpoints, ready to run

View docs ↗

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.

1 credit1 required · 3 optional
POST/tesco/v1/search
ok1224 ms · 23 records · sample
{
  "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"
  }
}
Real response, fetched from the live endpoint with the parameters on the left — trimmed to the first few rows. Press Try it for the untrimmed response.

How the Tesco API works

Tesco is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 252 engines.

02
Call
POST /tesco/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 credit per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

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.

01search
POST/tesco/v1/search
{"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.

02detail
POST/tesco/v1/product/detail
{"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.

03promotion
POST/tesco/v1/promotion
{"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.

request
curl -X POST https://api.reefapi.com/tesco/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"milk"}'
response envelope
{
  "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 productprice (no Clubcard)member_price (Clubcard)What Tesco's offer text says
SMA Follow On Baby Milk Formula 6x200ml (UK)6.00 GBP5.15 GBP£5.15 Clubcard Price
Tesco Carrot Bag 500G (Ireland)0.89 EUR0.65 EUR65c Save 25% Clubcard Price
Předměřická mouka pšeničná světlá hladká 1kg (Czechia)21.90 CZK12.90 CZK12,90 Kč s Clubcard
Rajo Smotana na šľahanie 30 % 250 ml (Slovakia)2.49 EUR1.24 EUR1,24 € Polovičná cena s Clubcard
Milli UHT főzőtejszín 20% 2 x 200 ml (Hungary)1,149 HUF999 HUF999 Ft Clubcarddal
Arla Big Milk Fresh Whole Milk 2L (UK)2.75 GBPnull - a multi-buy, returned as member_offerAny 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.

Five stores: United Kingdom, Ireland, Czechia, Slovakia, Hungary

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.

Two prices, never merged

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.

Checked against Tesco's own pages

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.

Loose and weighed products say what their price means

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.

Filters bite, and the sort has a rule

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.

Ids are per country

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.

Against us: the Clubcard price is not a field at Tesco

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.

Against us: no stock count, no store prices, no history

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.

Against us: label data only on food, specs only on marketplace

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.

Against us: a category also lists products shelved elsewhere

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.

7

endpoints

1

credit per call

01

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.

02

FMCG brands monitor Clubcard prices, multi-buys and clearance on their products across five Tesco countries with deals and promotion.

03

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.

04

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 →
$0.67–$1.50 / 1,000 credits
  • 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
curl -X POST https://api.reefapi.com/tesco/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"milk"}'
python
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"])
FAQ

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.

0/4000

No account needed · we reply from [email protected]

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.