# Asda Groceries Scraper (`automation-lab/asda-grocery-products-prices`) Actor

Search ASDA UK groceries and export product IDs, brands, pack sizes, regional prices, unit prices, promotions, taxonomy, ratings, images, source URLs, and optional store availability.

- **URL**: https://apify.com/automation-lab/asda-grocery-products-prices.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Asda Groceries Scraper

Search **ASDA groceries** and export structured product, price, unit-price, pack-size, promotion, taxonomy, rating, image, and source records.

The Actor reads ASDA's public grocery catalog search rather than challenged storefront HTML. It is designed for repeatable assortment and price analysis across England, Northern Ireland, Scotland, and Wales.

### What does Asda Groceries Scraper do?

Provide one or more grocery search terms and the Actor returns normalized products from ASDA UK.

Each result can include:

- ASDA product and internal IDs;
- product name and brand;
- current regional price in GBP;
- numeric and formatted unit price;
- pack size;
- source offer label and normalized promotion flag;
- grocery category, department, aisle, and shelf;
- image and canonical product URLs;
- rating and rating count;
- store-specific availability when you supply an ASDA store ID.

The default dataset is ready for JSON, CSV, Excel, API, webhook, or data-warehouse workflows.

### Who is this ASDA grocery data for?

#### Grocery price analysts

Build a consistent product and price feed for recurring basket comparisons.

#### FMCG and retail teams

Track branded assortment, pack sizes, shelf placement, and promotion signals.

#### Marketplace and comparison products

Populate structured records with stable product IDs, source URLs, and regional prices.

#### Data engineers

Schedule searches and send typed rows into spreadsheets, databases, or BI pipelines.

### Why use this Actor?

- **HTTP-first extraction:** no browser is launched for every page.
- **Regional pricing:** select England, Northern Ireland, Scotland, or Wales.
- **Useful taxonomy:** preserve category, department, aisle, and shelf context.
- **Stable deduplication:** duplicate products across search terms are saved once by ASDA product ID.
- **Bounded runs:** choose a maximum from 1 to 5,000 products.
- **Explicit failure behavior:** upstream authentication or response-shape changes fail the run instead of producing a misleading empty success.

### What ASDA product data is extracted?

| Field | Meaning |
| --- | --- |
| `query` | Search term that first produced the record |
| `productId` | Stable ASDA catalog/CIN product ID |
| `internalId` | Secondary internal product identifier when exposed |
| `name` | Product name |
| `brand` | Product brand |
| `packSize` | Pack-size label |
| `price` | Current price in GBP for the selected zone |
| `priceZone` | `EN`, `NI`, `SC`, or `WA` |
| `unitPrice` | Numeric price per unit when exposed |
| `unitPriceFormatted` | Source label such as `77.0p/LT` |
| `offer` | Source offer label, such as `List` or `Dropped` |
| `onPromotion` | Normalized promotion flag |
| `available` | Store availability, or `null` without applicable store data |
| `category` | Top-level grocery category |
| `department` | Primary grocery department |
| `aisle` | Primary aisle |
| `shelf` | Primary shelf |
| `imageUrl` | ASDA image URL when exposed |
| `productUrl` | Canonical ASDA product URL |
| `rating` | Average customer rating when exposed |
| `ratingCount` | Number of ratings when exposed |
| `scrapedAt` | Collection timestamp in ISO 8601 format |

Fields that ASDA does not expose for a product are returned as `null`; they are not guessed.

### How to scrape ASDA groceries

1. Open the Actor input page.
2. Add one to twenty product searches, such as `milk`, `bread`, or `Heinz baked beans`.
3. Set the maximum number of unique products.
4. Select the ASDA regional price zone.
5. Optionally add a numeric ASDA store ID for availability.
6. Click **Start**.
7. Open the **ASDA products** dataset view or export the results.

A first run with the prefilled `milk` search normally returns useful data in seconds.

### Input reference

#### `queries`

Required array of 1–20 strings.

Each search must contain 2–100 characters. Results from all searches are deduplicated by product ID.

```json
["milk", "bread", "eggs"]
```

#### `maxItems`

Maximum unique products saved across all searches.

- minimum: `1`
- maximum: `5000`
- default: `20`

#### `priceZone`

Regional ASDA price set.

