# Promotions List

List current Asda rollbacks, price drops, and structured multi-buy offers with normalized product and promotion metadata.

- Platform: [Asda](https://docs.upscrape.com/docs/platforms/asda)
- Capability ID: `asda.promotions.list`
- Cost: 1 credit per request
- Maximum runtime: 30 seconds
- Execute endpoint: `POST https://data.upscrape.com/execute`

## Request

Use the exact public capability ID in the shared execute envelope.

```bash
curl --request POST \
  --url https://data.upscrape.com/execute \
  --header "Authorization: Bearer YOUR_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Prefer: wait=30" \
  --data '{
  "input": {
    "hits_per_page": 10,
    "page": 1,
    "promotion_type": "all",
    "store_id": "4565"
  },
  "capability": "asda.promotions.list"
}'
```

## Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `hits_per_page` | `integer` | No |  |
| `page` | `integer` | No | 1-based results page |
| `promotion_type` | `string` | No | Promotion class to return |
| `store_id` | `string` | No | Asda store id used for stock boosting and in_stock flags |

### Example input

```json
{
  "hits_per_page": 10,
  "page": 1,
  "promotion_type": "all",
  "store_id": "4565"
}
```

## Response

Successful output is returned in `results[0].data`. Raw platform output is intentionally open-ended and may evolve with the upstream source.

### Illustrative sample output

This redacted fixture is an example, not a fixed response schema.

```json
{
  "items": [
    {
      "offer": "Rollback",
      "product": {
        "avg_rating": 5,
        "brand": "La Vieja Fábrica",
        "category": "Food Cupboard > Jams, Spreads & Desserts > Marmalade > Marmalade",
        "cin": "[redacted:cin]",
        "currency": "GBP",
        "gtin": "8410134024957",
        "id": "SKU100559649",
        "image_id": "8410134024957",
        "image_url": "https://asdagroceries.scene7.com/is/image/asdagroceries/8410134024957",
        "in_stock": true,
        "name": "Seville Orange Fine Cut Marmalade 365g",
        "pack_size": "365g",
        "price": 1.7,
        "price_per_uom": "£4.66/KG",
        "rating_count": 1,
        "sales_type": "Each",
        "status": "A",
        "taxonomy": {
          "AISLE_ID": "1215685491667",
          "AISLE_NAME": "Marmalade",
          "CAT_ID": "1215337189632",
          "CAT_NAME": "Food Cupboard",
          "DEPT_ID": "1215685491665",
          "DEPT_NAME": "Jams, Spreads & Desserts",
          "SHELF_ID": "910000976214",
          "SHELF_NAME": "Marmalade"
        },
        "url": "https://www.asda.com/groceries/product/9353594",
        "was_price": 2.5
      }
    },
    {
      "offer": "Rollback",
      "product": {
        "avg_rating": 5,
        "brand": "ASDA",
        "category": "Frozen Food > Frozen Pizza & Garlic Bread > Frozen Thin Crust Pizza > Frozen Thin Crust Pizza",
        "cin": "[redacted:cin]",
        "currency": "GBP",
        "gtin": "5063717043505",
        "id": "SKU100551974",
        "image_id": "5063717043505",
        "image_url": "https://asdagroceries.scene7.com/is/image/asdagroceries/5063717043505",
        "in_stock": true,
        "name": "Loaded Cheese & Onion Pinsa Pizza 410g",
        "pack_size": "410g",
        "price": 0.5,
        "price_per_uom": "£1.22/KG",
        "rating_count": 1,
        "sales_type": "Each",
        "status": "A",
        "taxonomy": {
          "AISLE_ID": "1215685961777",
          "AISLE_NAME": "Frozen Thin Crust Pizza",
          "CAT_ID": "1215338621416",
          "CAT_NAME": "Frozen Food",
          "DEPT_ID": "1215338747245",
          "DEPT_NAME": "Frozen Pizza & Garlic Bread",
          "SHELF_ID": "910000976765",
          "SHELF_NAME": "Frozen Thin Crust Pizza"
        },
        "url": "https://www.asda.com/groceries/product/9339712",
        "was_price": 3.25
      }
    },
    {
      "offer": "Rollback",
      "product": {
        "avg_rating": 5,
        "brand": "Tarczynski",
        "category": "Chilled Food > Cooked Meat > Snacking & Hot Dogs > Pork, Chicken & Beef Snacks",
        "cin": "[redacted:cin]",
        "currency": "GBP",
        "gtin": "5908230536014",
        "id": "1000383289260",
        "image_id": "5908230536014",
        "image_url": "https://asdagroceries.scene7.com/is/image/asdagroceries/5908230536014",
        "in_stock": true,
        "name": "Pork Jerky 40g",
        "pack_size": "40g",
        "price": 1.63,
        "price_per_uom": "£40.75/KG",
        "rating_count": 1,
        "sales_type": "Each",
        "status": "A",
        "taxonomy": {
          "AISLE_ID": "1215341807990",
          "AISLE_NAME": "Snacking & Hot Dogs",
          "CAT_ID": "1215660378320",
          "CAT_NAME": "Chilled Food",
          "DEPT_ID": "1215661243132",
          "DEPT_NAME": "Cooked Meat",
          "SHELF_ID": "1215341841296",
          "SHELF_NAME": "Pork, Chicken & Beef Snacks"
        },
        "url": "https://www.asda.com/groceries/product/9276433",
        "was_price": 2.13
      }
    }
  ],
  "page": {
    "hits_per_page": 10,
    "nb_hits": 12454,
    "nb_pages": 1246,
    "page": 1,
    "source_counts": {
      "multibuy": 6650,
      "price_drop": 2024,
      "rollback": 3780
    }
  },
  "raw": {
    "count_queries": {
      "multibuy": {
        "exhaustive": {
          "nbHits": true,
          "typo": true
        },
        "exhaustiveNbHits": true,
        "exhaustiveTypo": true,
        "extensions": {
          "queryCategorization": {}
        },
        "hits": [],
        "hitsPerPage": 0,
        "nbHits": 6650,
        "nbPages": 0,
        "page": 0,
        "params": "attributesToRetrieve=%5B%22ID%22%5D&filters=PROMOS.EN.TYPE+%3E+0&hitsPerPage=0&optionalFilters=%5B%22STOCK.4565%3A1%3Cscore%3D50000%3E%22%5D&page=0",
        "processingTimeMS": 11,
        "processingTimingsMS": {
          "_request": {
            "roundTrip": 21
          },
          "rulesProcessing": {
            "drr": 5,
            "indexRules": 2,
            "total": 8
          },
          "total": 11
        },
        "query": "",
        "renderingContent": {},
        "serverTimeMS": 11
      },
      "price_drop": {
        "exhaustive": {
          "nbHits": true,
          "typo": true
        },
        "exhaustiveNbHits": true,
        "exhaustiveTypo": true,
        "extensions": {
          "queryCategorization": {}
        },
        "hits": [],
        "hitsPerPage": 0,
        "nbHits": 2024,
        "nbPages": 0,
        "page": 0,
        "params": "attributesToRetrieve=%5B%22ID%22%5D&filters=PRICES.EN.OFFER%3ADropped&hitsPerPage=0&optionalFilters=%5B%22STOCK.4565%3A1%3Cscore%3D50000%3E%22%5D&page=0",
        "processingTimeMS": 9,
        "processingTimingsMS": {
          "_request": {
            "roundTrip": 21
          },
          "extensions": 1,
          "rulesProcessing": {
            "drr": 4,
            "indexRules": 2,
            "total": 7
          },
          "total": 9
        },
        "query": "",
        "renderingContent": {},
        "serverTimeMS": 9
      },
      "rollback": {
        "exhaustive": {
          "nbHits": true,
          "typo": true
        },
        "exhaustiveNbHits": true,
        "exhaustiveTypo": true,
        "extensions": {
          "queryCategorization": {}
        },
        "hits": [],
        "hitsPerPage": 0,
        "nbHits": 3780,
        "nbPages": 0,
        "page": 0,
        "params": "attributesToRetrieve=%5B%22ID%22%5D&filters=PRICES.EN.OFFER%3ARollback&hitsPerPage=0&optionalFilters=%5B%22STOCK.4565%3A1%3Cscore%3D50000%3E%22%5D&page=0",
        "processingTimeMS": 11,
        "processingTimingsMS": {
          "_request": {
            "roundTrip": 21
          },
          "extensions": 1,
          "rulesProcessing": {
            "drr": 6,
            "indexRules": 2,
            "total": 8
          },
          "total": 11
        },
        "query": "",
        "renderingContent": {},
        "serverTimeMS": 11
      }
    },
    "result_queries": {
      "rollback": {
        "exhaustive": {
          "nbHits": true,
          "typo": true
        },
        "exhaustiveNbHits": true,
        "exhaustiveTypo": true,
        "extensions": {
          "queryCategorization": {}
        },
        "hits": [
          {
            "AVG_RATING": 5,
            "BRAND": "La Vieja Fábrica",
            "CIN": "[redacted:cin]",
            "CS_YES": false,
            "END_DATE": 1924948800,
            "ID": "SKU100559649",
            "IMAGE_ID": "8410134024957",
            "IS_BWS": false,
            "IS_FROZEN": false,
            "IS_FTO": false,
            "IS_SPONSORED": false,
            "LABEL": "New",
            "LABEL_END_DATE": 1783036800,
            "LABEL_START_DATE": 1774915200,
            "MAX_QTY": 10,
            "NAME": "Seville Orange Fine Cut Marmalade 365g",
            "PACK_SIZE": "365g",
            "PHARMACY_RESTRICTED": false,
            "PRICES": {
              "EN": {
                "OFFER": "Rollback",
                "PRICE": 1.7,
                "PRICEPERUOM": 4.65753,
                "PRICEPERUOMFORMATTED": "£4.66/KG",
                "WASPRICE": 2.5
              }
            },
            "PRIMARY_TAXONOMY": {
              "AISLE_ID": "1215685491667",
              "AISLE_NAME": "Marmalade",
              "CAT_ID": "1215337189632",
              "CAT_NAME": "Food Cupboard",
              "DEPT_ID": "1215685491665",
              "DEPT_NAME": "Jams, Spreads & Desserts",
              "SHELF_ID": "910000976214",
              "SHELF_NAME": "Marmalade"
            },
            "PRODUCT_TYPE": "STANDARD",
            "RATING_COUNT": 1,
            "SALES_TYPE": "Each",
            "SHOW_PRICE_CS": false,
            "START_DATE": 1775476800,
            "STATUS": "A",
            "STOCK": {
              "4565": 999
            },
            "_highlightResult": {
              "BRAND": {
                "matchLevel": "none",
                "matchedWords": [],
                "value": "La Vieja Fábrica"
              },
              "CIN": "[redacted:cin]",
              "ID": {
                "matchLevel": "none",
                "matchedWords": [],
                "value": "SKU100559649"
              },
              "NAME": {
                "matchLevel": "none",
                "matchedWords": [],
                "value": "Seville Orange Fine Cut Marmalade 365g"
              },
              "PRIMARY_TAXONOMY": {
                "AISLE_NAME": {
                  "matchLevel": "none",
                  "matchedWords": [],
                  "value": "Marmalade"
                },
                "SHELF_NAME": {
                  "matchLevel": "none",
                  "matchedWords": [],
                  "value": "Marmalade"
                }
              }
            },
            "objectID": "9353594"
          },
          {
            "AVG_RATING": 5,
            "BRAND": "ASDA",
            "CIN": "[redacted:cin]",
            "CS_YES": false,
            "END_DATE": 2556100800,
            "ICONS": [
              {
                "CLICKABLE": true,
                "ICON_NAME": "Frozen",
                "ID": "1215429142097",
                "IMAGE_URL": "https://ui.assets-asda.com/dm/_046_frozen?",
                "PRIORITY": -2995
              }
            ],
            "ID": "SKU100551974",
            "IMAGE_ID": "5063717043505",
            "IS_BWS": false,
            "IS_FROZEN": true,
            "IS_FTO": false,
            "IS_SPONSORED": false,
            "LABEL": "New",
            "LABEL_END_DATE": 1785196800,
            "LABEL_START_DATE": 1777420800,
            "MAX_QTY": 10,
            "NAME": "Loaded Cheese & Onion Pinsa Pizza 410g",
            "PACK_SIZE": "410g",
            "PHARMACY_RESTRICTED": false,
            "PRICES": {
              "EN": {
                "OFFER": "Rollback",
                "PRICE": 0.5,
                "PRICEPERUOM": 1.21951,
                "PRICEPERUOMFORMATTED": "£1.22/KG",
                "WASPRICE": 3.25
              }
            },
            "PRIMARY_TAXONOMY": {
              "AISLE_ID": "1215685961777",
              "AISLE_NAME": "Frozen Thin Crust Pizza",
              "CAT_ID": "1215338621416",
              "CAT_NAME": "Frozen Food",
              "DEPT_ID": "1215338747245",
              "DEPT_NAME": "Frozen Pizza & Garlic Bread",
              "SHELF_ID": "910000976765",
              "SHELF_NAME": "Frozen Thin Crust Pizza"
            },
            "PRODUCT_TYPE": "STANDARD",
            "RATING_COUNT": 1,
            "SALES_TYPE": "Each",
            "SHOW_PRICE_CS": false,
            "START_DATE": 1778414400,
            "STATUS": "A",
            "STOCK": {
              "4565": 999
            },
            "_highlightResult": {
              "BRAND": {
                "matchLevel": "none",
                "matchedWords": [],
                "value": "ASDA"
              },
              "CIN": "[redacted:cin]",
              "ID": {
                "matchLevel": "none",
                "matchedWords": [],
                "value": "SKU100551974"
              },
              "LIFESTYLES": [
                {
                  "matchLevel": "none",
                  "matchedWords": [],
                  "value": "Suitable for Vegetarians"
                }
              ],
              "NAME": {
                "matchLevel": "none",
                "matchedWords": [],
                "value": "Loaded Cheese & Onion Pinsa Pizza 410g"
              },
              "PRIMARY_TAXONOMY": {
                "AISLE_NAME": {
                  "matchLevel": "none",
                  "matchedWords": [],
                  "value": "Frozen Thin Crust Pizza"
                },
                "SHELF_NAME": {
                  "matchLevel": "none",
                  "matchedWords": [],
                  "value": "Frozen Thin Crust Pizza"
                }
              }
            },
            "objectID": "9339712"
          },
          {
            "AVG_RATING": 5,
            "BRAND": "Tarczynski",
            "CIN": "[redacted:cin]",
            "CS_YES": false,
            "END_DATE": 1924948800,
            "ID": "1000383289260",
            "IMAGE_ID": "5908230536014",
            "IS_BWS": false,
            "IS_FROZEN": false,
            "IS_FTO": false,
            "IS_SPONSORED": false,
            "LABEL": "New",
            "LABEL_END_DATE": 1760227200,
            "LABEL_START_DATE": 1752451200,
            "MAX_QTY": 10,
            "NAME": "Pork Jerky 40g",
            "PACK_SIZE": "40g",
            "PHARMACY_RESTRICTED": false,
            "PRICES": {
              "EN": {
                "OFFER": "Rollback",
                "PRICE": 1.63,
                "PRICEPERUOM": 40.75,
                "PRICEPERUOMFORMATTED": "£40.75/KG",
                "WASPRICE": 2.13
              }
            },
            "PRIMARY_TAXONOMY": {
              "AISLE_ID": "1215341807990",
              "AISLE_NAME": "Snacking & Hot Dogs",
              "CAT_ID": "1215660378320",
              "CAT_NAME": "Chilled Food",
              "DEPT_ID": "1215661243132",
              "DEPT_NAME": "Cooked Meat",
              "SHELF_ID": "1215341841296",
              "SHELF_NAME": "Pork, Chicken & Beef Snacks"
            },
            "PRODUCT_TYPE": "STANDARD",
            "RATING_COUNT": 1,
            "SALES_TYPE": "Each",
            "SHOW_PRICE_CS": true,
            "START_DATE": 1753099200,
            "STATUS": "A",
            "STOCK": {
              "4565": 999
            },
            "_highlightResult": {
              "BRAND": {
                "matchLevel": "none",
                "matchedWords": [],
                "value": "Tarczynski"
              },
              "CIN": "[redacted:cin]",
              "ID": {
                "matchLevel": "none",
                "matchedWords": [],
                "value": "1000383289260"
              },
              "KEYWORDS": {
                "matchLevel": "none",
                "matchedWords": [],
                "value": "polish food,eastern european"
              },
              "NAME": {
                "matchLevel": "none",
                "matchedWords": [],
                "value": "Pork Jerky 40g"
              },
              "PRIMARY_TAXONOMY": {
                "AISLE_NAME": {
                  "matchLevel": "none",
                  "matchedWords": [],
                  "value": "Snacking & Hot Dogs"
                },
                "SHELF_NAME": {
                  "matchLevel": "none",
                  "matchedWords": [],
                  "value": "Pork, Chicken & Beef Snacks"
                }
              }
            },
            "objectID": "9276433"
          }
        ],
        "length": 10,
        "nbHits": 3780,
        "offset": 0,
        "params": "attributesToRetrieve=%5B%22STATUS%22%2C%22BRAND%22%2C%22CIN%22%2C%22NAME%22%2C%22AVG_RATING%22%2C%22RATING_COUNT%22%2C%22ICONS%22%2C%22PRICES.EN%22%2C%22SALES_TYPE%22%2C%22MAX_QTY%22%2C%22STOCK.4565%22%2C%22IS_FROZEN%22%2C%22IS_BWS%22%2C%22PROMOS.EN%22%2C%22LABEL%22%2C%22LABEL_START_DATE%22%2C%22LABEL_END_DATE%22%2C%22IS_SPONSORED%22%2C%22PRODUCT_TYPE%22%2C%22CIN_ID%22%2C%22PRIMARY_TAXONOMY%22%2C%…",
        "processingTimeMS": 11,
        "processingTimingsMS": {
          "_request": {
            "roundTrip": 21
          },
          "extensions": 1,
          "initQuery": 1,
          "rulesProcessing": {
            "drr": 5,
            "indexRules": 2,
            "total": 8
          },
          "total": 11
        },
        "query": "",
        "renderingContent": {},
        "serverTimeMS": 12
      }
    }
  }
}
```
### Illustrative output fields

Derived from the sample above for orientation only. These fields are not a fixed response schema.

| Path | Observed type | Example |
| --- | --- | --- |
| `items` | `array` | 3 items |
| `items` | `array` | 3 items |
| `page` | `object` | 5 fields |
| `page.hits_per_page` | `integer` | 10 |
| `page.nb_hits` | `integer` | 12454 |
| `page.nb_pages` | `integer` | 1246 |
| `page.page` | `integer` | 1 |
| `page.source_counts` | `object` | 3 fields |
| `raw` | `object` | 2 fields |
| `raw.count_queries` | `object` | 3 fields |
| `raw.result_queries` | `object` | 1 fields |

## Execution behavior

A `200` response completed inline. A `202` response was queued; poll `GET /jobs/{id}` until the job reaches `completed` or `failed`. Use an `Idempotency-Key` when retrying must not create a duplicate logical job.

## Related documentation

- [Authentication](https://docs.upscrape.com/docs/api/authentication)
- [Jobs and results](https://docs.upscrape.com/docs/api/jobs)
- [Errors and retries](https://docs.upscrape.com/docs/api/errors)
- [Idempotency](https://docs.upscrape.com/docs/api/idempotency)
