# SuperValu Ireland Scraper — Groceries & Prices (`studio-amba/supervalu-ie-scraper`) Actor

Scrape the SuperValu Ireland groceries catalogue: product names, EUR prices, unit prices, discounts, brands, stock status, images and full category paths. Search by keyword, scrape one category, or walk the whole catalogue. No login, no cookies.

- **URL**: https://apify.com/studio-amba/supervalu-ie-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

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

## SuperValu Ireland Groceries Scraper

Scrape SuperValu Ireland's grocery range: product names, EUR prices, unit prices, was-prices/discounts, brands, stock status, images, descriptions and full category paths. Search by keyword, scrape one category, or pull a default slice of the catalogue. No login, no cookies.

### Why use this actor?

SuperValu is Ireland's #1 grocer by market share — bigger than Tesco, Dunnes or Aldi in the Irish market. Its online catalogue is one of the largest structured grocery price datasets in Ireland. This actor gives you a clean, structured feed for price monitoring, competitor benchmarking, product matching, market basket research, or building a grocery price comparison. You get the same data shop.supervalu.ie shows shoppers, without needing an account or a delivery slot.

**Fast keyword search and full category coverage, both first-class.** Free-text search hits SuperValu's own public search API directly. Category runs page the same underlying API by category id, using the verified `take=100` request ceiling (the site's own frontend only ever requests 30 at a time — this actor gets the same data in a third of the requests).

**No category-tree walking needed.** shop.supervalu.ie publishes a full `sitemap.xml` listing every one of its 844 leaf grocery categories, each carrying its category id in the URL. Leave the input empty and the actor pulls category ids straight from that sitemap instead of guessing or drilling a department hierarchy — a default `{}` run always returns data.

SuperValu runs on the mi9 Retail (formerly Mercatus) commerce platform. Its Cloudflare front door only filters on User-Agent — a normal browser User-Agent clears it completely, no residential proxy or browser-automation workaround required, so this actor is fast and cheap to run at scale.

### How to scrape SuperValu data

1. Add this actor to your Apify account.
2. Choose what to scrape:
   - Set `searchQuery` to scrape a keyword, e.g. `milk` or `bread`.
   - Set `categoryId` to scrape one category — either the code from the URL (e.g. `O200635` from `.../spirits-liqueurs-id-O200635`) or the full category page URL.
   - Or paste a list of category page URLs into `startUrls`.
   - Leave everything empty and the actor pulls a default slice from the site's full category list (via `sitemap.xml`).
3. Set `maxProducts` to cap the run (default 100, prefilled 20 for a quick test). Set it high, e.g. `50000`, for a full-catalogue pull.
4. Run the actor. Results stream to the dataset and can be exported as JSON, CSV, Excel or fed to an API.

Every category run reports SuperValu's own authoritative product total for that category and pages through it with `take=100` until it's fully covered; a self-checking completeness assertion compares the distinct products actually captured against that total (>=97% required) so a truncated pull never looks like a full one. Products are deduped globally by SKU, since the same item can appear under more than one category.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQuery` | String | No | Search SuperValu Ireland groceries by keyword |
| `categoryId` | String | No | A SuperValu category id (e.g. `O200635`) or full category URL |
| `startUrls` | Array | No | One or more SuperValu category page URLs |
| `maxProducts` | Integer | No | Maximum products to return (default 100) |
| `requestDelaySecs` | Integer | No | Minimum pause between API calls (not required for correctness — no rate limiting observed) |
| `proxyConfiguration` | Object | No | Proxy settings. Apify's automatic proxy is sufficient — no residential group needed |

#### Example input

```json
{
    "searchQuery": "milk",
    "maxProducts": 100
}
```

Or a category run:

```json
{
    "categoryId": "O200635",
    "maxProducts": 500
}
```

### Output

| Field | Type | Example | Description |
|-------|------|---------|-------------|
| `name` | String | `Avonmore Low Fat Super Milk (1.75 L)` | Product name |
| `brand` | String | `Avonmore` | Brand name |
| `price` | Number | `2.95` | Current shelf price in EUR |
| `currency` | String | `EUR` | Always EUR |
| `originalPrice` | Number | `26.00` | Was-price, present only when the item is discounted |
| `pricePerUnit` | String | `€1.69/l` | Unit price |
| `discount` | String | `Only €20` | Discount/offer label, present only when the item is on sale |
| `sku` | String | `1183884001` | SuperValu product SKU |
| `productId` | String | `1183884001` | SuperValu product id (same value as SKU on this catalogue) |
| `inStock` | Boolean | `true` | Real-time availability flag |
| `productDescription` | String | `All your vitamin D needs...` | Marketing/product description text |
| `category` | String | `Grocery/Milk, Yogurt, Butter & Eggs/Fresh Milk/Protein & Omega Milks` | Full category breadcrumb |
| `imageUrl` | String | `https://images.cdn.shop.supervalu.ie/cell/1183884001_596` | Primary product image |
| `url` | String | `https://shop.supervalu.ie/sm/delivery/rsid/5550/product/1183884001` | Product page URL |
| `scrapedAt` | String | `2026-08-07T19:42:14.155Z` | Timestamp |