| Value | Region |
| --- | --- |
| `EN` | England |
| `NI` | Northern Ireland |
| `SC` | Scotland |
| `WA` | Wales |

#### `storeId`

Optional 3–8 digit ASDA store ID.

When the catalog exposes stock for that store, `available` is `true` for positive stock and `false` for zero stock. Without a matching store entry, `available` remains `null`.

### Example input

```json
{
  "queries": ["milk", "bread", "eggs"],
  "maxItems": 30,
  "priceZone": "EN"
}
```

For a brand-specific check:

```json
{
  "queries": ["Heinz baked beans"],
  "maxItems": 25,
  "priceZone": "EN"
}
```

### Example output

The following shape comes from the current public catalog route:

```json
{
  "query": "milk",
  "productId": "165468",
  "internalId": "20504",
  "name": "British Milk Semi Skimmed 4 Pints",
  "brand": "ASDA",
  "packSize": "4 PINT",
  "price": 1.75,
  "currency": "GBP",
  "priceZone": "EN",
  "unitPrice": 0.76991,
  "unitPriceFormatted": "77.0p/LT",
  "offer": "List",
  "onPromotion": false,
  "available": null,
  "storeId": null,
  "category": "Chilled Food",
  "department": "Milk, Butter, Cream & Eggs",
  "aisle": "Fresh Milk",
  "shelf": "Semi Skimmed Milk",
  "imageUrl": "https://ui.assets-asda.com/dm/asdagroceries/20337087",
  "productUrl": "https://www.asda.com/groceries/product/british-milk-semi-skimmed-4-pints/165468",
  "rating": 4.1768,
  "ratingCount": 1041,
  "scrapedAt": "2026-08-18T06:12:51.362Z"
}
```

Prices, offers, stock, ratings, and assortment can change between runs.

### How much does it cost to scrape ASDA grocery products?

The Actor uses pay-per-event pricing:

- one `start` event per run;
- one `item` event for each unique product saved.

The current start event is **$0.005 per run**. Item prices decrease by Apify plan tier:

| Tier | Price per product |
| --- | ---: |
| FREE | $0.002668 |
| BRONZE | $0.002320 |
| SILVER | $0.0018096 |
| GOLD | $0.001392 |
| PLATINUM | $0.000928 |
| DIAMOND | $0.0006496 |

At the FREE tier, 100 saved products cost about **$0.27** including the start event. A 1,000-product run costs about **$2.67**. Platform usage limits and any account-level charges are shown by Apify before and during the run.

You are charged only for normalized products accepted for output. Duplicate or malformed source records are not item events.

### Monitoring ASDA prices and assortment

Use an Apify schedule to rerun the same input daily or weekly.

A practical workflow is:

1. choose stable search terms for a category or brand;
2. keep `priceZone` constant between runs;
3. export `productId`, `price`, `unitPriceFormatted`, `onPromotion`, and taxonomy fields;
4. compare records by `productId` and collection date;
5. alert on new products, removed products, or changed price values.

The Actor returns current observations. It does not calculate historical changes inside a single run.

### Spreadsheet and data-pipeline integrations

#### Google Sheets

Use an Apify integration or export the default dataset as CSV or XLSX.

#### Webhooks

Attach a run-succeeded webhook and pass the default dataset ID to your processing service.

#### Database loading

Read JSON rows from the dataset API and upsert by `productId` plus `priceZone`.

#### BI dashboards

Schedule the Actor and ingest dated snapshots into BigQuery, Snowflake, PostgreSQL, or another warehouse.

### Run with the Apify API

Replace `YOUR_APIFY_TOKEN` with your token.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~asda-grocery-products-prices/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"queries":["milk","bread"],"maxItems":50,"priceZone":"EN"}'
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/asda-grocery-products-prices').call({
  queries: ['milk', 'bread'],
  maxItems: 50,
  priceZone: 'EN',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("automation-lab/asda-grocery-products-prices").call(run_input={
    "queries": ["milk", "bread"],
    "maxItems": 50,
    "priceZone": "EN",
})

items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### Use with MCP and AI agents

#### Claude Code setup

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/asda-grocery-products-prices"
```

#### Claude Desktop setup

Add this HTTP server to your Claude Desktop MCP configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/asda-grocery-products-prices"
    }
  }
}
```

