# Sainsburys Grocery Scraper (`parseforge/sainsburys-grocery-scraper`) Actor

Search Sainsburys groceries by keyword or price range for listings across the UK online store. Each product returns the title, brand, price, unit price, sku, and image. Handy for grocery price comparison, tracking promotions, or monitoring how prices shift over time.

- **URL**: https://apify.com/parseforge/sainsburys-grocery-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.69 / 1,000 results

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 🛒 Sainsburys Grocery Product Scraper

> 🚀 **Export Sainsburys Grocery product listings in seconds. title, price, image, SKU, brand, unit price, direct to spreadsheet or warehouse.**

> 🕒 **Last updated:** 2026-06-05 · **📊 Multiple fields** per record · Full Sainsburys Grocery catalog coverage · groceries, fresh food, household, beauty

The Sainsburys Grocery Product Scraper turns any Sainsburys Grocery category page or search results page into a clean, structured dataset. Provide a category URL or a keyword query, and the scraper paginates through product cards, parses inline structured data, and emits one row per product.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| 🛒 Price intelligence teams | Track Sainsburys Grocery pricing across categories |
| 📊 Retail analysts | Benchmark UK retail market |
| 🏷️ Brand managers | Monitor SKU availability and pricing |
| 🤖 ML engineers | Build product catalog training sets |
| 📰 Consumer journalists | Verify retail pricing for stories |
| 👩‍💻 Developers | Mirror Sainsburys Grocery data into custom apps |

### 📋 What the Sainsburys Grocery Scraper does

- Accepts a Sainsburys Grocery category URL or free-text search query.
- Paginates through results, parsing inline structured data.
- Extracts core product fields, title, price, image, SKU, brand, unit price.
- Casts numeric fields so values land cleanly in BI tools.
- Pushes one row per product, with a scrape timestamp.

> 💡 **Why it matters:** Retail pricing shifts fast. A structured feed lets you spot stockouts, promo windows, and competitive moves at scale.

### 🎬 Full Demo

_🚧 Coming soon._

### ⚙️ Input

<table>
<tr><th>Field</th><th>Type</th><th>Required</th><th>Description</th></tr>
<tr><td><code>startUrl</code></td><td>string</td><td>No</td><td>Sainsburys Grocery category URL.</td></tr>
<tr><td><code>searchQuery</code></td><td>string</td><td>No</td><td>Keyword search instead of category.</td></tr>
<tr><td><code>maxItems</code></td><td>integer</td><td>No</td><td>Free users get 10, paid users up to 1,000,000.</td></tr>
<tr><td><code>minPrice</code> / <code>maxPrice</code></td><td>integer</td><td>No</td><td>Price band in GBP.</td></tr>
<tr><td><code>sort</code></td><td>enum</td><td>No</td><td>relevance, price low to high, price high to low, best rated, newest.</td></tr>
</table>

**Example 1, category browse:**
`
{
  "startUrl": "https://www.sainsburys.co.uk/shop/gb/groceries/fruit-veg",
  "maxItems": 50,
  "sort": "price_asc"
}
`

**Example 2, search query:**
`
{
  "searchQuery": "popular item",
  "maxItems": 25
}
`

> ⚠️ **Good to Know:** Sainsburys Grocery applies bot defenses on heavy concurrency. Keep concurrency modest and consider Apify residential proxies for larger jobs.

### 📊 Output

Each record is a flat object. imageUrl is always first, error is always last.

| Field | Type | Description |
|---|---|---|
| 🖼️ imageUrl | string | Primary product image. |
| 📝 	itle | string | Product display name. |
| 💰 price | number | Price in GBP. |
| 💱 currency | string | GBP. |
| 🏷️ rand | string | Manufacturer. |
| 🔖 sku | string | Sainsburys Grocery SKU. |
| ⭐ ating | number | Average customer rating. |
| 🔗 url | string | Product page URL. |
| 🕒 scrapedAt | string | ISO timestamp. |
| ❌ error | string | Populated only on failure. |

### ✨ Why choose this Actor

| 🌍 | Full Sainsburys Grocery catalog coverage out of the box. |
| 🧹 | Clean column names, ready for BI tools. |
| 🔢 | Numeric casting so pivots just work. |
| 🛟 | Graceful error rows instead of crashes. |
| 💾 | Native dataset export. |

### 📈 How it compares to alternatives

| Approach | Setup time | Clean schema | Pagination | Anti-bot |
|---|---|---|---|---|
| Roll your own | 1 day+ | ❌ | manual | ❌ |
| Generic browser tool | hours | partial | partial | partial |
| **This Actor** | 5 sec | ✅ | ✅ | ✅ |

### 🚀 How to use

1. Click **Try for free**.
2. Paste a Sainsburys Grocery category URL or a search query.
3. Pick a price band or sort order if needed.
4. Click **Start**. Within seconds your dataset is ready.

### 💼 Business use cases

**📊 Competitive pricing.** Track Sainsburys Grocery prices vs competitors for the same SKU.

**📦 Stockout monitoring.** Daily snapshots reveal supplier shortages early.

**🏷️ Brand audit.** Filter by brand, monitor catalog placement.

**🤖 Catalog ML.** Build product embeddings, image to title alignment.

### 🔌 Automating Sainsburys Grocery Scraper

