Asda Promotions API
Choose Rollbacks, price drops or multibuys. Inspect the returned offer terms beside each product’s single-pack price.
- 1–10 credits per call
- Failed calls are free
- Updated
- asda.promotions.list
{ "page": { "algolia_page": 0, "hits_per_page": 5, "nb_hits": 5769, "nb_pages": 1154, "page": 1 }, "items": [ { "offer": "List", "product": { "name": "12 British Beef Meatballs 340g", "price": 4.97, "avg_rating": 5, "brand": "Exceptional by ASDA", "category": "Meat, Poultry & Fish > Meat & Poultry > Beef > Beef Mince & Meatballs", "cin": "9301558", "currency": "GBP", "gtin": "5063717061479", "id": "SKU100537679", "image_id": "5063717061479", "image_url": "https://asdagroceries.scene7.com/is/image/asdagroceries/5063717061479", "in_stock": true, "offer": "List", "pack_size": "340g", "price_per_uom": "£14.62/KG", "price_per_uom_unit": "KG", "price_per_uom_value": 14.61765, "rating_count": 1, "sales_type": "Each", "status": "A", "url": "https://www.asda.com/groceries/product/9301558", "taxonomy": { "AISLE_ID": "910000975528", "AISLE_NAME": "Beef", "CAT_ID": "1215135760597", "CAT_NAME": "Meat, Poultry & Fish", "DEPT_ID": "910000975206", "DEPT_NAME": "Meat & Poultry", "SHELF_ID": "910000977267", "SHELF_NAME": "Beef Mince & Meatballs" } }, "promotions": [ { "name": "Any 3 for £12", "end_at": "2028-10-12T23:59:59Z", "end_unix": 1855007999, "id": "10000740328", "start_at": "2025-12-25T00:00:00Z", "start_unix": 1766620800, "type": 15, "deal": { "price": 12, "kind": "fixed_price", "quantity": 3 } } ] }, { "offer": "List", "product": { "name": "Mushroom Pilau 300g", "price": 3.5, "avg_rating": 5, "brand": "Bom Bahia by ASDA", "category": "Chilled Food > Ready Meals > Bom Bahia by ASDA > Bom Bahia by ASDA", "cin": "9290615", "currency": "GBP", "gtin": "5063717000584", "id": "SKU100534500", "image_id": "5063717000584_T1", "image_url": "https://asdagroceries.scene7.com/is/image/asdagroceries/5063717000584_T1", "in_stock": true, "offer": "List", "pack_size": "300G", "price_per_uom": "£11.67/KG", "price_per_uom_unit": "KG", "price_per_uom_value": 11.66667, "rating_count": 1, "sales_type": "Each", "status": "A", "url": "https://www.asda.com/groceries/product/9290615", "taxonomy": { "AISLE_ID": "1215686355601", "AISLE_NAME": "Bom Bahia by ASDA", "CAT_ID": "1215660378320", "CAT_NAME": "Chilled Food", "DEPT_ID": "910000975205", "DEPT_NAME": "Ready Meals", "SHELF_ID": "1215686355602", "SHELF_NAME": "Bom Bahia by ASDA" } }, "promotions": [ { "name": "Bom Bahia Dine In £12", "end_at": "2099-12-31T23:59:59Z", "end_unix": 4102444799, "id": "10000991462", "open_ended": true, "start_at": "2026-05-18T00:00:00Z", "start_unix": 1779062400, "type": 12 } ] } ]}
| # | Price label |
|---|---|
| 1 | List |
| 2 | List |
| 3 | List |
| 4 | List |
| 5 | List |
What you send
The input
object of the request, with every field the endpoint accepts.
- Lists include delisted products unless you turn on the active-only option.
- Up to 60 products come back a page, 24 by default, and pages start at 1. Keep the page size the same as you move through the pages.
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
| active_only | boolean | no | Return only products ASDA lists as active (STATUS "A"). Default false keeps delisted products (STATUS "I") so listings are complete. Default: false. |
true |
| hits_per_page | integer | no | Number of results per page. From 1 to 60. Default: 24. |
5 |
| 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 |
| page | integer | no | 1-based results page At least 1. Default: 1. |
|
| promotion_type | string | no | Promotion class to return Allowed values: all, rollback, price_drop, multibuy. Default: all. |
multibuy |
| 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 |
|---|---|---|---|
| items[].offer | string | Ordinary price state: List, Rollback or Dropped; multibuy terms are separate. | List |
| items[].product.name | string | Name of the returned product or taxonomy node. | 12 British Beef Meatballs 340g |
| items[].promotions[].name | string | Any 3 for £12 | |
| items[].product.price | number | Ordinary pack amount in the stated currency, before any separate multibuy calculation. | 4.97 |
| items[].product | object | The product record. | 22 fields |
| items[].product.avg_rating | integer | Average supplied when ratings exist. | 5 |
| items[].product.brand | string | Brand supplied by the catalog; absent stays unknown. | Exceptional by ASDA |
| items[].product.category | string | Product’s category hierarchy as returned. | Meat, Poultry & Fish > Meat & Poultry > Beef > Beef Mince & Mea… |
| items[].product.cin | string | Catalog item number, retained separately from the product ID. | 9301558 |
| items[].product.currency | string | Currency code for monetary values. | GBP |
| items[].product.gtin | string | Barcode-like value read from the catalog image name where available; keep it as text. | 5063717061479 |
| items[].product.id | string | ASDA identifier; preserve it as text. | SKU100537679 |
| items[].product.image_id | string | ASDA's image ID for the product picture. | 5063717061479 |
| items[].product.image_url | string | Link to the product image. | https://asdagroceries.scene7.com/is/image/asdagroceries/5063717… |
| items[].product.in_stock | boolean | Stock flag for the request’s store; absence is unknown. | true |
| items[].product.offer | string | Ordinary price state: List, Rollback or Dropped; multibuy terms are separate. | List |
| items[].product.pack_size | string | ASDA’s pack-size expression; keep it alongside unit prices. | 340g |
| items[].product.price_per_uom | string | Original unit-price display, which can use pounds or pence. | £14.62/KG |
| items[].product.price_per_uom_unit | string | Unit basis for the numeric amount, such as LT or KG. | KG |
| items[].product.price_per_uom_value | number | Unit amount expressed in pounds. | 14.62 |
| items[].product.rating_count | integer | Number of ratings, not individual reviews. | 1 |
| items[].product.sales_type | string | How the product is sold, such as Each or by weight. | Each |
| items[].product.status | string | A means active; I means delisted. This is separate from stock. | A |
| items[].product.taxonomy | object | Where the product sits in ASDA's catalogue, from category down to shelf. | 8 fields |
| items[].product.url | string | ASDA product page linked by the catalog. | https://www.asda.com/groceries/product/9301558 |
| items[].promotions | array | Offers on the product, such as Rollback or a multibuy. | 1 records |
| items[].promotions[].deal | object | 3 fields | |
| items[].promotions[].end_at | string | 2028-10-12T23:59:59Z | |
| items[].promotions[].end_unix | integer | 1,855,007,999 | |
| items[].promotions[].id | string | 10000740328 | |
| items[].promotions[].start_at | string | 2025-12-25T00:00:00Z | |
| items[].promotions[].start_unix | integer | 1,766,620,800 | |
| items[].promotions[].type | integer | ASDA's number for the kind of offer. | 15 |
| items | array | The products returned. | 5 records |
| page | object | Page details for the results: size, totals and position. | 5 fields |
| page.algolia_page | integer | The results page number in ASDA's own search, counted from 0. | 0 |
| page.hits_per_page | integer | How many products each page holds. | 5 |
| page.nb_hits | integer | How many products match in total. | 5769 |
| page.nb_pages | integer | How many pages of results there are in total. | 1154 |
| page.page | integer | Page details for the results: size, totals and position. | 1 |
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.promotions.list", "input": { "active_only": true, "hits_per_page": 5, "include_raw": false, "promotion_type": "multibuy", "store_id": "4565" }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "asda.promotions.list", "input": { "active_only": true, "hits_per_page": 5, "include_raw": false, "promotion_type": "multibuy", "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.promotions.list", "input": { "active_only": true, "hits_per_page": 5, "include_raw": false, "promotion_type": "multibuy", "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, request five active ASDA multibuy products for store 4565. Show each pack price beside its required quantity and bundle terms. Keep the original offer text and dates; do not treat the bundle total as a single-pack price.
More from the Asda API
The same data from other platforms
Asda Promotions API FAQ
The short answers. The docs have the long ones.
How much does the Asda Promotions API cost?
1–10 credits per successful call, shown before it runs. You buy credits once, and paid credits never expire.
What do I send?
Every input is optional; the input fields below list what each one does.
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.promotions.list, 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.