Tesco Category Products API
Pass a category facet to collect one page of Tesco products. Follow page numbers and keep the same category and sort order.
- 1–8 credits per call
- Failed calls are free
- Updated
- tesco.category.products.list
{ "total_count": 181, "page": { "count": 5, "matchType": null, "offset": 0, "pageId": null, "pageNo": 1, "pageSize": 5, "totalCount": 181, "query": { "actualTerm": null, "queryPhase": "primary", "searchTerm": null } }, "raw": { "status": 200, "data": { "category": { "facets": null, "options": { "sortBy": [ "relevance", "price-ascending" ] }, "pageInformation": { "count": 5, "matchType": null, "offset": 0, "pageId": null, "pageNo": 1, "pageSize": 5, "totalCount": 181, "query": { "actualTerm": null, "queryPhase": "primary", "searchTerm": null } }, "facetLists": [ { "category": "Superdepartment", "categoryId": "superDepartment", "facets": [ { "binCount": 280, "facetId": "Fresh Food", "facetName": "Fresh Food", "isSelected": true } ] }, { "category": "Department", "categoryId": "department", "facets": [ { "binCount": 280, "facetId": "Fresh Fruit", "facetName": "Fresh Fruit", "isSelected": true } ] } ], "results": [ { "node": { "title": "Tesco Pink Lady Apples 5 Pack", "adId": null, "aisleId": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q0FwcGxlcyUyMCYlMjBQZWFycw==", "aisleName": "Apples & Pears", "averageWeight": 0, "baseProductId": "77091643", "brandName": "TESCO", "bulkBuyLimit": 99, "bulkBuyLimitGroupId": null, "bulkBuyLimitMessage": null, "catchWeightList": null, "context": null, "departmentId": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA==", "departmentName": "Fresh Fruit", "displayType": "Quantity", "groupBulkBuyLimit": 0, "gtin": "00000003249833", "id": "284477542", "increment": 0, "isInFavourites": null, "isNew": false, "isRestrictedOrderAmendment": null, "maxQuantityAllowed": 99, "maxWeight": 0, "minWeight": 0, "modelMetadata": null, "productType": "SingleProduct", "quantityInBasket": null, "restrictedDelivery": null, "shelfId": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q0FwcGxlcyUyMCYlMjBQZWFycyU3Q1BpbmslMjAmJTIwUmVkJTIwQXBwbGVz", "shelfName": "Pink & Red Apples", "shortDescription": "Apples.", "superDepartmentId": "b;RnJlc2glMjBGb29k", "superDepartmentName": "Fresh Food", "timeRestrictedDelivery": null, "tpnb": "77091643", "tpnc": "284477542", "typename": "ProductType", "reviews": { "stats": { "noOfReviews": 193, "overallRating": 2.9, "overallRatingRange": 5 } }, "details": { "components": [ { "isLowEverydayPricing": false } ] }, "images": { "display": [ { "default": {} } ] }, "media": { "defaultImage": { "aspectRatio": 1 } }, "sellers": { "results": [ { "fulfilment": null, "id": "284477542", "isForSale": true, "seller": null, "status": "AvailableForSale", "price": { "price": 2.9, "actual": 2.9, "unitOfMeasure": "each", "unitPrice": 0.58 }, "promotions": [] } ] }, "description": [ "Apples." ], "restrictions": [] } }, { "node": { "title": "Jaffa Easy Peelers 600g", "adId": null, "aisleId": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q09yYW5nZXMsJTIwTGVtb25zJTIwJiUyMENpdHJ1cyUyMEZydWl0", "aisleName": "Oranges, Lemons & Citrus Fruit", "averageWeight": 0, "baseProductId": "78922224", "brandName": "TESCO", "bulkBuyLimit": 99, "bulkBuyLimitGroupId": null, "bulkBuyLimitMessage": null, "catchWeightList": null, "context": null, "departmentId": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA==", "departmentName": "Fresh Fruit", "displayType": "Quantity", "groupBulkBuyLimit": 0, "gtin": "00000003260630", "id": "288135169", "increment": 0, "isInFavourites": null, "isNew": false, "isRestrictedOrderAmendment": null, "maxQuantityAllowed": 99, "maxWeight": 0, "minWeight": 0, "modelMetadata": null, "productType": "SingleProduct", "quantityInBasket": null, "restrictedDelivery": null, "shelfId": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q09yYW5nZXMsJTIwTGVtb25zJTIwJiUyMENpdHJ1cyUyMEZydWl0JTdDQ2xlbWVudGluZXMlMjAmJTIwRWFzeSUyMFBlZWxlc…", "shelfName": "Clementines & Easy Peelers", "shortDescription": "Clementines, Mandarin", "superDepartmentId": "b;RnJlc2glMjBGb29k", "superDepartmentName": "Fresh Food", "timeRestrictedDelivery": null, "tpnb": "78922224", "tpnc": "288135169", "typename": "ProductType", "reviews": { "stats": { "noOfReviews": 401, "overallRating": 2.4, "overallRatingRange": 5 } }, "details": { "components": [ { "isLowEverydayPricing": false } ] }, "images": { "display": [ { "default": {} } ] }, "media": { "defaultImage": { "aspectRatio": 1 } }, "sellers": { "results": [ { "fulfilment": null, "id": "288135169", "isForSale": true, "seller": null, "status": "AvailableForSale", "price": { "price": 2.2, "actual": 2.2, "unitOfMeasure": "kg", "unitPrice": 3.67 }, "promotions": [ { "description": "£1.49 Clubcard Price", "endDate": "2026-11-03T00:00:00Z", "id": "102760175", "promotionType": null, "startDate": "2026-10-05T23:00:00Z", "unitSellingInfo": "£2.48/kg", "price": { "afterDiscount": 2.2, "beforeDiscount": null }, "attributes": [ "CLUBCARD_PRICING" ] } ] } ] }, "description": [ "Clementines, Mandarin" ], "restrictions": [] } } ] } } }, "items": [ { "title": "Tesco Pink Lady Apples 5 Pack", "adId": null, "aisleId": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q0FwcGxlcyUyMCYlMjBQZWFycw==", "aisleName": "Apples & Pears", "averageWeight": 0, "baseProductId": "77091643", "brandName": "TESCO", "bulkBuyLimit": 99, "bulkBuyLimitGroupId": null, "bulkBuyLimitMessage": null, "catchWeightList": null, "context": null, "departmentId": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA==", "departmentName": "Fresh Fruit", "displayType": "Quantity", "groupBulkBuyLimit": 0, "gtin": "00000003249833", "id": "284477542", "increment": 0, "isInFavourites": null, "isNew": false, "isRestrictedOrderAmendment": null, "maxQuantityAllowed": 99, "maxWeight": 0, "minWeight": 0, "modelMetadata": null, "productType": "SingleProduct", "quantityInBasket": null, "restrictedDelivery": null, "shelfId": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q0FwcGxlcyUyMCYlMjBQZWFycyU3Q1BpbmslMjAmJTIwUmVkJTIwQXBwbGVz", "shelfName": "Pink & Red Apples", "shortDescription": "Apples.", "superDepartmentId": "b;RnJlc2glMjBGb29k", "superDepartmentName": "Fresh Food", "timeRestrictedDelivery": null, "tpnb": "77091643", "tpnc": "284477542", "typename": "ProductType", "reviews": { "stats": { "noOfReviews": 193, "overallRating": 2.9, "overallRatingRange": 5 } }, "details": { "components": [ { "isLowEverydayPricing": false } ] }, "images": { "display": [ { "default": {} } ] }, "media": { "defaultImage": { "aspectRatio": 1 } }, "sellers": { "results": [ { "fulfilment": null, "id": "284477542", "isForSale": true, "seller": null, "status": "AvailableForSale", "price": { "price": 2.9, "actual": 2.9, "unitOfMeasure": "each", "unitPrice": 0.58 }, "promotions": [] } ] }, "description": [ "Apples." ], "restrictions": [] }, { "title": "Jaffa Easy Peelers 600g", "adId": null, "aisleId": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q09yYW5nZXMsJTIwTGVtb25zJTIwJiUyMENpdHJ1cyUyMEZydWl0", "aisleName": "Oranges, Lemons & Citrus Fruit", "averageWeight": 0, "baseProductId": "78922224", "brandName": "TESCO", "bulkBuyLimit": 99, "bulkBuyLimitGroupId": null, "bulkBuyLimitMessage": null, "catchWeightList": null, "context": null, "departmentId": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA==", "departmentName": "Fresh Fruit", "displayType": "Quantity", "groupBulkBuyLimit": 0, "gtin": "00000003260630", "id": "288135169", "increment": 0, "isInFavourites": null, "isNew": false, "isRestrictedOrderAmendment": null, "maxQuantityAllowed": 99, "maxWeight": 0, "minWeight": 0, "modelMetadata": null, "productType": "SingleProduct", "quantityInBasket": null, "restrictedDelivery": null, "shelfId": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q09yYW5nZXMsJTIwTGVtb25zJTIwJiUyMENpdHJ1cyUyMEZydWl0JTdDQ2xlbWVudGluZXMlMjAmJTIwRWFzeSUyMFBlZWxlc…", "shelfName": "Clementines & Easy Peelers", "shortDescription": "Clementines, Mandarin", "superDepartmentId": "b;RnJlc2glMjBGb29k", "superDepartmentName": "Fresh Food", "timeRestrictedDelivery": null, "tpnb": "78922224", "tpnc": "288135169", "typename": "ProductType", "reviews": { "stats": { "noOfReviews": 401, "overallRating": 2.4, "overallRatingRange": 5 } }, "details": { "components": [ { "isLowEverydayPricing": false } ] }, "images": { "display": [ { "default": {} } ] }, "media": { "defaultImage": { "aspectRatio": 1 } }, "sellers": { "results": [ { "fulfilment": null, "id": "288135169", "isForSale": true, "seller": null, "status": "AvailableForSale", "price": { "price": 2.2, "actual": 2.2, "unitOfMeasure": "kg", "unitPrice": 3.67 }, "promotions": [ { "description": "£1.49 Clubcard Price", "endDate": "2026-11-03T00:00:00Z", "id": "102760175", "promotionType": null, "startDate": "2026-10-05T23:00:00Z", "unitSellingInfo": "£2.48/kg", "price": { "afterDiscount": 2.2, "beforeDiscount": null }, "attributes": [ "CLUBCARD_PRICING" ] } ] } ] }, "description": [ "Clementines, Mandarin" ], "restrictions": [] } ]}
| # | Product | TPNC | Aisle id | Aisle name | Average weight | Base product id | Brand name | Bulk buy limit | Bulk buy limit message | Department id |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Tesco Pink Lady Apples 5 Pack | 284477542 | b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q0FwcGxlcyUyMCYlMjBQZ… | Apples & Pears | 0 | 77091643 | TESCO | 99 | b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA== | |
| 2 | Jaffa Easy Peelers 600g | 288135169 | b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q09yYW5nZXMsJTIwTGVtb… | Oranges, Lemons & Citrus Fruit | 0 | 78922224 | TESCO | 99 | b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA== | |
| 3 | Parrs Toffee Apples Each | 267479525 | b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q0FwcGxlcyUyMCYlMjBQZ… | Apples & Pears | 0 | 66759086 | PARRS | 6 | You have reached the maximum quantity of 6 for this item. | b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA== |
| 4 | Tesco Blueberries 150G | 287356888 | b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q0JlcnJpZXMlMjAmJTIwQ… | Berries & Cherries | 0 | 78538719 | TESCO | 16 | You have reached the maximum quantity of 16 for this item. | b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA== |
| 5 | Tesco Finest Sweet Easy Peelers 600g | 288115395 | b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q09yYW5nZXMsJTIwTGVtb… | Oranges, Lemons & Citrus Fruit | 0 | 78911934 | TESCO finest | 99 | b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA== |
What you send
The input
object of the request, with every field the endpoint accepts.
- Pass the returned catId unchanged as facet; a category name is only a label. Request up to 48 products per page, and keep the facet, page size and sort order fixed as you move through the pages.
- The total count in each response tells you how many pages there are.
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
| facet | string | yes | b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA== (Fresh Fruit). | b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA== |
| count | integer | no | Products per page. Defaults to 24. From 1 to 48. Default: 24. |
5 |
| include_raw | boolean | no | Include the faithful GraphQL response envelope under raw. Defaults to false (normalized items only). Default: false. |
|
| page | integer | no | 1-based shelf page. Defaults to 1. At least 1. Default: 1. |
1 |
| sort_by | string | no | Observed values: relevance (default), price-ascending, price-descending. Allowed values: relevance, price-ascending, price-descending. Default: relevance. |
relevance |
Fields it returns
What each record in the response holds, with the values from the sample above.
| Field | Type | What it is | Example |
|---|---|---|---|
| items[].title | string | Product title as returned by Tesco; keep the pack information when comparing prices. | Tesco Pink Lady Apples 5 Pack |
| items[].tpnc | string | Tesco product number, returned as id in these rows and accepted by the tpnc input. | 284477542 |
| items[].reviews | object | Review details for the product. | 1 fields |
| items[].superDepartmentName | string | The top-level department name, such as Fresh Food. | Fresh Food |
| items[].shelfName | string | The shelf name, such as Pink & Red Apples. | Pink & Red Apples |
| items[].catchWeightList | null | Weight options for products sold by weight. | null |
| items[].bulkBuyLimitMessage | null | Tesco's message about the order limit. | null |
| items[].productType | string | The kind of product, such as a single product. | SingleProduct |
| items[].groupBulkBuyLimit | integer | The order limit shared across a group of products. | 0 |
| items[].bulkBuyLimit | integer | The most of this product one order can hold. | 99 |
| items[].context | null | Extra details Tesco attaches to the listing. | null |
| items[].aisleName | string | The aisle name, such as Apples & Pears. | Apples & Pears |
| items[].aisleId | string | Tesco's ID for the aisle. | b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q0FwcGxlcyUyMCYlMjBQZ… |
| items[].maxWeight | integer | Largest weight for products sold by weight. | 0 |
| items[].superDepartmentId | string | Tesco's ID for the top-level department. | b;RnJlc2glMjBGb29k |
| items[].shelfId | string | Tesco's ID for the shelf. | b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q0FwcGxlcyUyMCYlMjBQZ… |
| items[].media | object | Pictures and videos of the product. | 1 fields |
| items[].media.defaultImage | object | The main product image. | 1 fields |
| items[].bulkBuyLimitGroupId | null | The group of products that share one order limit. | null |
| items[].quantityInBasket | null | Quantity in a shopper's basket; empty when signed out. | null |
| items[].restrictedDelivery | null | Delivery limits on this product, when there are any. | null |
| items[].displayType | string | How the price is shown, such as by quantity or by weight. | Quantity |
| items[].sellers | object | Who sells the product. | 1 fields |
| items[].sellers.results | array | The sellers of the product. | 1 records |
| items[].averageWeight | integer | Average weight for products sold by weight. | 0 |
| items[].shortDescription | string | A short product description. | Apples. |
| items[].images | object | Product images. | 1 fields |
| items[].images.display | array | Images in the sizes Tesco shows. | 1 records |
| items[].details | object | Product details. | 1 fields |
| items[].details.components | array | The parts of the product description. | 1 records |
| items[].restrictions | array | Restrictions on buying, such as age checks. | empty in this sample |
| items[].timeRestrictedDelivery | null | Delivery time limits on this product, when there are any. | null |
| items[].maxQuantityAllowed | integer | The most of this product one order can hold. | 99 |
| items[].increment | integer | The step between quantities you can order. | 0 |
| items[].baseProductId | string | Tesco's base product number, shared by pack sizes of one product. | 77091643 |
| items[].id | string | Tesco's product ID (TPNC) for this listing. | 284477542 |
| items[].description | array | The product description. | Apples. |
| items[].modelMetadata | null | Extra details Tesco attaches to the listing. | null |
| items[].minWeight | integer | Smallest weight for products sold by weight. | 0 |
| items[].tpnb | string | Tesco's base product number. | 77091643 |
| items[].brandName | string | The brand, such as TESCO. | TESCO |
| items[].typename | string | The kind of record, such as ProductType. | ProductType |
| items[].isInFavourites | null | Whether the product is in a shopper's favourites; empty when signed out. | null |
| items[].reviews.stats | object | Rating summary: average and number of reviews. | 3 fields |
| items[].isNew | boolean | Whether Tesco marks the product as new. | false |
| items[].isRestrictedOrderAmendment | null | Whether orders with this product can be changed later. | null |
| items[].adId | null | The ad's ID when the result is sponsored. | null |
| items[].departmentName | string | The department name, such as Fresh Fruit. | Fresh Fruit |
| items[].departmentId | string | Tesco's ID for the department. | b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA== |
| items[].gtin | string | Product barcode as text; preserve its leading zeros. | 00000003249833 |
| items | array | The products or entries returned. | 5 records |
| page | object | Page details: number, size and position. | 8 fields |
| page.count | integer | How many items this response holds. | 5 |
| page.matchType | null | How Tesco matched the search, when it says. | null |
| page.offset | integer | Where this page starts in the full results. | 0 |
| page.pageId | null | Tesco's ID for the page. | null |
| page.pageNo | integer | The page number of these results. | 1 |
| page.pageSize | integer | How many items each page holds. | 5 |
| page.query | object | The search as Tesco read it. | 3 fields |
| page.query.actualTerm | null | The search term Tesco used, when it changed yours. | null |
Call it from your code, or ask your agent
Set UPSCRAPE_API_KEY to your key and copy a working request.
curl --request POST \ --url https://data.upscrape.com/execute \ --header "Authorization: Bearer $UPSCRAPE_API_KEY" \ --header "Content-Type: application/json" \ --header "Prefer: wait=30" \ --data '{ "capability": "tesco.category.products.list", "input": { "count": 5, "facet": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA==", "page": 1, "sort_by": "relevance" }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "tesco.category.products.list", "input": { "count": 5, "facet": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA==", "page": 1, "sort_by": "relevance" }}''')response = requests.post( "https://data.upscrape.com/execute", headers={ "Authorization": f"Bearer {os.environ['UPSCRAPE_API_KEY']}", "Content-Type": "application/json", "Prefer": "wait=30", }, json=payload,)response.raise_for_status()print(json.dumps(response.json(), indent=2))
const response = await fetch("https://data.upscrape.com/execute", { method: "POST", headers: { "Authorization": `Bearer ${process.env.UPSCRAPE_API_KEY}`, "Content-Type": "application/json", "Prefer": "wait=30", }, body: JSON.stringify({ "capability": "tesco.category.products.list", "input": { "count": 5, "facet": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA==", "page": 1, "sort_by": "relevance" }}),});if (!response.ok) { throw new Error(`Upscrape request failed: ${response.status}`);}console.log(JSON.stringify(await response.json(), null, 2));
https://data.upscrape.com/mcp
With Upscrape, get the Tesco category products for facet "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA==" and sort by "relevance". Tell me what it costs before you run it, then show the results as a table.
More from the Tesco API
The same data from other platforms
Tesco Category Products API FAQ
The short answers. The docs have the long ones.
How much does the Tesco Category Products API cost?
1–8 credits per successful call, shown before it runs. You buy credits once, and paid credits never expire.
What do I send?
Send facet. The input fields below list every option with its type and limits.
Do I need a Tesco login?
No. It reads public Tesco data; nothing runs on your account.
Can my AI agent call it?
Yes, over MCP: the agent finds tesco.category.products.list, checks its price and runs it with the same credits as the REST API.
Your first Tesco call is free.
Up to 100 free credits to start, no card needed.