- **Make and Zapier**, trigger runs on schedule, push to Airtable, Google Sheets, Slack.
- **Cron schedule**, native Apify scheduler.
- **Webhooks**, POST when each run finishes.
- **Warehouse**, native connectors for BigQuery, Snowflake, Postgres.

### 🌟 Beyond business use cases

**🎓 Research.** Track consumer prices over time.

**🧪 Personal.** Build a price drop alert for an item you want.

**🤝 Open data.** Publish public dashboards of retail trends.

**🧰 Tinkering.** Spin up a feed in 5 seconds to test a chart library.

### 🤖 Ask an AI assistant about this scraper

Paste this README into ChatGPT, Claude, or any AI assistant and ask it to map your workflow to the actor inputs.

### ❓ Frequently Asked Questions

**❓ Does it need a Sainsburys Grocery account?** No, only public listings are scraped.

**❓ Can I filter by brand?** Use the search query or a brand-specific category URL.

**❓ Which currencies?** GBP only.

**❓ Will images be full resolution?** The primary listing image URL is returned.

**❓ Can I schedule runs?** Yes, native Apify scheduler.

**❓ Is the data normalized?** Yes, prices are cast to numbers.

**❓ Will the schema change?** Core fields are stable.

**❓ Are export formats flexible?** All Apify dataset formats.

**❓ Is it legal?** Only public data is collected, you are responsible for ToS compliance.

**❓ Does pagination stop automatically?** Yes, on maxItems or empty page.

### 🔌 Integrate with any app

Apify ships native integrations with Make, Zapier, Slack, Discord, Google Drive, Google Sheets, Gmail, Airbyte, Keboola, Telegram, GitHub, and any REST or webhook endpoint.

### 🔗 Recommended Actors

| Actor | What it does |
|---|---|
| [ParseForge Darty France Scraper](https://apify.com/parseforge/darty-france-scraper) | French electronics retailer. |
| [ParseForge Leroy Merlin France Scraper](https://apify.com/parseforge/leroy-merlin-france-scraper) | French home improvement. |
| [ParseForge OBI Germany Scraper](https://apify.com/parseforge/obi-de-scraper) | German DIY giant. |
| [ParseForge Tesco Groceries Scraper](https://apify.com/parseforge/tesco-groceries-scraper) | UK grocery leader. |

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for 900+ production-grade scrapers across business intelligence, real estate, e-commerce, sports, finance, and public records.

---

**Disclaimer:** This actor scrapes only publicly available data. ParseForge is not affiliated with, endorsed by, or sponsored by any of the third-party services referenced. Users are responsible for complying with the target site's terms of service and applicable law. [Create a free account w/ $5 credit](https://console.apify.com/sign-up?fpr=vmoqkp).

# Actor input Schema

## `startUrl` (type: `string`):

Sainsburys category or search results URL. Example, https://www.sainsburys.co.uk/shop/gb/groceries/fruit-veg
## `maxItems` (type: `integer`):

Free users, limited to 10 items (preview). Paid users, optional, max 1,000,000.
## `searchQuery` (type: `string`):

Optional keyword search instead of category URL. Whitespace will be trimmed.
## `minPrice` (type: `integer`):

Lower price bound in GBP.
## `maxPrice` (type: `integer`):

Upper price bound in GBP.
## `sort` (type: `string`):

Result ordering applied by Sainsburys.

## Actor input object example

```json
{
  "startUrl": "https://www.sainsburys.co.uk/shop/gb/groceries/fruit-veg",
  "maxItems": 10,
  "sort": "relevance"
}
````

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "startUrl": "https://www.sainsburys.co.uk/shop/gb/groceries/fruit-veg",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/sainsburys-grocery-scraper").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 = {
    "startUrl": "https://www.sainsburys.co.uk/shop/gb/groceries/fruit-veg",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/sainsburys-grocery-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "startUrl": "https://www.sainsburys.co.uk/shop/gb/groceries/fruit-veg",
  "maxItems": 10
}' |
apify call parseforge/sainsburys-grocery-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=parseforge/sainsburys-grocery-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Sainsburys Grocery Scraper",
        "description": "Search Sainsburys groceries by keyword or price range for listings across the UK online store. Each product returns the title, brand, price, unit price, sku, and image. Handy for grocery price comparison, tracking promotions, or monitoring how prices shift over time.",
        "version": "0.1",
        "x-build-id": "4JOXFvyEUKpstahcY"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~sainsburys-grocery-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-sainsburys-grocery-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/parseforge~sainsburys-grocery-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-sainsburys-grocery-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/parseforge~sainsburys-grocery-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-sainsburys-grocery-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrl": {
                        "title": "Start URL",
                        "type": "string",
                        "description": "Sainsburys category or search results URL. Example, https://www.sainsburys.co.uk/shop/gb/groceries/fruit-veg"
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users, limited to 10 items (preview). Paid users, optional, max 1,000,000."
                    },
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Optional keyword search instead of category URL. Whitespace will be trimmed."
                    },
                    "minPrice": {
                        "title": "Minimum price (GBP)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Lower price bound in GBP."
                    },
                    "maxPrice": {
                        "title": "Maximum price (GBP)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Upper price bound in GBP."
                    },
                    "sort": {
                        "title": "Sort order",
                        "enum": [
                            "relevance",
                            "price_asc",
                            "price_desc",
                            "rating",
                            "newest"
                        ],
                        "type": "string",
                        "description": "Result ordering applied by Sainsburys.",
                        "default": "relevance"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
