Tesco Product Detail API
Send a Tesco product link or TPNC to read its price, description and product information where supplied.
- 1 credit per call
- Failed calls are free
- Updated
- tesco.product.detail.get
{ "product": { "title": "Tesco Pink Lady Apples 5 Pack", "aisleId": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q0FwcGxlcyUyMCYlMjBQZWFycw==", "aisleName": "Apples & Pears", "averageWeight": null, "baseProductId": "77091643", "brandName": "TESCO", "bulkBuyLimit": 99, "bulkBuyLimitGroupId": null, "bulkBuyLimitMessage": null, "catchWeightList": null, "departmentId": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA==", "departmentName": "Fresh Fruit", "depositAmount": null, "displayType": "Quantity", "groupBulkBuyLimit": 0, "gtin": "00000003249833", "id": "284477542", "isForSale": true, "isInFavourites": null, "isNew": false, "isRestrictedOrderAmendment": null, "maxWeight": null, "minWeight": null, "multiPackDetails": null, "productType": "SingleProduct", "seller": null, "shelfId": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q0FwcGxlcyUyMCYlMjBQZWFycyU3Q1BpbmslMjAmJTIwUmVkJTIwQXBwbGVz", "shelfLife": null, "shelfName": "Pink & Red Apples", "status": "AvailableForSale", "superDepartmentId": "b;RnJlc2glMjBGb29k", "superDepartmentName": "Fresh Food", "tpnb": "77091643", "tpnc": "284477542", "price": { "actual": 2.9, "unitOfMeasure": "each", "unitPrice": 0.58 }, "reviews": { "info": { "count": 10, "offset": 0, "page": 1, "total": 193 }, "stats": { "noOfReviews": 193, "overallRating": 2.9, "ratingsDistribution": [ { "name": "1.0", "value": "62" }, { "name": "2.0", "value": "36" } ] } }, "details": { "additives": null, "alcoholInfo": null, "allergenInfo": null, "boxContents": null, "brandMarketing": null, "clothingInfo": null, "directions": null, "dosage": null, "drainedWeight": null, "features": null, "freezingInstructions": null, "hazardInfo": null, "healthClaims": null, "healthmark": null, "lowerAgeLimit": null, "manufacturerMarketing": null, "nappyInfo": null, "netContents": "Minimum 5", "numberOfUses": "Variable Servings", "nutritionalClaims": null, "otherInformation": null, "otherNutritionInformation": null, "preparationGuidelines": null, "recyclingInfo": null, "safetyWarning": null, "storage": null, "upperAgeLimit": null, "warnings": null, "cookingInstructions": { "microwave": { "chilled": { "detail": null, "instructions": [] }, "frozen": { "detail": null, "instructions": [] } }, "oven": { "chilled": { "temperature": null, "time": null, "instructions": [] }, "frozen": { "temperature": null, "time": null, "instructions": [] } }, "cookingGuidelines": [], "cookingMethods": [], "cookingPrecautions": [], "otherInstructions": [] }, "energyEfficiency": { "class": null, "energyClassUrl": null, "productInfoDoc": null }, "guidelineDailyAmount": { "title": "One typical apple", "dailyAmounts": [ { "name": "Energy", "rating": "-", "percent": "4", "value": "313kJ 74kcal" }, { "name": "Fat", "rating": "LOW", "percent": "1", "value": "0.7g" } ] }, "components": [ { "isLowEverydayPricing": false, "isLowPricePromise": false } ], "ingredients": [ "Apple" ], "legalLabelling": [], "nutritionInfo": [ { "name": "Typical Values", "perComp": "100g contains", "perServing": "A serving contains", "referenceIntake": "%RI*", "referencePercentage": "RI*" }, { "name": "Energy", "perComp": "236kJ / 56kcal", "perServing": "313kJ / 74kcal", "referenceIntake": "4%", "referencePercentage": "8400kJ / 2000kcal" } ], "originInformation": [ { "title": "Produce of", "value": "Produce of Argentina, Australia, Chile, Spain, France, United Kingdom, Italy, New Zealand, USA, South Africa" } ], "packSize": [ { "units": "SNGL", "value": null } ], "preparationAndUsage": [ "<p>Wash before use.</p>" ], "productMarketing": [ "Sweet & Sparkling Hand picked and grown longer for their pink blush and distinctive fizz At Tesco we believe in the importance of expertly …" ], "specifications": [] }, "images": { "display": [ { "default": {}, "zoom": {} } ] }, "media": { "defaultImage": { "aspectRatio": 1 }, "videos": [] }, "sellers": { "totalCount": 1, "results": [ { "id": "284477542", "isForSale": true, "returnDetails": null, "seller": null, "status": "AvailableForSale", "unavailabilityReasons": null, "price": { "actual": 2.9, "unitOfMeasure": "each", "unitPrice": 0.58 }, "promotions": [] } ] }, "charges": [], "description": [ "Apples." ], "foodIcons": [], "icons": [], "promotions": [], "restrictions": [] }, "raw": { "status": 200, "data": { "product": { "title": "Tesco Pink Lady Apples 5 Pack", "aisleId": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q0FwcGxlcyUyMCYlMjBQZWFycw==", "aisleName": "Apples & Pears", "averageWeight": null, "baseProductId": "77091643", "brandName": "TESCO", "bulkBuyLimit": 99, "bulkBuyLimitGroupId": null, "bulkBuyLimitMessage": null, "catchWeightList": null, "departmentId": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA==", "departmentName": "Fresh Fruit", "depositAmount": null, "displayType": "Quantity", "groupBulkBuyLimit": 0, "gtin": "00000003249833", "id": "284477542", "isForSale": true, "isInFavourites": null, "isNew": false, "isRestrictedOrderAmendment": null, "maxWeight": null, "minWeight": null, "multiPackDetails": null, "productType": "SingleProduct", "seller": null, "shelfId": "b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q0FwcGxlcyUyMCYlMjBQZWFycyU3Q1BpbmslMjAmJTIwUmVkJTIwQXBwbGVz", "shelfLife": null, "shelfName": "Pink & Red Apples", "status": "AvailableForSale", "superDepartmentId": "b;RnJlc2glMjBGb29k", "superDepartmentName": "Fresh Food", "tpnb": "77091643", "tpnc": "284477542", "price": { "actual": 2.9, "unitOfMeasure": "each", "unitPrice": 0.58 }, "reviews": { "info": { "count": 10, "offset": 0, "page": 1, "total": 193 }, "stats": { "noOfReviews": 193, "overallRating": 2.9, "ratingsDistribution": [ { "name": "1.0", "value": "62" }, { "name": "2.0", "value": "36" } ] } }, "details": { "additives": null, "alcoholInfo": null, "allergenInfo": null, "boxContents": null, "brandMarketing": null, "clothingInfo": null, "directions": null, "dosage": null, "drainedWeight": null, "features": null, "freezingInstructions": null, "hazardInfo": null, "healthClaims": null, "healthmark": null, "lowerAgeLimit": null, "manufacturerMarketing": null, "nappyInfo": null, "netContents": "Minimum 5", "numberOfUses": "Variable Servings", "nutritionalClaims": null, "otherInformation": null, "otherNutritionInformation": null, "preparationGuidelines": null, "recyclingInfo": null, "safetyWarning": null, "storage": null, "upperAgeLimit": null, "warnings": null, "cookingInstructions": { "microwave": { "chilled": { "detail": null, "instructions": [] }, "frozen": { "detail": null, "instructions": [] } }, "oven": { "chilled": { "temperature": null, "time": null, "instructions": [] }, "frozen": { "temperature": null, "time": null, "instructions": [] } }, "cookingGuidelines": [], "cookingMethods": [], "cookingPrecautions": [], "otherInstructions": [] }, "energyEfficiency": { "class": null, "energyClassUrl": null, "productInfoDoc": null }, "guidelineDailyAmount": { "title": "One typical apple", "dailyAmounts": [ { "name": "Energy", "rating": "-", "percent": "4", "value": "313kJ 74kcal" }, { "name": "Fat", "rating": "LOW", "percent": "1", "value": "0.7g" } ] }, "components": [ { "isLowEverydayPricing": false, "isLowPricePromise": false } ], "ingredients": [ "Apple" ], "legalLabelling": [], "nutritionInfo": [ { "name": "Typical Values", "perComp": "100g contains", "perServing": "A serving contains", "referenceIntake": "%RI*", "referencePercentage": "RI*" }, { "name": "Energy", "perComp": "236kJ / 56kcal", "perServing": "313kJ / 74kcal", "referenceIntake": "4%", "referencePercentage": "8400kJ / 2000kcal" } ], "originInformation": [ { "title": "Produce of", "value": "Produce of Argentina, Australia, Chile, Spain, France, United Kingdom, Italy, New Zealand, USA, South Africa" } ], "packSize": [ { "units": "SNGL", "value": null } ], "preparationAndUsage": [ "<p>Wash before use.</p>" ], "productMarketing": [ "Sweet & Sparkling Hand picked and grown longer for their pink blush and distinctive fizz At Tesco we believe in the importance of expertly …" ], "specifications": [] }, "images": { "display": [ { "default": {}, "zoom": {} } ] }, "media": { "defaultImage": { "aspectRatio": 1 }, "videos": [] }, "sellers": { "totalCount": 1, "results": [ { "id": "284477542", "isForSale": true, "returnDetails": null, "seller": null, "status": "AvailableForSale", "unavailabilityReasons": null, "price": { "actual": 2.9, "unitOfMeasure": "each", "unitPrice": 0.58 }, "promotions": [] } ] }, "charges": [], "description": [ "Apples." ], "foodIcons": [], "icons": [], "promotions": [], "restrictions": [] } } }}
| # | Name | Per comp | Per serving | Reference intake | Reference percentage |
|---|---|---|---|---|---|
| 1 | Typical Values | 100g contains | A serving contains | %RI* | RI* |
| 2 | Energy | 236kJ / 56kcal | 313kJ / 74kcal | 4% | 8400kJ / 2000kcal |
| 3 | Fat | 0.5g | 0.7g | 1% | 70g |
| 4 | Saturates | 0.2g | 0.2g | 1% | 20g |
| 5 | Carbohydrate | 11.6g | 15.4g | 6% | 260g |
| 6 | Sugars | 11.6g | 15.4g | 17% | 90g |
| 7 | Fibre | 1.2g | 1.6g | ||
| 8 | Protein | 0.6g | 0.8g | 2% | 50g |
| 9 | Salt | <0.01g | <0.01g | <1% | 6g |
| 10 | * Reference intake of an average adult (8400 kJ / 2000 kcal) | - | - | - | - |
What you send
The input
object of the request, with every field the endpoint accepts.
- Send the Tesco product link or the numeric TPNC from it. Keep the TPNC with your saved results so later checks refer to the same product.
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
| tpnc | string | yes | Numeric Tesco product id (tpnc), or a full tesco.com product URL such as https://www.tesco.com/groceries/en-GB/products/284477542. | https://www.tesco.com/groceries/en-GB/products/… |
| include_raw | boolean | no | Include the faithful GraphQL response envelope under raw. Defaults to false (normalized product only). Default: false. |
Fields it returns
What each record in the response holds, with the values from the sample above.
| Field | Type | What it is | Example |
|---|---|---|---|
| product | object | The product record. | 46 fields |
| product.aisleId | string | Tesco's ID for the aisle. | b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdCU3Q0FwcGxlcyUyMCYlMjBQZ… |
| product.aisleName | string | The aisle name, such as Apples & Pears. | Apples & Pears |
| product.averageWeight | null | Average weight for products sold by weight. | null |
| product.baseProductId | string | Tesco's base product number, shared by pack sizes of one product. | 77091643 |
| product.brandName | string | The brand, such as TESCO. | TESCO |
| product.bulkBuyLimit | integer | The most of this product one order can hold. | 99 |
| product.bulkBuyLimitGroupId | null | The group of products that share one order limit. | null |
| product.bulkBuyLimitMessage | null | Tesco's message about the order limit. | null |
| product.catchWeightList | null | Weight options for products sold by weight. | null |
| product.charges | array | Deposit return charges on the product, when there are any. | empty in this sample |
| product.departmentId | string | Tesco's ID for the department. | b;RnJlc2glMjBGb29kJTdDRnJlc2glMjBGcnVpdA== |
| product.departmentName | string | The department name, such as Fresh Fruit. | Fresh Fruit |
| product.depositAmount | null | The deposit on the product, when it carries one. | null |
| product.description | array | The product description, in parts. | Apples. |
| product.details | object | Product details. | 40 fields |
| product.details.additives | null | Additives listed on the label. | null |
| product.details.alcoholInfo | null | Alcohol details, for drinks with alcohol. | null |
| product.details.allergenInfo | null | Allergen information from the label. | null |
| product.details.boxContents | null | What comes in the box, when stated. | null |
| product.details.brandMarketing | null | Marketing text from the brand. | null |
| product.details.clothingInfo | null | Clothing details, for clothing products. | null |
| product.details.components | array | The parts of the product description. | 1 records |
| product.details.cookingInstructions | object | Cooking instructions from the label. | 6 fields |
| product.details.directions | null | Directions for use from the label. | null |
| product.details.dosage | null | Dosage information, for health products. | null |
| product.details.drainedWeight | null | Drained weight, for tinned and jarred products. | null |
| product.details.energyEfficiency | object | Energy efficiency rating, for electrical products. | 3 fields |
| product.details.features | null | The product's features, when listed. | null |
| product.details.freezingInstructions | null | Freezing instructions from the label. | null |
| product.details.guidelineDailyAmount | object | Nutrition per serving with traffic-light ratings. | 2 fields |
| product.details.hazardInfo | null | Hazard information from the label. | null |
| product.details.healthClaims | null | Health claims on the label. | null |
| product.details.healthmark | null | The health mark on the label. | null |
| product.details.ingredients | array | The ingredients list. | Apple |
| product.details.legalLabelling | array | Legal notes from the label. | empty in this sample |
| product.details.lowerAgeLimit | null | The lowest age the product is for, when stated. | null |
| product.details.manufacturerMarketing | null | Marketing text from the manufacturer. | null |
| product.details.nappyInfo | null | Nappy details, for baby products. | null |
| product.details.netContents | string | The net contents, as the label states them. | Minimum 5 |
| product.details.numberOfUses | string | How many servings or uses the pack gives. | Variable Servings |
| product.details.nutritionInfo | array | The nutrition table from the label. | 11 records |
| product.details.nutritionalClaims | null | Nutrition claims on the label. | null |
| product.details.originInformation | array | Where the product comes from. | 1 records |
| product.details.otherInformation | null | Other information from the label. | null |
| product.details.otherNutritionInformation | null | Other nutrition notes from the label. | null |
| product.details.packSize | array | The pack size and its units. | 1 records |
| product.details.preparationAndUsage | array | Preparation and usage notes. | <p>Wash before use.</p> |
| product.details.preparationGuidelines | null | Preparation guidelines from the label. | null |
| product.details.productMarketing | array | Marketing text about the product. | Sweet & Sparkling Hand picked and grown longer for their pink b… |
| product.details.recyclingInfo | null | Recycling information. | null |
| product.details.safetyWarning | null | Safety warnings from the label. | null |
| product.details.specifications | array | Technical specifications, when listed. | empty in this sample |
| product.details.storage | null | Storage instructions. | null |
| product.details.upperAgeLimit | null | The highest age the product is for, when stated. | null |
| product.details.warnings | null | Warnings from the label. | null |
| product.displayType | string | How the price is shown, such as by quantity or by weight. | Quantity |
| product.foodIcons | array | Diet icons on the product, when there are any. | empty in this sample |
| product.groupBulkBuyLimit | integer | The order limit shared across a group of products. | 0 |
| product.gtin | string | Product barcode as text; preserve its leading zeros. | 00000003249833 |
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.product.detail.get", "input": { "tpnc": "https://www.tesco.com/groceries/en-GB/products/284477542" }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "tesco.product.detail.get", "input": { "tpnc": "https://www.tesco.com/groceries/en-GB/products/284477542" }}''')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.product.detail.get", "input": { "tpnc": "https://www.tesco.com/groceries/en-GB/products/284477542" }}),});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
Use Upscrape to read Tesco product 284477542. Show the pack price and unit price with its unit. Keep the product ID in the answer.
More from the Tesco API
The same data from other platforms
Tesco Product Detail API FAQ
The short answers. The docs have the long ones.
How much does the Tesco Product Detail API cost?
1 credit per successful call, shown before it runs. You buy credits once, and paid credits never expire.
What do I send?
Send tpnc. 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.product.detail.get, 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.