#### Cursor setup

Add the same `apify` server URL under **Cursor Settings → MCP**.

#### VS Code setup

Add the same `apify` HTTP server to the MCP servers section in your VS Code workspace or user configuration.

Example prompts:

- “Search ASDA for milk, bread, and eggs and return 50 current England price records.”
- “Export Heinz baked beans sold by ASDA with pack size, unit price, and promotion state.”
- “Collect 100 gluten-free ASDA products for my weekly assortment snapshot.”

### Limits and source behavior

- The Actor searches groceries, not ASDA George clothing or general merchandise.
- Results follow the public catalog's current ranking and field availability.
- `maxItems` is a total cap across all queries, not a per-query cap.
- Products matching several queries are emitted once.
- Availability is meaningful only when a valid store ID maps to source stock data.
- A search with no matches succeeds with zero items.
- A blocked, unauthorized, or malformed catalog response fails the run visibly.
- The public storefront search configuration can change; a future key or schema rotation may require an Actor update.

### Troubleshooting

#### Why did my run return fewer products than `maxItems`?

The search may expose fewer unique products, or several queries may overlap. `maxItems` is a ceiling, not a guaranteed count.

#### Why is `available` null?

No store ID was supplied, the ID was not present in that product's stock map, or ASDA did not expose store stock for the item.

#### Why does a product have a null price?

ASDA may expose the product without a price for the selected region. The Actor preserves that absence rather than copying another region's value.

#### Why did the run fail instead of returning an empty dataset?

A catalog authentication or response-shape error is not a real no-result search. Failing visibly prevents monitoring systems from treating an upstream break as an empty assortment.

### Responsible use and legality

This Actor collects publicly exposed product catalog data. You are responsible for using it lawfully and in accordance with applicable terms, database rights, competition rules, privacy law, and your contractual obligations.

Use conservative schedules, request only data needed for your purpose, and do not use results to mislead consumers. Product data can change; verify critical decisions against the current source.

This Actor is not affiliated with or endorsed by ASDA. ASDA and related marks belong to their respective owners.

### Related Actors

For Canadian grocery assortment and competitor-price workflows, see [Superstore & No Frills Grocery Prices](https://apify.com/automation-lab/superstore-no-frills-grocery-prices).

### FAQ

#### Does this scrape every ASDA product automatically?

No. It searches the public catalog using your terms and stops at `maxItems`. Use distinct, relevant queries for broader coverage.

#### Can I choose a UK region?

Yes. Select England, Northern Ireland, Scotland, or Wales with `priceZone`.

#### Can I target a specific store?

Yes, when you know its numeric ASDA store ID. The Actor reports availability only where the source exposes stock for that store.

#### Does it download product images?

No. It returns image URLs, avoiding unnecessary transfer and storage cost.

#### Does it track history?

It returns current snapshots. Schedule repeated runs and compare rows externally by `productId` and date.

#### Can I export CSV or Excel?

Yes. Use the dataset export controls or API formats provided by Apify.

#### Is a proxy required?

No. The implemented public catalog route works directly and does not use residential proxy transfer.

# Actor input Schema

## `queries` (type: `array`):

One to twenty ASDA grocery search terms, such as milk, Heinz baked beans, or gluten free bread. Results are deduplicated by ASDA product ID.

## `maxItems` (type: `integer`):

Maximum number of unique products saved across all searches.

## `priceZone` (type: `string`):

Regional price set: England, Northern Ireland, Scotland, or Wales.

## `storeId` (type: `string`):

A 3-8 digit ASDA store ID. When supplied and exposed for a product, the output includes store-specific availability. Leave empty for catalog and regional price monitoring.

## Actor input object example

```json
{
  "queries": [
    "milk"
  ],
  "maxItems": 20,
  "priceZone": "EN"
}
```

# Actor output Schema

## `overview` (type: `string`):

Open normalized products in the overview dataset view.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "milk"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/asda-grocery-products-prices").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "queries": ["milk"] }

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/asda-grocery-products-prices").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "milk"
  ]
}' |
apify call automation-lab/asda-grocery-products-prices --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/asda-grocery-products-prices"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/8pCqVYa2PlnoZYME7/builds/eXlfY1b7JPFOSg6kb/openapi.json
