# Loblaws & No Frills Grocery Prices Scraper – Store-Level CAD (`loudtzu/loblaws-grocery-prices`) Actor

Grocery prices from all 14 Loblaw banners (Loblaws, No Frills, Superstore, Maxi...) at any of 1,100+ stores: sale and unit price, deals, PC Optimum points when offered, stock. $0.0005/product.

- **URL**: https://apify.com/loudtzu/loblaws-grocery-prices.md
- **Developed by:** [LOUDTZU TZULOUD](https://apify.com/loudtzu) (community)
- **Categories:** Business, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Loblaws & No Frills Grocery Prices Scraper – Store-Level CAD

Exports grocery prices from the PC Express websites of all 14 Loblaw banners, for the store you pick: Loblaws, No Frills, Real Canadian Superstore, Atlantic Superstore, Dominion, Your Independent Grocer, Extra Foods, Maxi, Provigo, Wholesale Club, Valu-mart, Zehrs, Fortinos and Independent City Market. More than 1,100 stores are included.

### What it returns

For each product: name, brand, link, **price at that store in CAD**, regular price when on sale, package size, unit price (for example `$0.28/100ml`), sold by each or by weight, deal type and text with its end date, PC Optimum member price and bonus points when offered, low-stock flag, sponsored flag, badge, description and image, plus the store's name, city, province and postal code.

### How to use

1. Add search terms, for example `milk`, `eggs`, `chicken breast`.
2. Pick the **banner**.
3. Choose the store in one of three ways:
   - **Store number**: the 4-digit store number from the banner website.
   - **Postal code**: picks the store of that banner whose postal code shares the most leading characters with yours. This is a quick match, not a distance search.
   - **City**: picks a store of that banner in that city.
     With none of these, the banner's first listed store is used, and the log shows which store was used.
4. Choose English or French and set **Max products**.

### Input

| Field | Description |
|---|---|
| `keywords` | Search terms |
| `banner` | `loblaw`, `nofrills`, `superstore`, `rass` (Atlantic Superstore), `dominion`, `independent`, `extrafoods`, `maxi`, `provigo`, `wholesaleclub`, `valumart`, `zehrs`, `fortinos`, `independentcitymarket` |
| `storeId` / `postalCode` / `city` | Which store (see above) |
| `language` | `en` or `fr` |
| `maxItems` | Total products (default 100, up to 50,000) |
| `maxItemsPerQuery` | Optional fixed limit per search term |
| `fetchAll` | Save everything, up to 50,000 |
| `skipSponsored` | Leave out sponsored placements (not charged) |
| `proxyConfiguration` | Canadian residential proxy by default |

### Output

`productId`, `articleNumber`, `name`, `brand`, `url`, `price`, `wasPrice`, `memberOnlyPrice`, `currency`, `packageSize`, `unitPrice`, `soldBy`, `unit`, `isWeighted`, `dealType`, `dealText`, `dealExpiry`, `pcOptimumPoints`, `stockStatus`, `stockIndicator`, `isSponsored`, `badge`, `environmentalFee`, `description`, `image`, `banner`, `storeId`, `storeName`, `storeCity`, `storeProvince`, `storePostalCode`, `searchQuery`, `language`, `page`, `position`.

Example:

```json
{"productId": "21425018_EA", "name": "Purfiltre Partially Skimmed Milk 1%", "brand": "Lactantia", "price": 5.5, "wasPrice": 6.35, "packageSize": "2 l", "unitPrice": "$0.28/100ml", "dealType": "SALE", "dealText": "SAVE $0.85", "dealExpiry": "2026-11-11T00:00:00Z", "stockStatus": "Low Stock", "storeName": "Loblaws Bullock Drive", "storeCity": "Markham"}
```

### Fill rates in test runs

50 products (30 from Loblaws store 1032 in English for milk and eggs, 20 from a Maxi store in Montréal in French for lait): `price`, `name`, `brand`, `packageSize`, `unitPrice`, `soldBy`, `image` and all store fields were filled for every product. `badge` 42/50, `description` 47/50, `dealType`/`dealText` 14/50 and `dealExpiry` 13/50 (only items with a deal), `wasPrice` 11/50 (only items on sale), `stockStatus` 4/50 (only low-stock items). Counts vary from day to day with the stores' deals. `memberOnlyPrice`, `pcOptimumPoints` and `environmentalFee` were 0/50.

### Limits

- **Search-result data only.** No UPC barcodes, nutrition facts or ingredients.
- `stockStatus` is only filled for low or out-of-stock items; it is empty when the item is in stock.
- `memberOnlyPrice`, `pcOptimumPoints` and `environmentalFee` are only filled when the store has such an offer or fee, which is uncommon.
- Prices are the store's online pickup prices on the banner's PC Express website; in-store shelf prices can differ.
- An unknown banner, store number, postal code or city fails the run with a message in the `ERRORS` record; nothing is saved or charged. Searches that are blocked after 6 retries (each on a new Canadian residential IP and browser fingerprint) are listed in `ERRORS` and not charged. If no products are saved, the run is marked failed.
- No personal data is collected.

### Pricing

$0.0005 per product saved (pay per event). No start fee.

### Other Loblaw grocery Actors on Apify

Prices checked on the Apify Store on Oct 23, 2026. "Break-even" is the number of products from which this Actor costs less per run: it has no start fee and the lowest per-product price, so it is cheaper from the first product on every plan.

| Actor | Price per product | Start fee per run | Break-even | Notes |
|---|---|---|---|---|
| yugenox/loblaws-grocery-scraper | $0.00069 | $0.0002 | 1 | 12 banners, store by postal code, 67 fields including UPC barcode |
| sunny_eternity/loblaws-grocery-scraper | Free $0.001, Bronze $0.0009, Silver $0.0008, Gold and up $0.0007 | $0.00005 | 1 | 12 banners; most users |
| sunny_eternity/canada-grocery-price-comparison | $0.0015, plus Free $0.05, Bronze $0.04833, Silver $0.04667, Gold and up $0.045 per retailer search | $0.00005 | 1 | Compares 16 grocery chains |
| gratifying_graph/canada-grocery-deals | $0.002 per deal, plus $0.02 per API call | $0.0005 | 1 | Flyer deals from several chains, not full catalogues |
| lentic_clockss/instacart-scraper | Free and Bronze $0.003, Silver $0.0026, Gold $0.0022, Platinum $0.002, Diamond $0.0016 | $0.005 | 1 | Instacart prices |
| yugenox/instacart-grocery-scraper | $0.002 | $0.005 | 1 | Instacart store prices, including Loblaws |
| This Actor | $0.0005 | none | – | |

If you need UPC barcodes or nutrition data, yugenox/loblaws-grocery-scraper returns them.

# Actor input Schema

## `keywords` (type: `array`):

Products to search for, e.g. milk, eggs, bread.

## `banner` (type: `string`):

Which Loblaw chain to search.

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

4-digit store number (shown in the store page URL on the banner website). Prices and stock are for this store. Leave empty to use Postal code or City.

## `postalCode` (type: `string`):

Used when Store number is empty: picks the store of this banner whose postal code matches yours most closely (same first letters). Not a distance search.

## `city` (type: `string`):

Used when Store number and Postal code are empty: picks a store of this banner in this city.

## `language` (type: `string`):

Language of names and descriptions.

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

Total products to save across all search terms (split evenly).

## `maxItemsPerQuery` (type: `integer`):

Optional fixed limit per search term. 0 = split Max products evenly.

## `fetchAll` (type: `boolean`):

Ignore Max products and save everything (up to 50,000).

## `skipSponsored` (type: `boolean`):

Leave out products marked Sponsored (not charged).

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

Canadian residential proxy is the default.

## Actor input object example

```json
{
  "keywords": [
    "milk",
    "eggs"
  ],
  "banner": "loblaw",
  "language": "en",
  "maxItems": 100,
  "fetchAll": false,
  "skipSponsored": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CA"
  }
}
```

# Actor output Schema

## `products` (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 = {
    "keywords": [
        "milk",
        "eggs"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "CA"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("loudtzu/loblaws-grocery-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 = {
    "keywords": [
        "milk",
        "eggs",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "CA",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("loudtzu/loblaws-grocery-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 '{
  "keywords": [
    "milk",
    "eggs"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CA"
  }
}' |
apify call loudtzu/loblaws-grocery-prices --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,loudtzu/loblaws-grocery-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/i1j4kgymCd05vopQd/builds/cqLzndX8wjsqIxYdN/openapi.json
