Asda Product Detail API
Send a product ID or CIN to read its catalog record, including published nation prices where supplied.
- 1 credit per call
- Failed calls are free
- Updated
- asda.product.detail.get
{ "product": { "name": "British Milk Semi Skimmed 4 Pints", "price": 1.65, "avg_rating": 4.1694, "brand": "ASDA", "category": "Chilled Food > Milk, Butter, Cream & Eggs > Fresh Milk > Semi Skimmed Milk", "cin": "165468", "currency": "GBP", "gtin": "20337087", "id": "20504", "image_id": "20337087", "image_url": "https://asdagroceries.scene7.com/is/image/asdagroceries/20337087", "in_stock": true, "offer": "List", "pack_size": "4 PINT", "price_per_uom": "72.6p/LT", "price_per_uom_unit": "LT", "price_per_uom_value": 0.72591, "rating_count": 1045, "sales_type": "Each", "status": "A", "url": "https://www.asda.com/groceries/product/165468", "details": { "max_qty": 24, "dietary_flags": { "Halal": false, "HighFibre": false, "Kosher": false, "LowFat": false, "LowSalt": false, "LowSaturatedFat": false, "LowSugar": false, "NoCeleryincludingceleriac": true, "NoEgg": true, "NoFish": true, "NoGluten": true, "NoLactose": false, "NoLupin": true, "NoMilk": false, "NoMustard": true, "NoNuts": true, "NoPeanuts": true, "NoSesame": true, "NoShellfish": true, "NoSoya": true, "Ofaday": false, "SourceofFibre": false, "Vegan": false, "Vegetarian": true }, "prices_by_nation": { "EN": { "price": 1.65, "offer": "List", "price_per_uom": "72.6p/LT" }, "NI": { "price": 1.65, "offer": "List", "price_per_uom": "72.6p/LT" }, "SC": { "price": 1.65, "offer": "List", "price_per_uom": "72.6p/LT" }, "WA": { "price": 1.65, "offer": "List", "price_per_uom": "72.6p/LT" } }, "country": [ "Packed In : United Kingdom" ] }, "taxonomy": { "AISLE_ID": "1215339434886", "AISLE_NAME": "Fresh Milk", "CAT_ID": "1215660378320", "CAT_NAME": "Chilled Food", "DEPT_ID": "1215339432024", "DEPT_NAME": "Milk, Butter, Cream & Eggs", "SHELF_ID": "1215339438036", "SHELF_NAME": "Semi Skimmed Milk" } }}
What you send
The input
object of the request, with every field the endpoint accepts.
- Send an ASDA product ID or a CIN, another ASDA catalog number. When a number matches both, the product ID wins. Keep both returned IDs as text.
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
| id | string | yes | Asda product ID or CIN. Most are numeric; newer product IDs are SKU followed by digits (e.g. SKU100581700), which match by ID only. | 20504 |
| include_raw | boolean | no | Include ASDA's unprocessed Algolia response under raw (large: ~150 KB per 60 products). Set false for normalized fields only. Default: true. |
false |
| store_id | string | no | Asda store id used for stock boosting and in_stock flags Default: 4565. |
4565 |
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. | 23 fields |
| product.avg_rating | number | Average supplied when ratings exist. | 4.17 |
| product.brand | string | Brand supplied by the catalog; absent stays unknown. | ASDA |
| product.category | string | Product’s category hierarchy as returned. | Chilled Food > Milk, Butter, Cream & Eggs > Fresh Milk > Semi S… |
| product.cin | string | Catalog item number, retained separately from the product ID. | 165468 |
| product.currency | string | Currency code for monetary values. | GBP |
| product.details | object | Extra product details from the catalogue record. | 4 fields |
| product.details.country | array | Country of origin or packing, as the label states it. | Packed In : United Kingdom |
| product.details.dietary_flags | object | Dietary labels such as vegan or gluten free, true or false. | 24 fields |
| product.details.max_qty | integer | The most of this product one order can hold. | 24 |
| product.details.prices_by_nation | object | Prices published for England, Scotland, Wales and Northern Ireland. | 4 fields |
| product.gtin | string | Barcode-like value read from the catalog image name where available; keep it as text. | 20337087 |
| product.id | string | ASDA identifier; preserve it as text. | 20504 |
| product.image_id | string | ASDA's image ID for the product picture. | 20337087 |
| product.image_url | string | Link to the product image. | https://asdagroceries.scene7.com/is/image/asdagroceries/20337087 |
| product.in_stock | boolean | Stock flag for the request’s store; absence is unknown. | true |
| product.name | string | Name of the returned product or taxonomy node. | British Milk Semi Skimmed 4 Pints |
| product.offer | string | Ordinary price state: List, Rollback or Dropped; multibuy terms are separate. | List |
| product.pack_size | string | ASDA’s pack-size expression; keep it alongside unit prices. | 4 PINT |
| product.price | number | Ordinary pack amount in the stated currency, before any separate multibuy calculation. | 1.65 |
| product.price_per_uom | string | Original unit-price display, which can use pounds or pence. | 72.6p/LT |
| product.price_per_uom_unit | string | Unit basis for the numeric amount, such as LT or KG. | LT |
| product.price_per_uom_value | number | Unit amount expressed in pounds. | 0.73 |
| product.rating_count | integer | Number of ratings, not individual reviews. | 1045 |
| product.sales_type | string | How the product is sold, such as Each or by weight. | Each |
| product.status | string | A means active; I means delisted. This is separate from stock. | A |
| product.taxonomy | object | Where the product sits in ASDA's catalogue, from category down to shelf. | 8 fields |
| product.taxonomy.AISLE_ID | string | ASDA's ID for the aisle the product sits in. | 1215339434886 |
| product.taxonomy.AISLE_NAME | string | The aisle name, such as Fresh Milk. | Fresh Milk |
| product.taxonomy.CAT_ID | string | ASDA's ID for the top-level category. | 1215660378320 |
| product.taxonomy.CAT_NAME | string | The top-level category name, such as Chilled Food. | Chilled Food |
| product.taxonomy.DEPT_ID | string | ASDA's ID for the department. | 1215339432024 |
| product.taxonomy.DEPT_NAME | string | The department name, such as Milk, Butter, Cream & Eggs. | Milk, Butter, Cream & Eggs |
| product.taxonomy.SHELF_ID | string | ASDA's ID for the shelf. | 1215339438036 |
| product.taxonomy.SHELF_NAME | string | The shelf name, such as Whole Milk. | Semi Skimmed Milk |
| product.url | string | ASDA product page linked by the catalog. | https://www.asda.com/groceries/product/165468 |
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": "asda.product.detail.get", "input": { "id": "20504", "include_raw": false, "store_id": "4565" }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "asda.product.detail.get", "input": { "id": "20504", "include_raw": false, "store_id": "4565" }}''')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": "asda.product.detail.get", "input": { "id": "20504", "include_raw": false, "store_id": "4565" }}),});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
Using Upscrape, look up ASDA product 20504 for store 4565. Show its pack amount, unit basis and the EN, NI, SC and WA price entries where supplied. Keep dietary flags separate from ingredients; no ingredient panel is supplied here.
More from the Asda API
The same data from other platforms
Asda Product Detail API FAQ
The short answers. The docs have the long ones.
How much does the Asda 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 id. The input fields below list every option with its type and limits.
Do I need an Asda login?
No. It reads public Asda data; nothing runs on your account.
Can my AI agent call it?
Yes, over MCP: the agent finds asda.product.detail.get, checks its price and runs it with the same credits as the REST API.
Your first Asda call is free.
Up to 100 free credits to start, no card needed.