#### Example output

```json
{
    "name": "Avonmore Low Fat Super Milk (1.75 L)",
    "brand": "Avonmore",
    "price": 2.95,
    "currency": "EUR",
    "pricePerUnit": "€1.69/l",
    "sku": "1183884001",
    "productId": "1183884001",
    "inStock": true,
    "imageUrl": "https://images.cdn.shop.supervalu.ie/cell/1183884001_596",
    "productDescription": "All your vitamin D needs in one glass* ...",
    "category": "Grocery/Milk, Yogurt, Butter & Eggs/Fresh Milk/Protein & Omega Milks",
    "categories": ["Grocery", "Milk, Yogurt, Butter & Eggs", "Fresh Milk", "Protein & Omega Milks"],
    "url": "https://shop.supervalu.ie/sm/delivery/rsid/5550/product/1183884001",
    "scrapedAt": "2026-08-07T19:42:14.155Z"
}
```

### Cost estimate

Both search and category requests return up to 100 products per API call, and the site does not rate-limit or require Bright Data / residential proxies, so platform usage per result is low. A full-catalogue pull across all 844 categories runs in roughly 1,000-1,200 lightweight JSON requests, no browser rendering involved.

Usage cost only settles once a run reports SUCCEEDED — reading the dataset while a run is still in progress will undercount the eventual charge, so check cost after the run finishes, not mid-run.

### Limitations / known issues

- SuperValu does not expose historical prices; each run captures a snapshot (use scheduled runs to build a price history).
- No EAN/GTIN or review/rating data is exposed by SuperValu's storefront API — `sku`/`productId` are the only stable identifiers on this catalogue.
- `discount` carries the source's own promotional label text where present; not every discounted item has a promo label.
- The default (empty-input) scope pulls categories in the order the sitemap lists them, capped by `maxProducts` — set `categoryId`/`searchQuery` for a targeted pull, or raise `maxProducts` for a full sweep.
- A full-catalogue walk persists its progress and survives Apify server migrations: already-pushed products are never duplicated and completed categories are skipped on resume.

### Related scrapers

- [Tesco Ireland Groceries Scraper](https://apify.com/studio-amba/tesco-ie-scraper) — Ireland's #2 grocer
- [Ocado Scraper](https://apify.com/studio-amba/ocado-scraper) — UK online-only grocer
- [Asda Scraper](https://apify.com/studio-amba/asda-scraper) — UK grocery
- [Sainsbury's Scraper](https://apify.com/studio-amba/sainsburys-scraper) — UK grocery
- [Morrisons Scraper](https://apify.com/studio-amba/morrisons-scraper) — UK grocery

# Actor input Schema

## `searchQuery` (type: `string`):

Search SuperValu Ireland groceries by keyword (e.g., 'milk', 'bread', 'cheddar'). Search runs through SuperValu's own public search API — fast, no proxy strictly required.

## `categoryId` (type: `string`):

A SuperValu Ireland category to scrape. Either the category code from the URL (e.g. 'O200635' from .../spirits-liqueurs-id-O200635) or the full category page URL.

## `startUrls` (type: `array`):

One or more SuperValu Ireland category page URLs to scrape (must contain '-id-O######').

## `maxProducts` (type: `integer`):

Maximum number of products to return across all seeds. Set high (e.g., 30000) for a full-catalogue pull.

## `requestDelaySecs` (type: `integer`):

Minimum pause between category/search API calls. Not required for correctness (no rate limiting observed) but available for a gentler full-catalogue crawl.

## `proxyConfiguration` (type: `object`):

Proxy settings. SuperValu Ireland's Cloudflare only filters on User-Agent (verified LOW anti-bot, not blocking) — Apify's automatic proxy is sufficient, no residential group needed.

## Actor input object example

```json
{
  "searchQuery": "milk",
  "maxProducts": 20,
  "requestDelaySecs": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "searchQuery": "milk",
    "maxProducts": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/supervalu-ie-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 = {
    "searchQuery": "milk",
    "maxProducts": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/supervalu-ie-scraper").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 '{
  "searchQuery": "milk",
  "maxProducts": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/supervalu-ie-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/supervalu-ie-scraper"
        }
    }
}

```

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/iGTpk7pA5dbHnGTUf/builds/rMxSg4O9C7ZpT0xzE/openapi.json
